Menu Chiudi

Boot Root filesystem su LVM

Root filesystem su LVM + kernel 2.6 = initrd

Bootare il kernel 2.6 su un sistema col filesystem di root su LVM grazie a initrd.

Root filesystem su LVM + kernel 2.6 = initrd

Bootare il kernel 2.6 su un sistema col filesystem di root su LVM grazie a initrd.

Pomeriggio uggioso, decisamente non adatto per farsi una bella sciata. Potrebbe essere l’occasione per aggiornare al kernel 2.6 (2.6.10 per la precisione) la vecchia macchina che sta in cantina. Dovrebbe essere un’operazione di routine, giusto? Aggiornare modutils, e2fsprogs e un po’ di altre cose, seguendo la documentazione del kernel [1] e poi il solito:

make menuconfig
make all
make modules_install

Sì, lo so che adesso ci sono i configuratori basati su qt e gtk, ma rimango affezionato alla vecchia interfaccia ncurses… Per finire, copiare l’immagine del kernel in /boot e rilanciare lilo. Una passeggiata. Unico dettaglio: se non ricordo male il filesystem di root è su LVM1. Ma non dovrebbe dare problemi. Spero. In ogni caso, compilo direttamente nel kernel il supporto per LVM. Ok, tutto fatto, pronti al reboot. Via, uh oh:

cannot open root device 3a00 on unknown block (58,0)

Ops, mi sa che il piccolo problema di cui sopra era tutt’altro che ininfluente. Ho bisogno di un veloce ripasso di cos’è LVM e come funziona [2]. Bene, a quanto pare basta ricordarsi di attivare i volumi logici nei vari gruppi prima di usare il filesystem… Mmmh, ma il filesystem in questione è il filesystem di root… Mmmmh, quindi, prima di montare / dovrei usare dei comandi che stanno in /sbin… Il problema dell’uovo e della gallina?

Argh, mi sa proprio che devo usare initrd [3]. E infatti, il 2.4 in funzione adesso usa proprio quello. Mi sa che non sarà esattamente una passeggiata. Teoria delle operazioni: facciamo il boot col 2.6, il kernel carica l’immagine initrd, esegue uno script presente nell’immagine con cui attiva LVM (per tradizione: linuxrc), montiamo il root filesystem, e proseguiamo normalmente. Vediamo la pratica.

Non scoraggiamoci. Il pacchetto lvm fornisce uno script che suona promettente: lvmcreate_initrd. Vediamo un po’:

$  lvmcreate_initrd 2.6.10
...
lvmcreate_initrd -- copying device files to ram disk
cpio: /tmp/mnt.1351/dev/./sdp3: No space left on device
cpio: /tmp/mnt.1351/dev/./sdp4: No space left on device

Ma quanti device crea? Decisamente troppi. No, non voglio usare devfs perciò non posso usare l’apposita opzione -D. Però forse posso modificare l’initrd creato per devfs creando a manina i device necessari. Proviamo:

$ gzip -d /boot/initrd-lvm-2.6.10.gz
$ mount -o loop /boot/initrd-lvm-2.6.10 /mnt/win

No, /mnt/win non mi interessa in questo momento 😉 Creiamo un po’ di device:

$ cd /mnt/win/dev
$ mknod console c 5 1
$ mknod null c 1 3
$ mknod ram b 1 1
$ mknod lvm b 109 0
$ mknod systty c 4 0
$ mknod tty1 c 4 1
$ mknod hdb2 b 3 66 ::

Salviamo il tutto:

$ cd; umount /mnt/win
$ gzip -9 /boot/initrd-lvm-2.6.10
$ lilo -v

Proviamo a fare il reboot incrociando le dita. Niet: errore anche questa volta. E’ il momento di cercare su google. Sgrunt: pare che il kernel 2.6 richieda i tool LVM2. Questo non era scritto nei requisiti per migrare al 2.6! Va be’: scaricati e installati. Per fortuna sono compatibili (quasi in tutto, si dice) con i tool LVM1. E ora che si fa? Ah, sì: metto nell’immagine initrd i tool LVM2 e riprovo:

$ cd /mnt/win/bin
$ cp $LVM2/lvm2.static lvm2
$ ln -s lvm2 vgchange
$ ln -s lvm2 vgscan

Pare inoltre che serva un nuovo device:

$ cd /mnt/win/dev
$ mkdir mapper
$ mknod control c 10 63

Veloce controllo che tutti gli eseguibili siano o statici o le corrispondenti librerie siano state inserite nell’immagine:

$ cd /mnt/win/bin
$ ldd lvm2
not a dynamic executable
$ ldd mount
libc.so.6 => /lib/i686/libc.so.6 (0x42000000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
$ ls ../lib/*
../lib/ld-linux.so.2
../lib/i686:
libc.so.6

Perfetto. Solita trafila per fare l’umount dell’immagine e aggiornare lilo e nuovo reboot. Fantastico: tutto fila liscio!

Ultime modifiche: la documentazione di initrd dice di preferire l’uso di pivot_root al vecchio meccanismo root change per montare il root filesystem. Ecco quindi il linuxrc finale modificato:

#!/bin/ash

echo Mounting /proc filesystem
mount -t proc proc /proc
echo Scanning logical volumes
vgscan
echo Activating logical volumes
vgchange -ay
vgmknodes
echo Mounting root filesystem
mount -o defaults --ro -t ext3 /dev/Volume00/LogVol00 /sysroot
cd /sysroot
pivot_root . initrd
exec chroot . /sbin/init 5 < dev/console > dev/console 2>&1
umount /initrd/proc
umount /initrd
blockdev --flushbufs /dev/ram0

Ultima nota: in linuxrc si possono mettere tutti i comandi che si desidera. Non è raro trovare comandi per caricare moduli del kernel che – forse – dovrebbero stare direttamente nel kernel.

Questo è quanto. Have fun!

Riferimenti

[1] http://lxr.linux.no/linux/Documentation/Changes
[2] http://www.sourceware.org/lvm2/
[3] http://lxr.linux.no/linux/Documentation/initrd.txt
WordPress Appliance - Powered by TurnKey Linux