È possibile far caricare al kernel, nelle prime fasi del suo avvio, un RAM disk per permettergli di gestire situazioni in cui deve utilizzare alcuni moduli per poter avviare il sistema. Ad esempio si supponga di aver compilato come modulo il supporto per i dischi SCSI e di voler avviare il sistema con il root filesystem proprio sul disco SCSI. Per poter montare il filesystem principale il kernel ha bisogno del driver per la gestione dei dischi SCSI che è contenuto in un modulo separato dal kernel stesso e quindi il kernel da solo non sarebbe in grado di avviare il sistema. Per ovviare a tale problematica è possibile far vedere al kernel, durante la prima fase del suo avvio, un RAM disk contenente un insieme minimo di file che permettano al kernel di caricare i moduli necessari all’avvio del sistema.
Per realizzare tale RAM disk si può utilizzare il comando mkinitrd (man page mkinitrd(8)).
____________________________________________________________________
Comando: mkinitrd
Path: /sbin/mkinitrd
SINTASSI
# mkinitrd [option] intrd_image kernel_version
DESCRIZIONE
Tale comando crea un file che è l’immagine (generalmente compressa con gzip) di una parte di filesystem ext2. Questo file, rinominato generalmente initrd-kernel_version.img (dove kernel_version è la versione del kernel per il quale è stato realizzato), viene posto nella directory di boot (/boot) e quindi viene inserita un’apposita direttiva (generalmente initrd16) nel file di configurazione del boot loader, in maniera che questo lo renda disponibile al kernel.17 Se il kernel è opportunamente compilato per supportare questa caratteristica, il RAM disk viene montato temporaneamente come root filesystem e viene lanciato in esecuzione /linuxrc (file eseguibile che deve essere presente nella root directory dell’immagine del RAM disk). Subito prima del termine della sua esecuzione, linuxrc monta l’effettivo root filesystem (in genere per mezzo del comando pivot_root, v. man page pivot_root(8)) ed eventualmente smonta il RAM disk. Quindi il kernel procede con la sua normale operatività lanciando in esecuzione il primo effettivo processo: init.18
Ad esempio, quello che segue è il contenuto del file initrd della distribuzione Fedora. Per poterlo montare è opportuno decomprimerlo e montarlo con l’opzione -o loop (cioè come se fosse una vero e proprio filesystem)19.
bin insmod modprobe -> /sbin/nash nash dev console null ram systty tty1 tty2 tty3 tty4 etc lib ext3.ko jbd.ko linuxrc loopfs proc sbin -> bin sys sysroot
#!/bin/nash mount -t proc /proc /proc setquiet echo Mounted /proc filesystem echo Mounting sysfs mount -t sysfs none /sys echo "Loading jbd.ko module" insmod /lib/jbd.ko echo "Loading ext3.ko module" insmod /lib/ext3.ko echo Creating block devices mkdevices /dev echo Creating root device mkrootdev /dev/root umount /sys echo 0x0100 > /proc/sys/kernel/real-root-dev echo Mounting root filesystem mount -o defaults --ro -t ext3 /dev/root /sysroot pivot_root /sysroot /sysroot/initrd umount /initrd/proc