2.1.8 initrd

È 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
Il file linuxrc è uno script contenente le istruzioni riportate di seguito

#!/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
Nel caso specifico, il RAM disk, spostato dalla penultima istruzione di linuxrc nel mount point /initrd, non viene smontato, e quindi è possibile visualizzarne il contenuto una volta che il sistema è stato avviato.