Ich habe dieses beliebte IBM-Dokument gelesen (ich sehe, dass es im Web häufig verwendet wird), in dem die Funktion der ursprünglichen RAM-Platte erläutert wird.
Ich bin an eine Wand gestoßen, als ich mir vorstellte, wie das funktioniert.
In der Dokumentation heißt es
Der Bootloader, wie z. B. GRUB, identifiziert den zu ladenden Kernel und kopiert dieses Kernel-Image und die zugehörige initrd in den Speicher
Ich bin schon verwirrt: Kopiert es den gesamten Kernel in den Speicher oder nur einen Teil davon? Wenn sich der gesamte Kernel im Speicher befindet, warum benötigen wir dann überhaupt die anfängliche RAM-Disk?
Ich dachte, der Zweck von initrd sei, ein kleines generalisiertes Kernel-Image zu haben, und initrd wird die richtigen Module darin installieren, bevor das Kernel-Image geladen wird. Aber wenn der gesamte Kernel bereits im Speicher ist, warum brauchen wir dann initrd?
Das bringt mich auch auf eine andere Sache, die mich verwirrt - wo befinden sich die Module, die in den Kernel geladen werden? Sind alle Kernelmodule in initrd gespeichert?
udev
normalerweise erledigt und ja, automatisch.Antworten:
Der gesamte Kernel wird beim Booten in den Speicher geladen, normalerweise zusammen mit einem
initramfs
heutigen. (Es ist weiterhin möglich, ein System so einzurichteninitramfs
, dass es ohne ein System bootet. Dies ist jedoch auf Desktops und Servern ungewöhnlich.)Die
initramfs
Rolle des Benutzers besteht darin, die Funktionen bereitzustellen, die zum Mounten der "echten" Dateisysteme und zum weiteren Booten des Systems erforderlich sind. Dazu gehören Kernelmodule und auch verschiedene Binärdateien: Sie benötigen mindestens einudev
bisschen Netzwerk undkmod
laden Module.Module können später als nur beim Booten in den Kernel geladen werden, so dass keine spezielle Vorbereitung des Kernels durch den Kernel erfolgt
initramfs
. Sie können überall gespeichert werden: dieinitramfs
,/lib/modules
auf dem realen Dateisystem, in einem Entwicklungsbaum , wenn Sie ein Modul entwickelst ... Dasinitramfs
muss nur die Module enthalten , die notwendig sind , um das Root - Dateisystem zu montieren (die den Rest enthält).quelle
Der gesamte Kernel (aber nicht seine Module) wird in den Speicher geladen. Wenn es Module gibt, die der Kernel benötigt, bevor Dateisysteme verfügbar sind (dies bedeutet normalerweise die Treiber für die Dateisysteme und ihre Geräte), befinden sich diese Module im initramfs (im Speicher) und der Kernel lädt sie von dort. Andere Module können später aus dem Dateisystem geladen werden.
quelle
Der Kernel in modernen Linux-Setups ist stark modulbasiert, dh der eigentliche Kernel (beim Booten in den Arbeitsspeicher geladen) enthält nur das Nötigste, der Rest wird als Module kompiliert (zur Laufzeit ladbar). Damit dies auch dann funktioniert, wenn z. B. die zum Booten erforderlichen Geräte oder Dateisysteme Module sind, wird ein
initramfs
mit dem Kernel geladen (wie der Name schon sagt, ist dies ein RAM-Bereich mit einem einfachen Dateisystem, das beim Booten eingehängt wird). Dieses temporäre Dateisystem ist gemountet/
und enthält Startprogramme und die erforderlichen Module. Sobald der Startvorgang abgeschlosseninitramfs
ist, führt Linux a auspivot_root(8)
, mountet den Real/
und wirft deninitramfs
Inhalt.Der Punkt dieser Komplexität ist, dass z. B. eine Distribution einen Kernel kompilieren kann (minimaler Kernel und vollständiger Satz von Modulen) und bei der Installation des Kernels einen
initramfs
auf die Hardware und das Setup des Zielcomputers zugeschnittenen Kernel erstellen kann. All dies ist aufgrund der Vielzahl von Geräten und Konfigurationen von "Personal Computers" erforderlich.quelle
pivot_root
.