So wie ich es verstehe, ist initramfs für das Laden des „echten“ Root-Dateisystems verantwortlich.
Nun gibt es zwei Stellen, an denen wir diese Root definieren. Zuerst fügen wir einen Eintrag in ein /etc/fstab
. Zweitens fügen wir das Gerät in die Kernel-Boot-Befehle ein, z. B. root=/dev/sda1
.
Welchen Parameter verwendet initramfs, um zu bestimmen, wo sich das Root-Dateisystem befindet? Wenn es den Root-Kernel-Parameter verwendet, warum haben wir dann einen Eintrag in /etc/fstab
? Die zweite Option (sie lautet /etc/fstab
) ist völlig unlogisch, da sich die /etc/fstab
Datei auf genau dem Root-Gerät befindet, das initramfs überhaupt erst zu mounten versucht.
Sehr verwirrendes Zeug.
Antwort1
Wie Sie sagten, besteht der Zweck von initramfs darin, das „echte“ Root-Dateisystem zu mounten (es kann auch andere Dinge tun, aber das ist die allgemeine Aufgabe).
Ohne ein Initramfs mountet der Kernel eine Partition normalerweise schreibgeschützt und übergibt dann die Kontrolle an /sbin/init
. Ein Initramfs übernimmt diese Aufgabe einfach vom Kernel, normalerweise dann, wenn das Root-Dateisystem keine normale Partition ist (mdraid, lvm, verschlüsselt usw.).
Abgesehen vom Hintergrund zu initramfs /etc/fstab
befindet sich Ihr System auf Ihrem Root-Dateisystem. Wenn initramfs gestartet wird, ist dieses Root-Dateisystem daher nicht vorhanden und kann daher nicht auf die fstab zugreifen (Henne-Ei-Problem).
Stattdessen müssen wir einen Parameter an die Kernel-Boot-Argumente übergeben, den initramfs verwenden soll. Normalerweise ist das so etwas wie root=/dev/sdX
. Es kann jedoch auch etwas tun, um automatisch herauszufinden, wo sich Ihr Root-Gerät befindet, und daher gibt es überhaupt keinen Parameter. Da es sich nur um Software handelt (im Allgemeinen ein Skript), kann es wirklich alles tun, was es will, um das Root-Gerät zu mounten.
Wie bereits erwähnt, wird der Kernel nun das echte Root-Verzeichnis schreibgeschützt mounten. Das initramfs sollte genau dies tun. Sobald das initramfs fertig ist, fährt das System mit dem Booten fort, als ob es überhaupt kein initramfs gäbe, und /sbin/init
startet. Dieses init startet dann alle Ihre normalen Boot-Skripte, und es ist die Aufgabe eines dieser Skripte, zu lesen /etc/fstab
, Root auf Lesen/Schreiben umzustellen und alle Ihre anderen Dateisysteme zu mounten.
Antwort2
Das kann sein oder auch nicht. Da Initramfs auf verschiedene Arten aufgebaut werden kann (der Kernel lädt es einfach und führt es aus, /init
was auch immer passiert). Die Verwendung eines Parameters ist jedoch üblicher, da dies mehr Flexibilität ermöglicht - d. h. wenn sich etwas ändert, können Sie einfach den Starteintrag bearbeiten und alles funktioniert weiter. Mit einem integrierten, fest codierten Root wäre dies nicht unbedingt möglich.
Der fstab-Eintrag kann in jedem Fall erforderlich sein, da er auch andere Dinge bestimmt, wie z. B. Mount-Optionen (von denen einige unterwegs geändert werden können) und fsck
die Reihenfolge. Selbst wenn er völlig überflüssig wäre (und wenn Initramfs damit umgeht, funktioniert es möglicherweise auch ohne), würde ich den Eintrag der Vollständigkeit halber trotzdem dort belassen.
Antwort3
Sie können /etc/fstab als statisches Mounten betrachten. Es ist nur eine Möglichkeit, eine solche Aufgabe auszuführen, aber nicht die einzige. Tatsächlich sehen Sie, wenn Sie den Befehl mount ausführen, viele Dateisysteme, die in fstab fehlen. Dienste wie udev und udisk verwalten einen Großteil des „Automountens“ und ignorieren dabei die Datei /etc/fstab …
Wenn also etwas häufig gemountet wird oder nicht, hat das nichts mit /etc/fstab zu tun.
initramfs ist nur ein temporäres Root-FS, das während des Bootvorgangs verwendet wird, bis das „echte“ Root-FS gemountet ist. Warum sollte sich initramfs also in /etc/fstab befinden?