Wie kann ein Linux-Kernel auf die zugewiesenen initramfs / initrd zugreifen?

8

Ich versuche, den Startvorgang einer Maschine als Ganzes ab dem Zeitpunkt zu verstehen, an dem Sie den Netzschalter drücken. Es gibt dieses eine Stück vom Bootloader bis zur Initramfs-Phase, das ich unter einigen anderen kleineren Teilen nicht ganz verstehe.

Angesichts dieser Grub-Konfiguration für einen Eintrag aus einer aktuellen Ubuntu-Standardinstallation:

insmod gzio
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set=root 96fb7310-5adb-4f66-bf59-04acd08d76a3
echo    'Loading Linux x.y.z ...'
linux   /vmlinuz-x.y.z root=/dev/mapper/some-device-name ro nomodeset 
echo    'Loading initial ramdisk ...'
initrd  /initrd.img-x.y.z

Was macht das eigentlich in Bezug auf Systemstatus und Speicher? Ich verstehe, dass Grubs Aufgabe darin besteht, "den Kernel zu laden und auszuführen", und es hat seine eigenen Module, um auf Dateien auf Geräten (oder im Netzwerk) zuzugreifen, um zu ihnen zu gelangen. Im Beispiel hier insmods set rootund search- aber das ist nur aus der Sicht von Grub und nicht mit dem Kernel geteilt, oder?

Ich vermute auch, dass Grub (eine Kopie?) Des Kernels in den Speicher lädt ( linuxBefehl ) und ihn tritt, um die Ausführung zu starten. (Anscheinend zwei verschiedene Schritte - also wie?) Die angegebenen Parameter können im Kernel gelesen und interpretiert werden (ist dies eine große Zeichenfolge, die irgendwo im Speicher abgebildet ist?) und bieten die Optionen zum Anordnen der angeforderten Dinge.

Ich sehe auch diese initrdOption. Dies verweist auf meine gzip-komprimierten initramfs, die zum Starten des tatsächlichen Root-Geräts benötigt werden, das von angegeben wird root=. Aber wie werden diese Initramfs dem Kernel zur Verfügung gestellt? Es werden keine Speicheradressen an den Ort übergeben, an den es geladen werden kann, und es kann auch nicht darauf zugreifen, da es bereits vor dem Start des Kernels geladen wurde. In einigen Kerneldokumentationen heißt es, dass auf dieses initramfs-Dateisystem 'Gerät' zugegriffen werden kann /dev/ram0, aber ich sehe nicht, wie es zunächst zu einer zugänglichen Gerätedatei wird. Unter Wasser passiert etwas, das ich nicht sehe, denke ich.

Ich sehe auch nicht, wie dies mit anderen Bootloadern zusammenhängt, einschließlich eingebetteter Plattformen, zum Beispiel mit U-Boot / Coreboot. Tut dies dasselbe wie Grub (gleiche Standardspeicheradressen?) Und inwieweit sind diese hinsichtlich des Ladens von Kernel / initrd mit Grub vergleichbar?

Um meine Fragen klar zu stellen, ich glaube, ich verstehe, warum die verschiedenen Startphasen existieren und welche Übergänge stattfinden, aber ich sehe nicht, wie sie stattfinden und welche genauen Verantwortlichkeiten für jede der Phasen bestehen. Ich habe das Gefühl, dass ich einen "Standard" verpasse, auf den das alles hinausläuft.

Ich würde mich über eine Erklärung dazu freuen.

gertvdijk
quelle
Beachten Sie den impliziten bootBefehl am Ende der Sequenz. Ich bin mir nicht sicher , was genau es in Grub macht, aber wenn Sie die Grub-Befehlszeile verwenden, um diese Befehle manuell einzugeben, müssen Sie bootoder es wird einfach für immer bleiben grub>(oder zumindest, bis Sie sich langweilen und den Computer ausschalten ). Die vorhergehenden Befehle richten "lediglich" eine Umgebung ein.
Ein Lebenslauf vom
@ MichaelKjörling Nach meinem Verständnis bootwird die CPU jetzt zur Adresse des geladenen Kernels springen (Ausführung starten). Für einen Menüeintrag ist dies implizit definiert. sieh das .
Gertvdijk

Antworten:

5

Im Allgemeinen muss es eine Art Protokoll geben, da es normalerweise nicht ausreicht, nur eine Datei in den Speicher zu laden und an einen bestimmten Speicherort zu springen, sondern Sie müssen entweder zusätzliche Argumente wie Kernelparameter übergeben , dh auf memdisk-Argumente unter DOS zugreifen .

Da dies hardwareabhängig ist (Arm unterscheidet sich beispielsweise von x86), müssen Sie die richtigen Informationen finden. In diesem Artikel finden Sie einige Beispiele zum Booten von Arm oder zum Linux / x86-Bootprotokoll .

Ulrich Dangel
quelle
6

Der Bootloader speichert die initrd an einem Speicherort im Speicher und teilt dem Kernel die Speicheradresse des initrd-Images mit. Die meisten modernen Linux-Systeme verwenden das initramfs- Schema mit dracut , einem CPIO-Archiv (anstelle eines Disk-Images), das kurz nach der Ausführung in ein vom Kernel erstelltes tmpfs-Dateisystem entpackt wird.

jsbillings
quelle
Ich bin so weit gekommen; Aber wie teilt der Bootloader dem Kernel den Speicherort im Speicher mit? Woher ruft der Kernel diese Speicheradresse ab?
Gertvdijk
3
@gertvdijk unter kernel.org/doc/Documentation/x86/boot.txt wird beschrieben, wie der Bootloader mit dem Kernel kommuniziert, dh der Bootloader muss auch die Kernelparameter usw. bereitstellen.
Ulrich Dangel
@UlrichDangel Schön! Genau das, wonach ich gesucht habe. Anscheinend handelt es sich um ein hardwarespezifisches (in diesem Fall x86) Protokoll, das alles beschreibt. Schreiben Sie es als Antwort mit einer kurzen Beschreibung und ich werde es akzeptieren.
Gertvdijk