
Ich habe herausgefunden, dass die Kernelgröße sehr klein ist (1,4 MB im Vergleich zu mit 3,4 MB) , wenn ich jffs
oder sd
als Dateisystem wähle (und nicht ). Das bedeutet, dass es sehr viel Platz beansprucht. Wenn ich könnte, würde ich es also vollständig entfernen und hätte dann einen sehr kleinen Kernel, was ich ja auch möchte.initramfs
initramfs
initramfs
Die grundlegende Frage, die mir in den Sinn kommt, ist: Warum brauche ich initramfs
? Kann ein Linux-Kernel nicht ohne anfängliches Dateisystem booten?
Meine Endanwendung wird nur Berechnungen und Kommunikation durchführen – überhaupt keine Speicherung. Daher ist ein Betriebssystem ohne Dateisystem sinnvoll – zumindest für meine Anwendung.
Antwort1
Die Größenzunahme durch ein Initramfs liegt nicht am Ramfs-Treiber (er ist nur ein paar KB groß und wird ohnehin für andere Dinge benötigt), sondern am Initramfs selbst. Das Initramfs enthält Programme, die zum Zusammenstellen und Einhängen des echten Root-Dateisystems erforderlich sind.
Initramfs macht das Booten des Systems viel einfacher und in manchen Fällen sogar möglich (z. B. verschlüsselt /
). Es wird dringend empfohlen, es auf PC-ähnlicher Hardware mit vielen Hotplug-fähigen Peripheriegeräten zu betreiben. 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 er erstellt wurde.
Der Kernel muss natürlich in ein Dateisystem booten: Es muss eine Möglichkeit geben, die Anwendung, die Sie ausführen möchten, zu laden. Wenn Sie nichts ausführen möchten, können Sie die Maschine auch ausgeschaltet lassen.
Wenn Sie kein Initramfs verwenden möchten, sagen Sie Ihrem Bootloader einfach, dass er keins übergeben soll. Schließen Sie natürlich auch keins in die Ausgabe des Kernel-Builds ein – wie das passiert, wenn überhaupt, hängt von der Architektur und dem Bootloader ab: Schließen Sie beispielsweise vmlinux
das bzImage
Initramfs nicht ein (das sind der Roh- bzw. der komprimierte Kernel), aber uImage
(für U-Boot) packt sowohl den Kernel als auch das Initramfs, falls eines vorhanden ist.
(Technisch, wieAbonnierenHinweise: Es gibt immer ein Initramfs – aber standardmäßig ist es ein leeres 134-Byte-Archiv. Was Sie sehen und loswerden möchten, ist ein „echtes“, nicht leeres Initramfs, das von Ihrem Build-Prozess erstellt wurde und Tools enthält, die dann zum Mounten des Root-Dateisystems verwendet werden.)
Beachten Sie, dass ein Initramfs eine sinnvolle Möglichkeit sein kann, ein Einzelanwendungssystem ohne persistente Daten zu erstellen: Legen Sie alle Ihre Anwendungen in das Initramfs, booten Sie es und behalten Sie es. Dies erleichtert die Organisation Ihres persistenten Speichers oder Boot-Images (Sie benötigen lediglich den Kernel und das Initramfs, die gebündelt werden können). Dieser Ansatz hat jedoch auch Nachteile: Alle Daten im Initramfs werden dauerhaft im RAM gespeichert, und Sie können die Dateien im Boot-Image nicht einfach ändern, sondern müssen das Archiv neu erstellen.
Antwort2
AusLFS:
Der einzige Zweck eines initramfs besteht darin, das Root-Dateisystem zu mounten. Das initramfs ist ein vollständiger Satz von Verzeichnissen, die Sie auf einem normalen Root-Dateisystem finden würden. Es ist in einem einzigen cpio-Archiv gebündelt und mit einem von mehreren Komprimierungsalgorithmen komprimiert.
...
Es gibt nur vier Hauptgründe, ein Initramfs in der LFS-Umgebung zu haben: Laden des Rootfs aus einem Netzwerk, Laden von einem logischen LVM-Volume, Verwenden eines verschlüsselten Rootfs, für das ein Kennwort erforderlich ist, oder die praktische Möglichkeit, das Rootfs als LABEL oder UUID anzugeben. Alles andere bedeutet normalerweise, dass der Kernel nicht richtig konfiguriert wurde.
...
Für die meisten Distributionen sind Kernelmodule der Hauptgrund für ein Initramfs. In einer allgemeinen Distribution gibt es viele Unbekannte wie Dateisystemtypen und Festplattenlayouts. In gewisser Weise ist dies das Gegenteil von LFS, wo die Systemfunktionen und das Layout bekannt sind und normalerweise ein benutzerdefinierter Kernel erstellt wird. In dieser Situation wird ein Initramfs selten benötigt.
Eine andere Quellewww.kernel.org
Daneben gibt es zahlreiche Linux-Systeme, die Router bevorzugen, die kein initramfs verwenden.
Antwort3
Sie benötigen ein Initramfs für komplexere Setups, wie Netzwerk-Boot, LVM oder RAID, da diese einige Benutzermodus-Dienstprogramme erfordern, um den Zugriff auf das Root-FS zu konfigurieren. Für eine einfache, herkömmliche Partition auf einer Festplatte können Sie auf ein Initramfs verzichten, solange Sie die Festplattentreiber in den Kernel integriert haben und das Root-Argument per Gerätepfad statt per UUID angeben. Natürlich kann sich der Gerätepfad ändern, je nachdem, welche Plug-and-Play-Geräte (z. B. USB) Sie angeschlossen haben, oder sogar einfach aufgrund zufälliger Zeitabweichungen, weshalb aus Gründen der Zuverlässigkeit so ziemlich jeder UUIDs und ein Initramfs verwendet.
Antwort4
Wenn sich Ihre Root-Partition auf einer Festplatte befindet, die eine MBR-Partitionstabelle verwendet, und Sie einen persistenten Blockgerätenamen als root=
Parameter für den Kernel möchten, müssen Sie ein initramfs verwenden. /dev/sdX
ist nicht persistent, PARTUUID=
ist eine nur GPT-Funktion und LABEL=
und UUID=
ist für den Kernel in den frühen Phasen des Bootvorgangs nicht sichtbar. Ein initramfs kann die Speicher- und Dateisystemtreiber laden, sodass LABEL=
und UUID=
für den Kernel sichtbar ist.