In der Antike war der Kernel schwer zu erkennen, ob es sich um eine Major / Minor-Nummer des Root-Dateisystems handelt, und er hat dieses Gerät gemountet, nachdem alle im Kernel integrierten Gerätetreiber initialisiert wurden. Das rdev
Dienstprogramm kann verwendet werden, um die Root-Gerätenummer im Kernel-Image zu ändern, ohne sie erneut kompilieren zu müssen.
Schließlich kamen Bootloader und konnten eine Befehlszeile an den Kernel übergeben. Wenn das root=
Argument übergeben wurde, teilte dies dem Kernel mit, wo sich die Wurzel fs anstelle des eingebauten Werts befand. Die Treiber mussten auf das zugreifen, das noch in den Kernel eingebaut werden musste. Während das Argument wie ein normaler Geräteknoten im /dev
Verzeichnis aussieht , gibt es offensichtlich kein /dev
Verzeichnis, bevor das Root-Dateisystem eingehängt ist, so dass der Kernel dort keinen Dev-Knoten finden kann. Stattdessen sind bestimmte bekannte Gerätenamen fest im Kernel codiert, sodass die Zeichenfolge in die Gerätenummer übersetzt werden kann. Aus diesem Grund kann der Kernel Dinge wie /dev/sda1
, aber keine exotischen Dinge wie /dev/mapper/vg0-root
oder eine Volume-UUID erkennen.
Später initrd
kamen die ins Bild. Zusammen mit dem Kernel initrd
lud der Bootloader das Image, das eine Art komprimiertes Dateisystem-Image war (gzipped ext2-Image, gzipped romfs-Image, squashfs wurde schließlich dominant). Der Kernel dekomprimierte dieses Image auf eine RAM-Disk und stellte die RAM-Disk als Root-Fs bereit. Dieses Image enthielt einige zusätzliche Treiber und Boot-Skripte anstelle eines echten init
. Diese Boot-Skripte führten verschiedene Aufgaben aus, um Hardware zu erkennen, Dinge wie RAID-Arrays und LVM zu aktivieren, UUIDs zu erkennen und die Kernel-Befehlszeile zu analysieren, um den echten Root zu finden, der nun durch UUID, Datenträgerbezeichnung und andere erweiterte Dinge angegeben werden kann. Es hat dann die realen Root-Fs eingehängt /initrd
und dann den pivot_root
Systemaufruf ausgeführt , um den Kernel zu tauschen /
und/initrd
, dann exec /sbin/init
auf der realen Wurzel, die dann /initrd
die Ramdisk aushängen und freigeben würde.
Endlich haben wir heute die initramfs
. Dies ähnelt dem initrd
, ist jedoch kein komprimiertes Dateisystem-Image, das auf eine Ramdisk geladen wird, sondern ein komprimiertes cpio-Archiv. Ein tmpfs wird als root gemountet und das Archiv dort extrahiert. Anstelle von using pivot_root
, was als schmutziger Hack angesehen wurde, initramfs
mounten die Boot-Skripte den realen Root /root
, löschen alle Dateien im tmpfs-Root, dann chroot
in /root
und exec /sbin/init
.