Inhaltsverzeichnis
Zusammenfassung
Das Booten eines Linux-Systems umfasst mehrere unterschiedliche Komponenten. In diesem Kapitel werden die zu Grunde liegenden Prinzipien erläutert und die beteiligten Komponenten vorgestellt. Außerdem werden in diesem Kapitel das Konzept der Runlevel sowie die Systemkonfiguration von SUSE mit sysconfig
vorgestellt.
Der Linux-Bootvorgang besteht aus mehreren Phasen, von denen jede einer anderen Komponente entspricht. In der folgenden Liste werden der Bootvorgang und die daran beteiligten Komponenten kurz zusammengefasst.
BIOS. Nach dem Einschalten des Computers initialisiert das BIOS den Bildschirm und die Tastatur und testet den Arbeitsspeicher. Bis zu dieser Phase greift der Computer nicht auf Massenspeichergeräte zu. Anschließend werden Informationen zum aktuellen Datum, zur aktuellen Uhrzeit und zu den wichtigsten Peripheriegeräten aus den CMOS-Werten geladen. Wenn die erste Festplatte und deren Geometrie erkannt wurden, geht die Systemsteuerung vom BIOS an den Bootloader über.
Bootloader. Der erste physische 512 Byte große Datensektor der ersten Festplatte wird in den Arbeitsspeicher geladen und der Bootloader, der sich am Anfang dieses Sektors befindet, übernimmt die Steuerung. Die vom Bootloader ausgegebenen Befehle bestimmen den verbleibenden Teil des Bootvorgangs. Aus diesem Grund werden die ersten 512 Byte auf der ersten Festplatte als Master Boot Record (MBR) bezeichnet. Der Bootloader übergibt die Steuerung anschließend an das eigentliche Betriebssystem, in diesem Fall an den Linux-Kernel. Weitere Informationen zu GRUB, dem Linux-Bootloader, finden Sie in Kapitel 9, Der Bootloader.
Kernel und „initramfs“. Um die Systemsteuerung zu übergeben, lädt der Bootloader sowohl den Kernel als auch ein initiales RAM-basiertes Dateisystem (das initramfs) in den Arbeitsspeicher. Der Inhalt des initramfs kann vom Kernel direkt verwendet werden. Das initramfs enthält eine kleine Programmdatei namens „init“, die das Einhängen des eigentlichen Root-Dateisystems ausführt. In früheren Versionen von SUSE Linux wurden diese Tasks von „initrd“ bzw. „linuxrc“ durchgeführt. Weitere Informationen zu initramfs finden Sie in Abschnitt 8.1.1, „initramfs“.
init on initramfs. Dieses Programm führt alle für das Einhängen des entsprechenden Root-Dateisystems erforderlichen Aktionen aus, z. B. das Bereitstellen der Kernel-Funktionalität für die erforderlichen Dateisystem- und Gerätetreiber der Massenspeicher-Controller mit udev. Nachdem das Root-Dateisystem gefunden wurde, wird es auf Fehler geprüft und eingehängt. Wenn dieser Vorgang erfolgreich abgeschlossen wurde, wird das initramfs bereinigt und das init-Programm wird für das Root-Dateisystem ausgeführt. Weitere Informationen zum init-Programm finden Sie in Abschnitt 8.1.2, „init on initramfs“. Weitere Informationen zu udev finden Sie in Kapitel 12, Gerätemanagement über dynamischen Kernel mithilfe von udev.
init. Das init-Programm führt den eigentlichen Bootvorgang des Systems über mehrere unterschiedliche Ebenen aus und stellt dabei die unterschiedlichen Funktionalitäten zur Verfügung. Eine Beschreibung des init-Programms finden Sie in Abschnitt 8.2, „Der init-Vorgang“.
initramfs ist ein kleines cpio-Archiv, das der Kernel auf einen RAM-Datenträger laden kann. Es stellt eine minimale Linux-Umgebung bereit, die das Ausführen von Programmen ermöglicht, bevor das eigentliche Root-Dateisystem eingehängt wird. Diese minimale Linux-Umgebung wird von BIOS-Routinen in den Arbeitsspeicher geladen und hat, abgesehen von ausreichend Arbeitsspeicher, keine spezifischen Hardware-Anforderungen. initramfs muss immer eine Programmdatei namens „init“ zur Verfügung stellen, die das eigentliche init-Programm für das Root-Dateisystem ausführt, damit der Bootvorgang fortgesetzt werden kann.
Bevor das eigentliche Root-Dateisystem eingehängt und das Betriebssystem gestartet werden kann, ist es für den Kernel erforderlich, dass die entsprechenden Treiber auf das Gerät zugreifen, auf dem sich das Root-Dateisystem befindet. Diese Treiber können spezielle Treiber für bestimmte Arten von Festplatten oder sogar Netzwerktreiber für den Zugriff auf ein Netzwerk-Dateisystem umfassen. Die erforderlichen Module für das Root-Dateisystem können mithilfe von init oder initramfs geladen werden. Nachdem die Module geladen wurden, stellt udev das initramfs mit den erforderlichen Geräten bereit. initramfs steht während des gesamten Bootvorgangs zur Verfügung. Dadurch können alle während des Bootvorgangs generierten Gerätereignisse verarbeitet werden.
Wenn in einem installierten System Hardwarekomponenten (Festplatten) ausgetauscht werden müssen und diese Hardware zur Boot-Zeit andere Treiber im Kernel erfordert, müssen Sie das initramfs aktualisieren. Dies erfolgt auf dieselbe Weise wie die Aktualisierung des Vorgängers von initramfs, initrd, nämlich durch den Aufruf von mkinitrd. Durch das Aufrufen von mkinitrd ohne Argumente wird ein initramfs erstellt. Durch das Aufrufen von mkinitrd -R
wird ein initrd erstellt. In SUSE Linux werden die zu ladenden Module durch die Variable INITRD_MODULES
in /etc/sysconfig/kernel
angegeben. Diese Variable wird nach der Installation automatisch auf den richtigen Wert gesetzt. Die Module werden genau in der Reihenfolge geladen, in der sie in INITRD_MODULES
erscheinen. Dies ist besonders wichtig, wenn mehrere SCSI-Treiber verwendet werden, da andernfalls die Namen der Festplatten geändert würden. Genau genommen wäre es ausreichend, nur die für den Zugriff auf das Root-Dateisystem erforderlichen Treiber zu laden. Es werden jedoch alle für die Installation erforderlichen SCSI-Treiber mit initramfs oder initrd geladen, da das Laden zu einem späteren Zeitpunkt problematisch sein könnte.
Aktualisieren von initramfs oder initrd | |
---|---|
Der Bootloader lädt initramfs oder initrd auf dieselbe Weise wie den Kernel. Es ist nicht erforderlich, GRUB nach der Aktualisierung von initramfs oder initrd neu zu installieren, da GRUB beim Booten das Verzeichnis nach der richtigen Datei durchsucht. |
Der Hauptzweck von init unter initramfs ist es, das Einhängen des eigentlichen Root-Dateisystems sowie den Zugriff darauf vorzubereiten. Je nach aktueller Systemkonfiguration ist init für die folgenden Tasks verantwortlich.
Je nach Hardwarekonfiguration sind für den Zugriff auf die Hardwarekomponenten des Computers (vor allem auf die Festplatte) spezielle Treiber erforderlich. Für den Zugriff auf das eigentliche Root-Dateisystem muss der Kernel die entsprechenden Dateisystemtreiber laden.
Für jedes geladene Modul generiert der Kernel Geräteergebnisse. udev verarbeitet diese Ergebnisse und generiert die erforderlichen speziellen Dateien für das Gerät auf einem RAM-Dateisystem in /dev
. Ohne diese speziellen Dateien wäre ein Zugriff auf das Dateisystem nicht möglich.
Wenn Ihr System so konfiguriert ist, dass das Root-Dateisystem sich unter RAID oder LVM befindet, richtet init LVM oder RAID so ein, dass der Zugriff auf das Root-Dateisystem zu einem späteren Zeitpunkt erfolgt. Informationen zu RAID finden Sie in Abschnitt 2.2, „Soft-RAID-Konfiguration“. Informationen zu LVM finden Sie in Abschnitt 2.1, „LVM-Konfiguration“.
Wenn Ihr System für die Verwendung eines Netzwerk-eingehängten Root-Dateisystems (über NFS eingehängt) konfiguriert ist, muss init sicherstellen, dass die entsprechenden Netzwerktreiber geladen und für den Zugriff auf das Root-Dateisystem eingerichtet werden.
Wenn init im Rahmen des Installationsvorgangs während des anfänglichen Bootvorgangs aufgerufen wird, unterscheiden sich seine Tasks von den zuvor beschriebenen:
Wenn Sie den Installationsvorgang starten, lädt Ihr Computer vom Installationsmedium einen Installations-Kernel und ein spezielles initrd mit dem YaST-Installationsprogramm. Das YaST-Installationsprogramm, das in einem RAM-Dateisystem ausgeführt wird, benötigt Daten über den aktuellen Speicherort des Installationsmediums, um auf dieses zugreifen und das Betriebssystem installieren zu können.
Wie unter Abschnitt 8.1.1, „initramfs“ beschrieben, startet der Bootvorgang mit einem Mindestsatz an Treibern, die für die meisten Hardwarekonfigurationen verwendet werden können. init startet einen anfänglichen Hardware-Scan-Vorgang, bei dem die für die Hardwarekonfiguration geeigneten Treiber ermittelt werden. Diese Werte werden später in INITRD_MODULES
in /etc/sysconfig/kernel
geschrieben, um allen weiteren Bootvorgängen die Verwedung eines benutzerdefinierten initrd zu ermöglichen, bzw. in eine Datei namens /etc/sysconfig/hardware/hwconfig-*
, wenn das Gerät während des Bootvorgangs nicht benötigt wird. Während des Installationsvorgangs lädt init die entsprechenden Modulsätze.
Sobald die Hardware erfolgreich erkannt und die entsprechenden Treiber geladen wurden und udev die speziellen Gerätedateien erstellt hat, startet init das Installationssystem, das das eigentliche YaST-Installationsprogramm bzw. das Rettungssystem enthält.
init startet schließlich YaST, das wiederum die Paketinstallation und die Systemkonfiguration startet.