Nei tempi antichi, il kernel era codificato per conoscere il numero maggiore / minore del dispositivo dei root fs e montava quel dispositivo dopo aver inizializzato tutti i driver di dispositivo, che erano integrati nel kernel. L' rdev
utilità potrebbe essere utilizzata per modificare il numero del dispositivo radice nell'immagine del kernel senza doverlo ricompilare.
Alla fine è arrivato il boot loader e potrebbe passare una riga di comando al kernel. Se l' root=
argomento è stato passato, ciò indicava al kernel dove si trovava la radice fs anziché il valore incorporato. I driver dovevano accedere a quelli che dovevano ancora essere integrati nel kernel. Mentre l'argomento sembra un normale nodo del dispositivo nella /dev
directory, ovviamente non esiste alcuna /dev
directory prima che il root fs sia montato, quindi il kernel non può cercare un nodo dev lì. Invece, alcuni nomi di dispositivi ben noti sono codificati nel kernel in modo che la stringa possa essere tradotta nel numero di dispositivo. Per questo motivo, il kernel può riconoscere cose come /dev/sda1
, ma non cose più esotiche /dev/mapper/vg0-root
o un UUID di volume.
Più tardi, è initrd
entrato in scena. Insieme al kernel, il boot loader caricava l' initrd
immagine, che era una specie di immagine del filesystem compresso (immagine ext2 gzipped, immagine rom rom gzipped, gli squashfs alla fine diventavano dominanti). Il kernel decomprimerebbe questa immagine in un ramdisk e monterebbe il ramdisk come root fs. Questa immagine conteneva alcuni driver aggiuntivi e script di avvio invece che reali init
. Questi script di avvio hanno eseguito varie attività per riconoscere l'hardware, attivare elementi come array di raid e LVM, rilevare UUID e analizzare la riga di comando del kernel per trovare la radice reale, che ora potrebbe essere specificata da UUID, etichetta del volume e altre cose avanzate. Quindi ha montato il vero root fs /initrd
, quindi ha eseguito la pivot_root
chiamata di sistema per far scambiare il kernel /
e/initrd
, quindi esegui /sbin/init
sulla radice reale, che smonterebbe /initrd
e libererebbe il ramdisk.
Finalmente, oggi abbiamo il initramfs
. Questo è simile al initrd
, ma invece di essere un'immagine di filesystem compresso che viene caricata in un ramdisk, è un archivio compresso cpio. Un tmpfs viene montato come root e l'archivio viene estratto lì. Invece di usare pivot_root
, che era considerato un trucco sporco, gli initramfs
script di avvio montano la radice reale dentro /root
, eliminano tutti i file nella radice tmpfs, quindi chroot
in /root
, ed exec /sbin/init
.