Problema tecnico di capodanno: il server Ubuntu 12.04 non fa più il boot e in loco ho a disposizione solo il notebook e un CD di installazione Ubuntu 10.04 i386... e una tastiera USB e un mouse USB.
Problema risolto! Ecco come ho fatto:
- avvio il server guasto dal CD della 10.04, scelgo di non installare ma di provare Ubuntu ("Try Ubuntu"), e apro una finestra terminale per vedere con
ifconfig suo indirizzo di rete locale preso dal DHCP (nel mio caso termina per 106, non è quello del server poiché abbiamo fatto il boot da CD) e per operare come root
(sudo bash) per entrare sul filesystem
ext4 del server (per fortuna dalla 10.04 LTS alla 12.04 LTS non ci sono variazioni nelle feature dell'
ext4)
- scopro che la 12.04 usa il logical volume manager
(lvm2) anche se hai una singola partizione su tutto il disco, per cui da
fdisk vedo che la root è su
/dev/sda5 ma non è ancora montabile a causa di un'opzione
lvm
- dalla finestra terminale del CD di installazione installo
lvm2 e cambio in "attive" tutte le partizioni e quindi monto la partizione di root (la
apt-get installerà il pacchetto nella ramdisk del "Try Ubuntu", per cui questa sequenza andrà ripetuta ad ogni reboot da CD):
apt-get install lvm2
vgchange -ay
mount /dev/mapper/cacatone-root /mnt
cd /mnt
- non posso fare
chroot /mnt perché dalla 10.04 alla 12.04 è cambiato qualcosa di grosso nelle librerie C o nel kernel, e quindi non riusciva ad eseguire una shell nel momento di fare il
chroot
- durante il
mount vedo che riporta la correzione di alcuni
inodes nella directory
/boot (brivido sulla schiena: è la directory dei kernel e delle initrd)... la directory
/boot risulta infatti vuota (sparito il
grub, spariti i suoi moduli, spariti i kernel e tutto il resto). Se non avessi notato con la coda dell'occhio quei messaggi avrei comunque sospettato che era qualcosa tra kernel e
grub che non andava;
- scarico da internet il CD di Ubuntu 12.04 Server e faccio l'installazione in una virtual machine di VirtualBox; una volta completata salvo in un file tutta la sua directory
/boot (quella dell'ambiente virtuale fresco di installazione e update completo) e la mando direttamente al server via secure-copy: dall'interno della VirtualBox eseguo:
tar cpzvf bootfiles.tgz /boot
scp bootfiles.tgz ubuntu@192.168.1.106:/tmp/
- non basta però scompattarla nella root del serverone perché gli
uuid sono diversi (quello della virtual machine è ovviamente creato al momento in cui ho creato la macchina virtuale) e il
grub al boot si lamenterà ugualmente di non aver trovato i files. Allora dal prompt del terminale di "Try Ubuntu" eseguo
blkid per vedere quale è l'
uuid della partizione
root del server (quella che ho ancora montata su
/mnt)
- a questo punto creo due facili link sulla root directory del server (mi serviranno dopo per
grub):
cd /mnt
ln -s boot/vmlinuz-3.2(eccetera) vmlinuz
ln -s boot/initrd-3.2(eccetera) initrd.img
e quindi faccio lo shutdown e reboot del server.
- al reboot il
grub si lamenta ovviamente di non aver trovato "il file". Scelgo allora (premendo il tasto
"e" come indica
grub) di modificare i parametri di lancio e modifico i comandi
linux e
initrd usando
/vmlinuz e
/initrd.img (i cui link rinviano ai file giusti, senza dover riscrivere tutti i numeretti) e cambiando al parametro "
root=..." la
uuid del
/dev/sda5 verificata dal
blkid di cui sopra (ahimé, riscrivendo tutti i numeretti). Premo F10 per eseguire il malloppo e...
- ...e finalmente il server riparte, anche se con la directory
/grub squinternata. Perciò occorre forzare la reinstallazione di
grub e dell'ultimo kernel: una volta terminato il boot, entrato come root, eseguo:
grub-install /dev/sda
apt-get install --reinstall linux-generic
update-grub
- e verifico infine che stavolta il server riparte regolarmente senza aver bisogno di esseri umani a smanettare e imprecare.
Felice esito!
Diagnosi e considerazioni finali:
- capita di rado (molto di rado, per la verità) che un file o una directory svaniscano nel nulla quando manca improvvisamente la corrente; stavolta era capitato sulla
/boot (questa "sparizione" non è propriamente un bug dei filesystem ma dell'hardware: quando manca la corrente, le RAM perdono il proprio contenuto molto prima che ai dischi manchi fiato per completare le
write, per cui se non venissero annullate con effetto immediato tutte le
write, in caso di black-out i dischi scriverebbero
munnezza)
- l'alternativa a tutto questo patatrac era di partire con un "Try Ubuntu 12.04", montare la
root senza dover smanazzare con
lvm2, e da lì fare
chroot /mnt e quindi il reinstall di grub e kernel (io ho dovuto fare tutta quella caciara perché avevo la 10.04 e l'installazione della 12.04 nella virtuale mi garantiva solo il primo e ultimo kernel, non necessariamente quelli in uso nel server)
- in caso di guai seri bastava spostare tutto in una directory dello stesso disco (tranne la
lost+found), installare di nuovo Ubuntu senza riformattare, e quindi recuperare da lì tutti i dati (questo è il motivo per non lasciare mai dati sparsi in giro ma concentrare tutto sotto la
/home, in modo che in caso di guai basta salvare la sola
/home e chi s'è visto s'è visto; invece c'è gente che tiene caterve di files in
/srv/www e tremila altre directories).