GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie mountet ein Kernel die Root-Partition?

In alten Zeiten war der Kernel fest codiert, um die Major/Minor-Gerätenummer des Root-fs zu kennen und dieses Gerät zu mounten, nachdem alle Gerätetreiber initialisiert wurden, die in den Kernel eingebaut waren. Der rdev Dienstprogramm verwendet werden, um die Root-Gerätenummer im Kernel-Image zu ändern, ohne es neu kompilieren zu müssen.

Schließlich kamen Bootloader daher und konnten eine Befehlszeile an den Kernel übergeben. Wenn die root= Es wurde ein Argument übergeben, das dem Kernel mitteilte, wo sich das Root-fs anstelle des eingebauten Werts befindet. Die für den Zugriff benötigten Treiber mussten noch in den Kernel eingebaut werden. Während das Argument wie ein normaler Geräteknoten in /dev aussieht Verzeichnis gibt es offensichtlich kein /dev Verzeichnis, bevor das Root-FS gemountet wird, sodass der Kernel dort keinen dev-Knoten suchen kann. Stattdessen sind bestimmte bekannte Gerätenamen fest in den Kernel codiert, sodass die Zeichenfolge in die Gerätenummer übersetzt werden kann. Aus diesem Grund kann der Kernel Dinge wie /dev/sda1 erkennen , aber keine exotischeren Dinge wie /dev/mapper/vg0-root oder eine Volume-UUID.

Später die initrd kam ins Bild. Zusammen mit dem Kernel würde der Bootloader den initrd laden image, das eine Art komprimiertes Dateisystem-Image war (gzipptes ext2-Image, gzipptes romfs-Image, squashfs wurde schließlich dominant). Der Kernel würde dieses Image in eine Ramdisk dekomprimieren und die Ramdisk als Root-FS einhängen. Dieses Image enthielt einige zusätzliche Treiber und Bootskripte anstelle eines echten init . 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 parsen, um das echte Root zu finden, das nun durch UUID, Volume-Label und andere erweiterte Dinge angegeben werden konnte. Es hat dann das echte Root-FS in /initrd gemountet , dann pivot_root ausgeführt Systemaufruf, um den Kernel-Swap / zu veranlassen und /initrd , dann /sbin/init ausführen auf der realen Wurzel, die dann /initrd aushängen würde und geben Sie die Ramdisk frei.

Endlich haben wir heute den initramfs . Dies ähnelt dem initrd , aber anstatt ein komprimiertes Dateisystem-Image zu sein, das in eine Ramdisk geladen wird, ist es ein komprimiertes cpio-Archiv. Als Root wird ein tmpfs gemountet und das Archiv dort entpackt. Anstatt pivot_root zu verwenden , der als schmutziger Hack galt, der initramfs Boot-Skripte mounten das echte Stammverzeichnis in /root , löschen Sie alle Dateien im Stammverzeichnis von tmpfs, dann chroot in /root , und führen Sie /sbin/init aus .


Linux bootet zunächst mit einer Ramdisk (genannt initrd , für „INITial RamDisk“) als / . Auf dieser Festplatte ist gerade genug Platz, um die echte Root-Partition zu finden (einschließlich aller erforderlichen Treiber- und Dateisystemmodule). Es mountet die Root-Partition auf einem temporären Mount-Punkt auf initrd , ruft dann pivot_root(8) auf um die Root- und temporären Einhängepunkte auszutauschen, wobei initrd übrig bleibt in der Lage, umount zu sein ed und das eigentliche Root-Dateisystem auf / .


Klingt so, als würden Sie fragen, woher der Kernel „weiß“, welche Partition die Root-Partition ist, ohne Zugriff auf Konfigurationsdateien in /etc.

Der Kernel kann Befehlszeilenargumente wie jedes andere Programm 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 an den Kernel, wenn er ihn lädt (ich kenne den Namen oder die Mechanik dieser Konvention nicht, aber es ist wahrscheinlich ähnlich, wie eine Anwendung Befehlszeilenargumente von einem aufrufenden Prozess in einem laufenden Kernel erhält). /P>

Eine dieser Befehlszeilenoptionen ist root , wo Sie das Root-Dateisystem angeben können, z. B. root=/dev/sda1 .

Wenn der Kernel eine initrd verwendet, ist der Bootloader dafür verantwortlich, dem Kernel mitzuteilen, wo sie sich befindet, oder die initrd an einem Standardspeicherort abzulegen (glaube ich) - so funktioniert es zumindest auf meinem Guruplug.

Es ist durchaus möglich, keines anzugeben und sofort nach dem Start eine Kernel-Panik zu bekommen, die sich darüber beschwert, dass es kein Root-Dateisystem finden kann.

Es könnte andere Möglichkeiten geben, diese Option an den Kernel weiterzugeben.


Linux
  1. Wie kann ich von der Befehlszeile aus mounten, wie es Nautilus tut?

  2. So ändern Sie das MySQL-Root-Passwort

  3. Wie bestimmt der Linux-Kernel die Reihenfolge der __init-Aufrufe?

  4. Wie überprüfe ich HZ im Terminal?

  5. Wie findet mein Browser die nächsten DNS-Root-Server?

So mounten Sie eine NTFS-Partition unter Linux

So überprüfen Sie die Kernel-Version in Linux

Wie wird eine verschlüsselte Truecrypt-Partition immer am selben Punkt gemountet?

So ändern Sie das Root-Passwort unter Linux

Wie lädt Linux das 'initrd'-Image?

Wie funktioniert die Loopback-Schnittstelle?