initrd/initramfs ist optional und nicht erforderlich. bzImage ist das reine Kernel-Image und kann direkt vom Bootloader gebootet werden. Es kann jedoch notwendig sein, einige Aufgaben auszuführen (Laden von Dateisystemmodulen, Treiber für den Festplattenzugriff, Mounten des Root-Dateisystems von einigen austauschbaren Medien ohne festen Namen/Pfad usw.), die normalerweise den Zugriff auf ein Dateisystem und Userspace-Tools erfordern würden.
Dafür steht initramfs ist für:Es ist ein CPIO-Archiv, das entweder im Kernel-Image selbst oder vom Bootloader beim Booten an das Kernel-Image angehängt wird (das Kernel-Image ist der Container für die initramfs, nicht umgekehrt).
Dieses CPIO-Archiv enthält ein anfängliches rootfs mit den Modulen, die erforderlich sind, um alle Geräte einzurichten, um auf das richtige Root-Dateisystem zuzugreifen, und einige Programme, um diese Geräte zu identifizieren, die Module zu laden, einige andere Startaufgaben auszuführen, das richtige Root-Dateisystem erneut in / einzuhängen und /sbin zu starten /init
initrd ist ähnlich, mit dem Hauptunterschied, dass es sich um ein Dateisystem-Image handelt, das komprimiert sein kann und normalerweise auch ist. Der Kernel muss Unterstützung für das verwendete Dateisystem eingebaut haben und wird dieses Image als anfängliches /.
einhängenDa CPIO um mehrere Größenordnungen einfacher ist, wird initramfs gegenüber initrd bevorzugt, da dies sowohl die Anforderung für den Einbau von Dateisystemmodulen erspart als auch die Erstellung von initramfs vereinfacht. Anstatt ein ext2-Image erstellen, loopdevice mounten und füllen zu müssen, läuft es auf eine einfache Archiverstellung hinaus, ähnlich wie bei der Verwendung von tar.
Wenn Sie jedoch Ihren Kernel mit allen erforderlichen Treibern und Modulen kompilieren, die in das Kernel-Image integriert sind, und Ihr Root-Dateisystemgerät einen festen Namen im System hat, benötigen Sie kein initramfs, da der Kernel dann Dinge selbst erledigen kann.
Minimales QEMU + Buildroot-Beispiel
Hier ist ein minimales konkretes Beispiel, das zeigt, dass initrd nicht obligatorisch ist:https://github.com/cirosantilli/linux-kernel-module-cheat/tree/0b4f156b1b536a89c90882ed8ce551abcd3780af#initrd
Mit diesem Setup können wir problemlos zwei funktionierende QEMU-Befehle vom Typ:
ausführenqemu-system-x86_64 -drive file=rootfs.ext2
und:
qemu-system-x86_64 -initrd rootfs.cpio
Wo:
rootfs.ext2
undrootfs.cpio
sind im Grunde das gleiche Root-Dateisystem, aber in unterschiedlichen Formaten- der erste Befehl hat eine Festplatte und kein
-initrd
- der zweite Befehl ein
-initrd
aber keine Festplatte
In beiden Fällen bootet Linux problemlos, außer in -initrd
System sind Dateischreibvorgänge nicht dauerhaft, da sich alles im Speicher befindet.