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
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).
Nessun commento:
Posta un commento