Meine Frage bezieht sich auf das Booten eines Linux-Systems von einer separaten / boot-Partition. Wenn sich die meisten Konfigurationsdateien auf einer separaten / Partition befinden, wie hängt der Kernel sie beim Booten korrekt ein?
Jede Ausarbeitung wäre toll. Ich habe das Gefühl, dass mir etwas Grundlegendes fehlt. Ich beschäftige mich hauptsächlich mit dem Ablauf und der Reihenfolge der Operationen.
Vielen Dank!
EDIT: Ich denke, was ich fragen musste, war mehr nach dem Vorbild der dev-Datei, die im root-Kernel-Parameter verwendet wird. Angenommen, ich gebe meinen root-Parameter als root = / dev / sda2 an. Wie hat der Kernel eine Zuordnung der Datei / dev / sda2?
Antworten:
Linux bootet zunächst mit einer Ramdisk (genannt
initrd
, für "INITial RamDisk") als/
. Auf dieser Festplatte befindet sich gerade genug, um die eigentliche Root-Partition (einschließlich aller erforderlichen Treiber- und Dateisystemmodule) zu finden. Es hängt die Root-Partition auf einem temporären Mount-Punkt auf dem eininitrd
und ruft dann aufpivot_root(8)
, den Root- und den temporären Mount-Punkt auszutauschen, wobei dieinitrd
zuumount
bearbeitende Position und das eigentliche Root-Dateisystem erhalten bleiben/
.quelle
In der Antike war der Kernel schwer zu erkennen, ob es sich um eine Major / Minor-Nummer des Root-Dateisystems handelt, und er hat dieses Gerät gemountet, nachdem alle im Kernel integrierten Gerätetreiber initialisiert wurden. Das
rdev
Dienstprogramm kann verwendet werden, um die Root-Gerätenummer im Kernel-Image zu ändern, ohne sie erneut kompilieren zu müssen.Schließlich kamen Bootloader und konnten eine Befehlszeile an den Kernel übergeben. Wenn das
root=
Argument übergeben wurde, teilte dies dem Kernel mit, wo sich die Wurzel fs anstelle des eingebauten Werts befand. Die Treiber mussten auf das zugreifen, das noch in den Kernel eingebaut werden musste. Während das Argument wie ein normaler Geräteknoten im/dev
Verzeichnis aussieht , gibt es offensichtlich kein/dev
Verzeichnis, bevor das Root-Dateisystem eingehängt ist, so dass der Kernel dort keinen Dev-Knoten finden kann. Stattdessen sind bestimmte bekannte Gerätenamen fest im Kernel codiert, sodass die Zeichenfolge in die Gerätenummer übersetzt werden kann. Aus diesem Grund kann der Kernel Dinge wie/dev/sda1
, aber keine exotischen Dinge wie/dev/mapper/vg0-root
oder eine Volume-UUID erkennen.Später
initrd
kamen die ins Bild. Zusammen mit dem Kernelinitrd
lud der Bootloader das Image, das eine Art komprimiertes Dateisystem-Image war (gzipped ext2-Image, gzipped romfs-Image, squashfs wurde schließlich dominant). Der Kernel dekomprimierte dieses Image auf eine RAM-Disk und stellte die RAM-Disk als Root-Fs bereit. Dieses Image enthielt einige zusätzliche Treiber und Boot-Skripte anstelle eines echteninit
. Diese Boot-Skripte führten verschiedene Aufgaben aus, um Hardware zu erkennen, Dinge wie RAID-Arrays und LVM zu aktivieren, UUIDs zu erkennen und die Kernel-Befehlszeile zu analysieren, um den echten Root zu finden, der nun durch UUID, Datenträgerbezeichnung und andere erweiterte Dinge angegeben werden kann. Es hat dann die realen Root-Fs eingehängt/initrd
und dann denpivot_root
Systemaufruf ausgeführt , um den Kernel zu tauschen/
und/initrd
, dann exec/sbin/init
auf der realen Wurzel, die dann/initrd
die Ramdisk aushängen und freigeben würde.Endlich haben wir heute die
initramfs
. Dies ähnelt deminitrd
, ist jedoch kein komprimiertes Dateisystem-Image, das auf eine Ramdisk geladen wird, sondern ein komprimiertes cpio-Archiv. Ein tmpfs wird als root gemountet und das Archiv dort extrahiert. Anstelle von usingpivot_root
, was als schmutziger Hack angesehen wurde,initramfs
mounten die Boot-Skripte den realen Root/root
, löschen alle Dateien im tmpfs-Root, dannchroot
in/root
und exec/sbin/init
.quelle
Klingt so, als würden Sie fragen, woher der Kernel weiß, welche Partition die Root-Partition ist, ohne auf Konfigurationsdateien unter / etc zuzugreifen.
Der Kernel kann wie jedes andere Programm Befehlszeilenargumente akzeptieren. GRUB oder die meisten anderen Bootloader können Befehlszeilenargumente als Benutzereingabe akzeptieren oder sie speichern und verschiedene Kombinationen von Befehlszeilenargumenten über ein Menü verfügbar machen. Der Bootloader übergibt die Befehlszeilenargumente beim Laden an den Kernel (ich kenne den Namen oder die Funktionsweise dieser Konvention nicht, aber es ähnelt wahrscheinlich der Art und Weise, wie eine Anwendung Befehlszeilenargumente von einem aufrufenden Prozess in einem laufenden Kernel empfängt).
Eine dieser Befehlszeilenoptionen ist
root
, wo Sie das Root-Dateisystem angeben können, dhroot=/dev/sda1
.Wenn der Kernel eine initrd verwendet, ist der Bootloader dafür verantwortlich, dem Kernel mitzuteilen, wo er sich befindet, oder die initrd an einem Standardspeicherort abzulegen (glaube ich) - so funktioniert es zumindest auf meinem Guruplug.
Es ist durchaus möglich, dass Sie keine angeben und Ihre Kernel-Panik sofort nach dem Beginn der Beschwerde auftritt, dass kein Root-Dateisystem gefunden wird.
Es gibt möglicherweise andere Möglichkeiten, diese Option an den Kernel weiterzuleiten.
quelle
/dev/sda1
weil es ein Eintrag in einem Dateisystem ist. Sie könntencp -p /dev/sda1 /tmp/foo
und/tmp/foo
würden das gleiche Gerät darstellen. In der Kernel-Befehlszeile verwendet der Kernel einen eingebauten Parser, der der üblichen Gerätenamenskonvention folgt: bezeichnetsda1
die erste Partition der ersten SCSI-ähnlichen Festplatte.initrd
oderinitramfs
ich meine. Es muss eine "einfache" Partition in der/dev/sdx
Form sein?init/do_mounts.c
.Grub hängt die
/boot
Partition ein und führt dann den Kernel aus. In der Konfiguration von Grub wird dem Kernel mitgeteilt, was als Root-Gerät verwendet werden soll.Zum Beispiel in Grub's
menu.lst
:quelle
Komm schon, GRUB "mount" / boot nicht, es liest nur "menu.lst" und einige Module, es ist auch nicht Teil des Linux-Kernels. Wenn Sie den Kernel aufrufen, übergeben Sie mit der Root-Partition ein "root" -Argument. Im schlimmsten Fall weiß der Kernel, dass just / boot gemountet wurde (LOL).
Als nächstes: geekosaur hat recht, Linux verwendet eine erste RAM-Disk im komprimierten Image-Format und hängt dann das echte Root-Dateisystem durch Aufrufen ein
pivot_root
. Linux wird also von einem Image und dann von Ihrem lokalen Laufwerk gestartet.quelle
Der Bootloader, sei es grub oder lilo oder was auch immer, teilt dem Kernel mit, wo er mit dem
root=
Flag suchen soll , und lädt optional eine erste RAM-Disk in den Speicher über,initrd
bevor er den Kernel bootet.Der Kernel lädt dann, testet seine Hardware und Gerätetreiber und durchsucht das System nach dem, was er sehen kann (Sie können diese Diagnoseinformationen durch Eingabe überprüfen
dmesg
; heutzutage scrollt er wahrscheinlich viel zu schnell, um es zu sehen), und versucht dann, die in angegebene Partition zu mounten derroot=
Parameter.Wenn eine initrd vorhanden ist, wird diese zuerst gemountet und alle darauf befindlichen Module / Gerätetreiber werden geladen und geprüft, bevor das Root-Dateisystem gemountet wird. Auf diese Weise können Sie die Treiber für Ihre Festplatten als Module kompilieren und trotzdem booten.
quelle