Egal was du tust, du hast initramfs
. Es gibt kein Tun ohne es - es ist das einzige Dateisystem, das Ihnen auferlegt wird. Von kernel.org :
Was ist rootfs?
Rootfs
ist eine spezielle Instanz von ramfs
(oder tmpfs
, falls aktiviert), die
in 2.6-Systemen immer vorhanden ist. Sie können die Bereitstellung nichtrootfs
annähernd aus demselben Grund aufheben, aus dem Sie den Init-Prozess nicht beenden können. Anstatt einen speziellen Code zum Überprüfen und Behandeln einer leeren Liste zu haben, ist es für den Kernel kleiner und einfacher, nur sicherzustellen, dass bestimmte Listen nicht leer werden können.
Die meisten Systeme hängen einfach ein anderes Dateisystem über rootfs
und ignorieren es. Der Platz, den eine leere Instanz von RAMFS einnimmt, ist winzig.
Wenn * CONFIG_TMPFS * aktiviert ist, rootfs
wird tmpfs
statt ramfs
standardmäßig verwendet. Um Kraft ramfs
, fügen Sie "rootfstype=ramfs"
an die Kernel - Befehlszeile.
Was ist initramfs?
Alle 2.6 Linux-Kernel enthalten ein"cpio"
Archiv imgzipped-Format, das beim Booten des Kernels extrahiert rootfs
wird. Nach dem Extrahieren prüft der Kernel, obrootfs
eine Datei enthalten ist"init"
, und führt sie in diesemFallals PID 1 aus. Wenn dieserinit
Prozessgefunden wird,ist er dafür verantwortlich, dass das System den Rest des Weges nach oben fährt, einschließlich des Auffindens und Einbindens des realen Root-Geräts ( wenn überhaupt). Wennder Kernelnach dem Extrahieren des eingebettetenArchivsrootfs
keininit
Programmenthält, greift ercpio
auf den älteren Code zurück, um eine Root-Partition zu finden und zu mounten, und führt dann eine Variante davon/sbin/init
aus.
All dies unterscheidet sich in mehrfacher Hinsicht von der alten initrd:
Die alte initrd war immer eine separate Datei, während das initramfs-Archiv mit dem Linux-Kernel-Image verknüpft ist. (Das Verzeichnis linux - * / usr dient dazu, dieses Archiv während des Builds zu erstellen.)
Die alte initrd-Datei war ein komprimiertes Dateisystem-Image (in einigen Dateiformaten wie ext2, für das ein Treiber in den Kernel integriert werden musste), während das neue initramfs-Archiv ein komprimiertes cpio-Archiv ist (wie tar nur einfacher, siehe cpio (1)). und Dokumentation / early-userspace / buffer-format.txt). Der cpio-Extraktionscode des Kernels ist nicht nur extrem klein, sondern enthält auch Text und Daten, die während des Startvorgangs verworfen werden können.
Das Programm, das von der alten initrd (die / initrd, nicht / init genannt wurde) ausgeführt wurde, führte einige Setups durch und kehrte dann zum Kernel zurück, während von dem init-Programm von initramfs nicht erwartet wird, dass es zum Kernel zurückkehrt. (Wenn / init die Steuerung übergeben muss, kann es / mit einem neuen Root-Gerät überladen und ein anderes Init-Programm ausführen. Siehe das Dienstprogramm switch_root weiter unten.)
Beim Wechseln eines anderen Root-Geräts hat initrd pivot_root ausgeführt und anschließend die Ramdisk umgemountet. Aber initramfs ist rootfs: Sie können rootfs weder pivot_root noch die Bereitstellung aufheben. Löschen Sie stattdessen alles aus rootfs, um Speicherplatz freizugeben (find -xdev / -exec rm '{}' ';'), und hängen Sie rootfs mit dem neuen root-Wert (cd / newmount; mount --move. /; Chroot.) Über. Hängen Sie stdin / stdout / stderr an das neue / dev / console an und führen Sie das neue init aus.
Da dies ein bemerkenswert ausdauernder Prozess ist (und das Löschen von Befehlen erfordert, bevor Sie sie ausführen können), hat das klibc-Paket ein Hilfsprogramm (utils / run_init.c) eingeführt, das dies alles für Sie erledigt. Die meisten anderen Pakete (z. B. busybox) haben diesen Befehl "switch_root" genannt.
Initramfs auffüllen:
Der 2.6-Kernel-Erstellungsprozess erstellt immer ein gzipptes cpio-Format initramfs-Archiv und verknüpft es mit der resultierenden Kernel-Binärdatei. Standardmäßig ist dieses Archiv leer (verbraucht 134 Byte auf x86).
Mit der Konfigurationsoption CONFIG_INITRAMFS_SOURCE (in General Setup in menuconfig und in usr / Kconfig) kann eine Quelle für das initramfs-Archiv angegeben werden, die automatisch in die resultierende Binärdatei aufgenommen wird. Diese Option kann auf ein vorhandenes gzipptes cpio-Archiv, ein Verzeichnis mit zu archivierenden Dateien oder eine Textdateispezifikation wie das folgende Beispiel verweisen:
dir /dev 755 0 0
nod /dev/console 644 0 0 c 5 1
nod /dev/loop0 644 0 0 b 7 0
dir /bin 755 1000 1000
slink /bin/sh busybox 777 0 0
file /bin/busybox initramfs/busybox 755 0 0
dir /proc 755 0 0
dir /sys 755 0 0
dir /mnt 755 0 0
file /init initramfs/init.sh 755 0 0
Führen Sie "usr / gen_init_cpio" (nach der Kernel-Erstellung) aus, um eine Verwendungsmeldung zu erhalten, die das oben genannte Dateiformat dokumentiert.
Ein Vorteil der Konfigurationsdatei besteht darin, dass kein Root-Zugriff erforderlich ist, um Berechtigungen festzulegen oder Geräteknoten im neuen Archiv zu erstellen. (Beachten Sie, dass diese beiden Beispieleinträge "file" Dateien mit den Namen "init.sh" und "busybox" in einem Verzeichnis mit dem Namen "initramfs" unter dem Verzeichnis linux-2.6. * Erwarten. Weitere Informationen finden Sie unter Documentation / early-userspace / README mehr Details.)
Der Kernel ist nicht von externen cpio-Tools abhängig. Wenn Sie anstelle einer Konfigurationsdatei ein Verzeichnis angeben, erstellt die Build-Infrastruktur des Kernels eine Konfigurationsdatei aus diesem Verzeichnis (usr / Makefile ruft scripts / gen_initramfs_list.sh auf) und fährt mit dem Packen dieses Verzeichnisses mithilfe der Konfigurationsdatei fort (indem es an eingespeist wird) usr / gen_init_cpio, erstellt aus usr / gen_init_cpio.c). Der cpio-Erstellungscode für die Erstellungszeit des Kernels ist vollständig in sich abgeschlossen, und der Boot-Time-Extractor des Kernels ist (offensichtlich) ebenfalls in sich abgeschlossen.