Wird der gesamte Kernel beim Booten in den Speicher geladen?

14

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?

user1028270
quelle
Ja. Der gesamte Kernel. Und seine ersten rootfs. Aber Linux-Kernel werden seit vielen Jahren nicht mehr verwendet.
mikeserv
Richtig, ich habe das gelesen. Es wurde größtenteils durch initramfs ersetzt, oder? Und es ist immer noch ein ähnlicher Prozess mit initramfs richtig?
user1028270
1
Es wurde für alle Kernel seit der 2.6er-Serie komplett ersetzt. Aber der Prozess ist ähnlich, außer dass initramfs niemals abgehängt wird - es ist immer da und es ist auch immer root. Sie müssen Ihren Root-Entwickler tatsächlich darüber mounten. Es gibt auch die Vorteile, dass kein separater Block-Entwickler und ähnliches emuliert werden muss.
mikeserv
Cool, ich werde den Artikel lesen, den du verlinkt hast. Die Kernelmodule werden also in den initramfs rootfs gespeichert?
user1028270
1
@edwardtorvalds - das wird udevnormalerweise erledigt und ja, automatisch.
mikeserv

Antworten:

17

Der gesamte Kernel wird beim Booten in den Speicher geladen, normalerweise zusammen mit einem initramfsheutigen. (Es ist weiterhin möglich, ein System so einzurichten initramfs, dass es ohne ein System bootet. Dies ist jedoch auf Desktops und Servern ungewöhnlich.)

Die initramfsRolle 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 ein udevbisschen Netzwerk und kmodladen 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: die initramfs, /lib/modulesauf dem realen Dateisystem, in einem Entwicklungsbaum , wenn Sie ein Modul entwickelst ... Das initramfsmuss nur die Module enthalten , die notwendig sind , um das Root - Dateisystem zu montieren (die den Rest enthält).

Stephen Kitt
quelle
OK, das macht für mich Sinn. Ich glaube, ich habe das Kernel-Image und das Dateisystem, das es verwendet, zusammengeführt, die offensichtlich völlig getrennt sind.
user1028270
5

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.

Toby Speight
quelle
3

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 initramfsmit 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 abgeschlossen initramfsist, führt Linux a auspivot_root(8) , mountet den Real /und wirft den initramfsInhalt.

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 initramfsauf 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.

vonbrand
quelle
Das tut es nicht pivot_root.
mikeserv