Ich fand heraus, dass wenn ich jffs oder sd als Dateisystem wähle (und nicht initramfs), die Kernelgröße sehr klein ist (1,4 MB im Vergleich zu initramfs-3,4 MB). Es zeigt, dass initramfs sehr viel Platz in Anspruch nimmt. Damit ich es vollständig entfernen kann, werde ich einen sehr kleinen Kernel haben, was ich will.
Die grundlegende Frage, die mir in den Sinn kommt, lautet: Warum brauche ich initramfs? Kann ein Linux-Kernel nicht einfach ohne ein anfängliches Dateisystem booten?
Meine Endanwendung führt nur Berechnung und Kommunikation durch - überhaupt keine Sotrage. Ein Betriebssystem ohne Dateisystem macht also Sinn - zumindest für meine Anwendung.
/root
- das ist es. Das Einzige, was es anders macht, istswitch_root
, dass es jederzeit möglich ist , selbst wenn bei bestimmten geladenen Kernelmodulen die richtigen Vorsichtsmaßnahmen getroffen werden. Initramfs ist nichts anderes als ein Festplatten-Image - randvoll oder nein, es ist da. Und du bist nie ohne - es ist schließlich deine Wurzel. Es sollte einfach kein Rätsel sein, denke ich, und ich mag all die unnötigen Verwirrungen, die damit verbunden sind, nicht.Antworten:
Die Vergrößerung eines initramfs ist nicht auf den ramfs-Treiber zurückzuführen (er ist nur ein paar kB groß und wird auch für andere Dinge benötigt), sondern auf das initramfs selbst. Das initramfs enthält Programme, die zum Assemblieren und Mounten des realen Root-Dateisystems erforderlich sind.
Initramfs macht es viel einfacher und in einigen Fällen möglich (zB verschlüsselt
/
), das System zu booten. Es wird dringend empfohlen, es auf einer PC-ähnlichen Hardware mit vielen hot-plug-fähigen Peripheriegeräten aufzubewahren. Andererseits ist es sehr sinnvoll, ein eingebettetes Gerät ohne initramfs zu booten, mit einem Kernel, der nur die spezielle Hardwarekonfiguration unterstützt, für die es entwickelt wurde.Der Kernel muss natürlich von einem Dateisystem booten: Es muss eine Möglichkeit geben, die gewünschte Anwendung zu laden. Wenn Sie nichts ausführen möchten, können Sie die Maschine auch ausgeschaltet lassen.
Wenn Sie kein initramfs verwenden möchten, weisen Sie Ihren Bootloader einfach an, kein initramfs zu übergeben. Nehmen Sie natürlich auch keinen in die Ausgabe des Kernel-Builds auf - wie dies geschieht, wenn dies überhaupt architektur- und bootloaderabhängig ist,
vmlinux
und schließenbzImage
Sie beispielsweise nicht die initramfs ein (sie sind der rohe bzw. der komprimierte Kernel) ), aberuImage
(für U-Boot) packt sowohl den Kernel als auch das initramfs, falls vorhanden.(Technisch gesehen gibt es, wie mikeserv bemerkt, immer ein initramfs - aber standardmäßig ein leeres 134-Byte-Archiv. Was Sie sehen und loswerden wollen, ist ein "wahres", nicht leeres initramfs, das von erstellt wurde Ihren Build-Prozess und die darin enthaltenen Tools, die dann zum Mounten des Root-Dateisystems verwendet werden.)
Ein initramfs kann ein vernünftiger Weg sein, um ein System mit nur einer Anwendung ohne persistente Daten zu erstellen: Legen Sie Ihre gesamte Anwendung in das initramfs, booten Sie das und behalten Sie es. Auf diese Weise können Sie Ihren persistenten Speicher oder Ihr Boot-Image einfacher organisieren (Sie benötigen lediglich den Kernel und initramfs, die gebündelt werden können). Dieser Ansatz hat jedoch einige Nachteile: Alle Daten im initramfs werden dauerhaft im RAM gespeichert, und Sie können die Dateien im Boot-Image nicht einfach ändern. Sie müssen das Archiv neu erstellen.
quelle
Aus LFS :
...
...
Eine andere Quelle www.kernel.org
Daneben gibt es viele Linux-Systeme, die Router mögen, die kein initramfs verwenden.
quelle
Sie benötigen ein initramfs für komplexere Setups, wie z. B. den Netzwerkstart oder lvm oder raid, da für die Konfiguration des Zugriffs auf das Root-Dateisystem einige Dienstprogramme im Benutzermodus erforderlich sind. Für eine einfache, konventionelle Partition auf einer Festplatte können Sie dann auf ein initramfs verzichten, solange Sie die Festplattentreiber in den Kernel integriert haben und das Root-Argument nicht über die UUID, sondern über den Gerätepfad angeben. Natürlich kann sich der Gerätepfad ändern, je nachdem, welche Plug-and-Play-Geräte (dh USB-Geräte) Sie angeschlossen haben, oder auch nur zufällige Timing-Abweichungen. Aus diesem Grund werden für die Zuverlässigkeit so gut wie alle Benutzer UUIDs und Initrams verwendet.
quelle
Dies ist eine alte Frage, scheint aber noch keine akzeptierte Antwort zu haben, daher werde ich sie hier rauswerfen.
Von https://www.kernel.org/doc/Documentation/early-userspace/README (ganz unten steht, dass es seit 2004 nicht aktualisiert wurde.)
Ich glaube, dass Geräte / Distributionen wie Raspberry Pi usw. keine initramfs verwenden. in einigen Fällen kann der Kernel auf dem Root - Partition (durch den Bootloader montiert , die erforderlichen fs Module hat.) In anderen Fällen , in denen der Kern auf einer ist beispielsweise
/boot
Partition können die Initramfs auf derselben Partition direkt zugegriffen werden , bevor sie die rootfs wie andere Befestigungs angegeben haben.In einigen Fällen sind die initramfs können in die gleiche Datei wie der Kernel eingebaut werden , aber dies ist nicht immer der Fall. (a) scheint ziemlich klar zu sagen, dass in einigen Fällen initramfs nicht notwendig ist.
quelle
Ich finde die folgende Erklärung klarer,
quelle
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 vonramfs
(odertmpfs
, 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
wirdtmpfs
stattramfs
standardmäßig verwendet. Um Kraftramfs
, 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 extrahiertrootfs
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:
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:
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.
quelle
do_mounts.c
- spezifischprepare_namespace
, in dersaved_root_name
dasroot=
Kommandozeilenargument enthalten ist.