GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Ist es möglich, den Linux-Kernel zu booten, ohne ein initrd-Image zu erstellen?

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ängen

Da 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ühren
qemu-system-x86_64 -drive file=rootfs.ext2

und:

qemu-system-x86_64 -initrd rootfs.cpio

Wo:

  • rootfs.ext2 und rootfs.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.


Linux
  1. Linux – Enthält der Vmlinux-Header die Länge des Kernel-Images?

  2. Linux – Ist es möglich, ein Image remote zu mounten, das sich selbst booten und installieren kann?

  3. Linux – Teilnahme an der Kernel-Mailingliste?

  4. Größe der Bootpartition ändern

  5. Wie bereinige ich das /boot-Verzeichnis unter LINUX Mint?

So überprüfen Sie die Kernel-Version in Linux

So ändern Sie den Startbildschirm von Linux

Geschichte des Linux-Kernel-Live-Patchings

Ist es möglich, ein Linux-Kernel-Modul in CLion zu entwickeln?

Wie installiert man Linux neben Windows 8, ohne die Boot-Konfiguration von Windows 8 zu beschädigen?

Wie lädt Linux das 'initrd'-Image?