Menu Chiudi

Recupero sistema operativo facile

Aggiornato il 10/09/2012.

Un metodo per recuperare un sistema operativo facile e veloce utile per laboratori scolastici e computer ad accesso pubblico in generale

Aggiornato il 10/09/2012.

Un metodo per recuperare un sistema operativo facile e veloce utile per laboratori scolastici e computer ad accesso pubblico in generale

Descrizione

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.

Descrizione tecnica

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

[*] Ora non è più vero dato che esiste Partclone. Soprattutto è consigliabile passare a Partclone perché questa utility, a differenza di partimage, è correntemente sviluppata, funziona sia a 32 che 64 bit (mentre partimage funziona solo a 32bit) e (si spera) è meno bacata per le partizioni compresse.

Uso

Esempio di boot che uso nella mia scuola. Il sistema fornisce diverse opzioni:

  • Windows (predefinita)
  • Linux
  • Windows restore & poweroff
  • Windows restore & reboot
  • Windows backup & poweroff (p)
  • Windows backup & reboot (p)

[Nota: una volta usavo, erroneamente, il comando halt al posto di poweroff. Ho cambiato perché di default ora halt, correttamente, _non_ spegne più la macchina…]

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 ([1]) 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.

[1] Come mi hanno fatto notare, sarebbe preferibile installare comunque un antivirus, data la tristemente nota vulnerabilità di questi sistemi (Windows). Da notare che l’immagine salvata avrà sicuramente il database dell’antivirus non aggiornato. È quindi consigliabile effettuare un ripristino, un aggiornamento del sistema e di tutte le applicazioni sensibili dal punto di vista della sicurezza, antivirus compreso, e quindi un salvataggio dell’immagine così aggiornata, in modo da risparmiarsi futuri aggiornamenti.

Descrizione delle voci

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).

Funzionamento

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.

Passo 1: selezione al boot del runlevel

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.

RedHat e derivate

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.

Ubuntu

Le versioni di Ubuntu dalla 6.10 usano upstart, un nuovo sistema di init. Le versioni di upstart usate in Ubuntu fino alla 9.10 mancano 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.

Dalla versione di Ubuntu 9.10 in poi è invece sufficiente inserire alla riga di boot la parola “text” e il sistema grafico non partirà, perciò questa modifica e anche quella successiva per la disabilitazione della grafica nel run-level sono superflue; i punti 1 e 2 possono essere saltati tranquillamente, passare al punto 3.

Debian

Le attuali versioni di Debian, “5.0 – Lenny” e la futura “Squeeze” (ma non la sperimentale) legge 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.

Passo 2: disabilitazione ambiente grafico

Con questo passo disabilitiamo la partenza dell’ambiente grafico nel runlevel scelto per le ragioni esposte sopra. Da saltare se si usa Ubuntu dalla 9.10 in poi.

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.

RedHat e derivate

Come scritto sopra possiamo saltare questo passo dato che questo tipo di distribuzioni sono già “pronte” avendo nel runlevel 3 la grafica disabilitata.

Debian e derivate

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).

Passo 3: installazione dello script di recupero/salvataggio

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

Lo script lancia il programma che materialmente fa il recupero delle partizioni. Dato che il programma partimage attualmente non funziona a 64 bit (e neanche il suo successore partclone), lo script può funzionare ugualmente abilitando le righe concernenti ntfsclone e disabilitando (commentando) quelle con partimage, per le partizioni formattate con ntfs oppure salvando tutta la partizione senza compressione (orrendo ma funziona – occhio alla dimensione finale delle partizioni) usando il comando dd.

Io script è il seguente e si può posizionare in /root/winsysbr:

#!/bin/bash

##################
#
# Example usage boot kernel command line
#
# [...] ro quite splash winsysbr=backup,halt
#
# Commands recognited=[backup|restore],[poweroff|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 1, with GRUB 2 set manually...see below
#DRIVE=`sed -ne 's/\<boot=\(.*\)\>/\1/p' /etc/lilo.conf` #lilo
DRIVE=/dev/sda #Manually (use with GRUB 2)
WINPART=1
#echo \"$DRIVE\" ; exit #Debug

if [ "$CMDLINE" = "" ]; then
#manual start
CMDLINE="$1"
else
#Boot start:
 BOOTEXEC="open -c 8 -s -w -- "
fi

#just to be shure, unmount partition to backup
#umount ${DRIVE}${WINPART} 2>&1 >>/dev/null

case "$CMDLINE" in
*restore*)

#ntfsclone version
#${BOOTEXEC}/usr/sbin/ntfsclone --restore-image --overwrite ${DRIVE}${WINPART} /winbackup/windows

#Partimage version
#-b = batch -f3 = exit when done
#-e = fills of zeros unused sectors (use it if you want to gzip externally)
#${BOOTEXEC}/usr/sbin/partimage -b -f3 restore ${DRIVE}${WINPART} /winbackup/windows

#Partclone version
${BOOTEXEC}/usr/sbin/partclone.ntfs --ncurses --restore --source /winbackup/windows --output ${DRIVE}${WINPART}

#Reset first cilynder as new
#dd if=/dev/zero of=$DRIVE bs=512 count=1 seek=32

;;
*backup*)

#ntfsclone version
#${BOOTEXEC}/usr/sbin/ntfsclone --save-image --overwrite /winbackup/windows ${DRIVE}${WINPART}

#Partimage version
#-z0 = not compress -o = overwrite
#-b = batch -f3 = exit when done
#-V0 = one single file -d = no description
#${BOOTEXEC}/usr/sbin/partimage -z0 -o -b -f3 -V0 -d save ${DRIVE}${WINPART} /winbackup/windows

#Partclone version
${BOOTEXEC}/usr/sbin/partclone.ntfs --ncurses --clone --source ${DRIVE}${WINPART} --overwrite /winbackup/windows

;;
esac

sync

case "$CMDLINE" in
*poweroff*)
poweroff
;;
*reboot*)
reboot
;;
esac

Una volta copiato in /root ricordarsi di abilitarne l’esecuzione con il comando:

chmod +x /root/winsysbr

RedHat e derivate

yum install partimage

Debian e derivate

apt-get install partimage

NOTE:

  1. 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.
  2. 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).

Passo 5: configurazione del boot manager

Per ultimo è necessario configurare il nostro boot manager. Ecco l’esempio per GRUB 1:

/boot/grub/menu.lst

[...]
### END DEBIAN AUTOMAGIC KERNELS LIST

title Windows restore & poweroff
uuid ce3118aa-800a-496e-89d7-cc6d033d144f
kernel /vmlinuz root=UUID=ce3118aa-800a-496e-89d7-cc6d033d144f ro quiet winsysbr=restore,poweroff 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 & poweroff
uuid ce3118aa-800a-496e-89d7-cc6d033d144f
kernel /vmlinuz root=UUID=ce3118aa-800a-496e-89d7-cc6d033d144f ro quiet winsysbr=backup,poweroff 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 & poweroff
root = UUID=ce3118aa-800a-496e-89d7-cc6d033d144f
initrd = /initrd.img
append = "ro quiet locale=it_IT winsysbr=backup,poweroff 3"

[...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.

Con GRUB2 (Ubuntu 9.10 in poi) si consiglia di operare nel modo seguente:
Copiare il contenuto di /boot/grub/grub.cfg in coda al file /etc/grub/40_custom
menuentry 'Windows restore & poweroff' --class ubuntu --class gnu-linux --class gnu --class os {
           recordfail
           insmod ext2
           set root='(hd0,5)'
           search --no-floppy --fs-uuid --set 59b5a8cb-0aa1-4c16-a6e8-a46b5969af21
          linux   /vmlinuz root=UUID=59b5a8cb-0aa1-4c16-a6e8-a46b5969af21 ro quiet splash winsysbr=restore,poweroff text
initrd   /initrd.img
}
menuentry 'Windows restore & reboot' --class ubuntu --class gnu-linux --class gnu --class os {
           recordfail
           insmod ext2
           set root='(hd0,5)'
           search --no-floppy --fs-uuid --set 59b5a8cb-0aa1-4c16-a6e8-a46b5969af21
          linux   /vmlinuz root=UUID=59b5a8cb-0aa1-4c16-a6e8-a46b5969af21 ro quiet splash winsysbr=restore,reboot text
initrd   /initrd.img
}
menuentry 'Windows backup & poweroff' --class ubuntu --class gnu-linux --class gnu --class os --users root {
           recordfail
           insmod ext2
           set root='(hd0,5)'
           search --no-floppy --fs-uuid --set 59b5a8cb-0aa1-4c16-a6e8-a46b5969af21
          linux   /vmlinuz root=UUID=59b5a8cb-0aa1-4c16-a6e8-a46b5969af21 ro quiet splash winsysbr=backup,poweroff text
initrd   /initrd.img
}
menuentry 'Windows backup & reboot' --class ubuntu --class gnu-linux --class gnu --class os --users root {
           recordfail
           insmod ext2
           set root='(hd0,5)'
           search --no-floppy --fs-uuid --set 59b5a8cb-0aa1-4c16-a6e8-a46b5969af21
          linux   /vmlinuz root=UUID=59b5a8cb-0aa1-4c16-a6e8-a46b5969af21 ro quiet splash winsysbr=backup,reboot text
initrd   /initrd.img
}

Per la gestione delle password con GRUB 2 aggiungere il file seguente al file /etc/grub.d/00_header:

#to the end of file /etc/grub.d/00_header
cat << EOF
set superusers="root"
password root xxxxxx
EOF

Proteggendo la password col comando:

chmod go-rwx /etc/grub.d/00_header

E ad ogni voce con password aggiungere la stringa –users root come nell’esempio precedente di configurazione di GRUB 2.

PS: modificare la password: xxxxxx negli esempi precendenti, chiaramente, non è molto sicura!

Nota importante per chi usa computer connessi ad un dominio Windows

… come il sottoscritto, che però usa una macchina Linux+Samba :-): le immagini di macchine inserite nel dominio dopo un po’ (esattamente 30 giorni) scadranno. Come mai? Per questioni di sicurezza gli accunt macchina che vengono creati al momento dell’inserimento della macchina nel dominio, contengono una password con una scadenza. La scadenza viene dichiarata dal “client”, in questo caso Windows XP. Se la password è scaduta ci si ritroverà con un account che non riesce ad entrare nel dominio e servirà uscire e rientrare (lavorando come amministratori locali e sapendo la password di un utente amminstratore di dominio) dal dominio. Ciò è proprio seccante. Per ovviare ciò basta salvare l’immagine con l’opzione di bloccare la scadenza password dell’account macchina. Le questioni di sicurezza sono, secondo me, discutibili dato che l’intero protocollo è in chiaro…

Per fare ciò basta abilitare l’opzione:

pannello di controllo->strumenti di amministrazione->Criteri di protezione locale->Criteri locali->Opzioni di protezione->Controller di dominio: disabilitazione cambio password account computer

ovvero in inglese:

control panel->administrative tools->Local security policy->Local policies->Security options->Domain member: disable machine account password changes

E la nostra immagine salvata rimarrà per sempre nel dominio. 🙂

Conclusione

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!

Buon divertimento!

WordPress Appliance - Powered by TurnKey Linux