Un metodo per recuperare un sistema operativo facile e veloce utile per laboratori scolastici e computer ad accesso pubblico in generale
In breve si tratta di un metodo per recuperare velocemente l'intera partizione di un sistema il cui funzionamento è stato compromesso. L'operazione può essere effettuata da personale non esperto, dato che il comando può essere eseguito scegliendo da un menu al boot.
Il sistema è stato collaudato su Ubuntu e, leggermente modificato, su Debian su cui è in funzione da qualche anno. Può essere facilmente adattato a qualsiasi distribuzione in circolazione.
Il metodo fa uso di un sistema linux (qualsiasi anche se l'esempio è per Ubuntu) installato localmente e del programma partimage. Il programma partimage è stato scelto per diversi motivi:
- è software libero
- è disponibile come pacchetto precompilato sulle principali distribuzioni linux attualmente in circolazione
- è l'unico pacchetto di mia conoscenza che, malgrado non sia più sviluppato da alcuni anni, salva sia le partizioni FAT che NTFS salvando solo i blocchi effettivamente occupati, quindi ottimizzando notevolmente sia la velocità che l'occupazione su disco
Esempio di boot che uso nella mia scuola. Il sistema fornisce diverse opzioni:
- Windows (predefinita)
- Linux
- Windows restore & halt
- Windows restore & reboot
- Windows backup & halt (p)
- Windows backup & reboot (p)
le cui ultime due voci sono protette da password. Chiunque può, in qualsiasi momento, ripristinare il sistema Windows anche se completamente bloccato e inutilizzabile, ad uno stato "pulito" come appena installato. Non è quindi necessario limitare gli utenti windows né installare antivirus () dato che il ripristino sovrascrive tutta la partizione, difetti e virus compresi. I dati utente possono comunque essere memorizzati in un server di dominio Windows emulato da una macchina GNU/Linux/Samba o in una seconda partizione dati locale. Il ripristino solitamente impegna la macchina per pochi minuti, dai 3 ai 15 a seconda della velocità della macchina e della dimensione della partizione di Windows.
Le ultime 4 voci lanciano il comando "partimage" opportunamente configurato in modo da salvare e ripristinare una partizione salvata localmente su una partizione Linux. Il sitema può essere usato anche con un semplice comando cp o con le ntfsutils o per salvare/ripristinare l'utente Linux predefinito per esempio. Il limite è la fantasia... Prego notare che partimage funziona egregiamente non solo per partizioni di tipo NTFS e FAT32 ma anche ext2/3 o raw ecc. salvando solo i blocchi occupati (naturalmente eccetto per le partizioni raw).
In pratica si tratta di cambiare runlevel al boot di una distribuzione per poter bloccare l'esecuzione dell'interfaccia grafica e lanciare esclusivamente il nostro "servizio". Il servizio fa partire un salvataggio/recupero della partizione in oggetto, seguiti da uno spegnimento o un riavvio della macchina a seconda del comando impostato.
Partimage è un programma essenziale che funziona con una grafica a caratteri. La partenza dell'ambiente grafico è quindi inutile e rallenta la funzione di recupero/salvataggio delle partizioni. Con questo passo vediamo di disabilitarla nelle varie versioni di Linux selezionando un runlevel sprovvisto di ambiente grafico o che provvederemo a disabilitare alla partenza.
Per le distribuzioni tipo RedHat e derivate il runlevel 3 fa partire tutti i servizi a parte il login grafico xdm, gdm o kdm che sia. Per cui il lavoro è già stato fatto: bravi! Potete passare al passo tre.
Purtroppo le nuove versioni di Ubuntu usano upstart, un nuovo sistema di init che manca della possibilità di cambiare runlevel dalla riga dei parametri di boot, come sarebbe consuetudine (vedere man bootparam).
Per ovviare a tale inconveniente basta correggere il file /etc/event.d/rc.default.
Siccome le versioni di questo file variano leggermente da una versione ubuntu all'altra, posto il file prima e dopo ma modifica.
Versione originale:
# rc - runlevel compatibility
#
# This task guesses what the "default runlevel" should be and starts the
# appropriate script.
start on stopped rcS
script
runlevel --reboot || true
if grep -q -w -- "-s\|single\|S" /proc/cmdline; then
telinit S
elif [ -r /etc/inittab ]; then
RL="$(sed -n -e "/^id:[0-9]*:initdefault:/{s/^id://;s/:.*//;p}" /etc/inittab || true)"
if [ -n "$RL" ]; then
telinit $RL
else
telinit 2
fi
else
telinit 2
fi
end script
Versione corretta:
# rc - runlevel compatibility
#
# This task guesses what the "default runlevel" should be and starts the
# appropriate script.
start on stopped rcS
script
runlevel --reboot || true
RL=$(sed -n -e 's/\<single\>/S/' -e 's/.*\<\([0-9S]\)\>.*/\1/p' </proc/cmdline 2>/dev/null)
if [ "$RL" = "" ]; then
if [ -r /etc/inittab ]; then
RL="$(sed -n -e "/^id:[0-9]*:initdefault:/{s/^id://;s/:.*//;p}" /etc/inittab || true)"
fi
if [ "$RL" = "" ]; then
RL=2
fi
fi
telinit $RL
end script
Dopodiché il sistema sarà nuovamente in grado di cambiare runlevel al boot.
Le attuali versioni Debian (ma non la sperimentale) leggono la stringa di boot e quindi la modifica sopramenzionata non è necessaria. Per la sperimentale e per le future versioni, eseguire la procedura valida per Ubuntu.
Con questo passo disabilitiamo la partenza dell'ambiente grafico nel runlevel scelto per le ragioni esposte sopra.
Abbiamo scelto il runlevel 3 per compatibilità con le altre distribuzioni basate su RedHat ma per Debian e derivate sarebbero andati egualmente bene il 4 o il 5. Infatti in queste ultime tutti i runlevel sono equivalenti dato che fanno partire indifferentemente tutti i servizi.
Come scritto sopra possiamo saltare questo passo dato che questo tipo di distribuzioni sono già "pronte" avendo nel runlevel 3 la grafica disabilitata.
Abbiamo installato:
apt-get install sysv-rc-conf
e poi tramite questo comando abbiamo disabilitato la partenza del servizio di login grafico, kdm, gdm o xdm che siano, nel livello scelto (3).
Il programma eseguibile lo abbiamo messo in /root inserendo una riga di esecuzione in /etc/rc.local:
/root/winsysbr
prima del comando (se esiste)
exit 0
Il programma è il seguente in /root/winsysbr:
#!/bin/bash
##################
#
# Example usage boot kernel command line
#
# [...] ro quite splash winsysbr=backup,halt
#
# Commands recognited=[backup|restore],[halt|reboot]
#
##################
#Take "winsysbr=" parameters only
CMDLINE=`sed -ne 's/\<\(winsysbr=.*\)\>/\1/p' /proc/cmdline`
#Drive in object taken from grub/lilo/yaboot/etc
DRIVE=`sed -ne 's/.*\(\/dev\/.d.\)/\1/p' /boot/grub/device.map` #grub
#DRIVE=`sed -ne 's/\<boot=\(.*\)\>/\1/p' /etc/lilo.conf` #lilo
#DRIVE=/dev/hda #Manually
#echo \"$DRIVE\" ; exit #Debug
if [ "$CMDLINE" = "" ]; then
#manual start
CMDLINE="$1"
fi
if [ "$CMDLINE" = "" ]; then
exit
fi
#just to be shure, unmount partition to backup
umount ${DRIVE}1 2>&1 >>/dev/null
case "$CMDLINE" in
*restore*)
#-b = batch -f3 = exit when done
#-e = fills of zeros unused sectors (use it if you want to gzip externally)
/usr/sbin/partimage -b -f3 restore ${DRIVE}1 /winbackup/windows
#Reset first cilynder as new
#dd if=/dev/zero of=$DRIVE bs=512 count=1 seek=32
;;
*backup*)
#-z0 = not compress -o = overwrite
#-b = batch -f3 = exit when done
#-V0 = one single file -d = no description
/usr/sbin/partimage -z0 -o -b -f3 -V0 -d save ${DRIVE}1 /winbackup/windows
;;
esac
sync
case "$CMDLINE" in
*halt*)
halt
;;
*reboot*)
reboot
;;
esac
Una volta copiato in /root ricordarsi di abilitarne l'esecuzione con il comando:
chmod +x /root/winsysbr
apt-get install partimage
NOTE:
- Si raccomanda di non creare file compressi con partimage, dato che il codice che gestisce questi ultimi è bacato. Volendo è possibile usare il comando gzip o bzip2 in cascata, se proprio lo si desidera, ma si rallenta notevolmente la velocità di salvataggio della partizione.
- Si raccomanda altresì di salvare in un unico file (opzione -V0) perché il programma _non_ carica automaticamente i file spezzati. È comunque possibile farlo fare esplicitamente (man partimage).
Per ultimo è necessario configurare il nostro boot manager. Ecco l'esempio per GRUB:
/boot/grub/menu.lst
[...]
### END DEBIAN AUTOMAGIC KERNELS LIST
title Windows restore & halt
uuid ce3118aa-800a-496e-89d7-cc6d033d144f
kernel /vmlinuz root=UUID=ce3118aa-800a-496e-89d7-cc6d033d144f ro quiet winsysbr=restore,halt 3
initrd /initrd.img
quiet
title Windows restore & reboot
uuid ce3118aa-800a-496e-89d7-cc6d033d144f
kernel /vmlinuz root=UUID=ce3118aa-800a-496e-89d7-cc6d033d144f ro quiet winsysbr=restore,reboot 3
initrd /initrd.img
quiet
title Windows backup & halt
uuid ce3118aa-800a-496e-89d7-cc6d033d144f
kernel /vmlinuz root=UUID=ce3118aa-800a-496e-89d7-cc6d033d144f ro quiet winsysbr=backup,halt 3
initrd /initrd.img
quiet
password xxxxxxxxx
title Windows backup & reboot
uuid ce3118aa-800a-496e-89d7-cc6d033d144f
kernel /vmlinuz root=UUID=ce3118aa-800a-496e-89d7-cc6d033d144f ro quiet winsysbr=backup,reboot 3
initrd /initrd.img
quiet
password xxxxxxxxx
Lo stesso è possibile usando LILO:
/etc/lilo.conf
[...]
image = /boot/vmlinuz
label = Windows restore & halt
root = UUID=ce3118aa-800a-496e-89d7-cc6d033d144f
initrd = /initrd.img
append = "ro quiet locale=it_IT winsysbr=backup,halt 5"
[...ecc...]
La password serve per evitare che personale non responsabile riscriva il salvataggio con versioni "sporche" del sistema da preservare.
Si raccomanda di usare fare attenzione a:
- mantenenere lo stesso UUID delle partizioni attualmente in uso. Lo UUID è univoco, quindi quello dell'esempio è chiaramente errato e va riscritto
- mantenere lo stesso schema di partizioni di root della riga di boot
Per esempio con grub:
root (hdN,M)
dove N e M sono i valori usati dall'installazione che si è effettata precedentemente.
- modificare la password: xxxxxx chiaramente non è molto sicura!
Il suddetto sistema mi ha "salvato" innumerevoli volte risparmiandomi la fatica del recupero di un intero laboratorio scolastico in pochi minuti (poco prima di una lezione!!!)
Se lo trovate utile, per idee e/o suggerimenti, scrivete due righe sulla ml del LinuxTrent!
2009-12-29 Aggiornamento. Il suddetto metodo andava applicato con le distro ubuntu 7.* / 8.* fino alla 9.04. Dalla 9.10 si sono verificati dei cambiamenti:
- upstart è stato corretto per cui la modifica di cui sopra non serve più in quanto ora Ubuntu è in grado di leggere correttamente il runlevel al boot
- si è passati definitivamente a grub2 che costringe ad una modifica sostanziale del metodo di creazione del menu di avvio in quanto ora questo viene generato dinamicamente. Nei prossimi giorni posterò un'esempio di script funzionante per grub2 che ho già collaudato ma che non ho sottomano ora
- c'è un problema che non ho ancora risolto: non riesco a far partire la gestione della console grafica necessaria per visualizzare la barra di avanzamento di partimage. Posterò il problema nella lista del LT e (sperabilmente) la soluzione qui appena la trovo.
- le versioni a 64bit di ubuntu (ho controllato solo la 9.10) sono senza partimage. Lo script di salvataggio può però funzionare ugualmente usando ntfsclone per le partizioni formattate con ntfs oppure salvando tutta la partizione senza compressione (orrento) usando dd.
Buon divertimento!