Inhaltsverzeichnis
Zusammenfassung
Bei einem Linux-System ist der Bootvorgang ein komplexer Prozess, an dem
viele Komponenten beteiligt sind, die alle reibungslos zusammenarbeiten
müssen. Dieses Kapitel gibt eine Einführung in die zugrunde liegenden
Mechanismen und die am Bootvorgang beteiligten Komponenten. Außerdem werden
Sie mit dem Konzept von Runlevels sowie mit der Konfiguration eines
SUSE-Systems mittels sysconfig vertraut gemacht.
Bei Linux besteht der Bootvorgang aus verschiedenen Stufen. Jede davon wird von einer bestimmten Komponente übernommen. Die folgende Aufzählung gibt einen Überblick über den Bootvorgang und eine kurze Beschreibung der daran beteiligten Hauptkomponenten.
BIOS
Nach dem Einschalten des Rechners werden vom BIOS Bildschirm und Tastatur initialisiert sowie der Hauptspeicher getestet. Massenspeichergeräte sind zu diesem Zeitpunkt noch nicht am Bootvorgang beteiligt. Zunächst werden Informationen über das aktuelle Datum, die Uhrzeit und die wichtigsten angeschlossenen Geräte aus den CMOS-Werten (CMOS Setup) ausgelesen. Wenn die erste Festplatte samt ihrer Geometrie bekannt ist, geht die Kontrolle über das System vom BIOS auf den Bootloader über.
Bootloader
Der physikalisch erste Datensektor von 512 Byte Größe wird von der ersten Festplatte in den Speicher geladen und das Programm (der Bootloader) am Anfang dieses Sektors übernimmt die Kontrolle. Die Abfolge der vom Bootloader ausgeführten Anweisungen bestimmt den weiteren Ablauf des Bootvorgangs. Die ersten 512 Byte auf der ersten Festplatte werden deshalb auch als Master Boot Record bezeichnet. Der Bootloader übergibt schließlich die Kontrolle an das eigentliche Betriebssystem, in unserem Falle also an den Linux-Kernel. Näheres zum Linux-Bootloader GRUB finden Sie in Kapitel 8, Der Bootloader.
Kernel und initrd
Neben dem Kernel wird außerdem die initrd in den Speicher geladen, das heißt eine virtuelle oder RAM-Disk zur Hardware-Initialisierung. Der Linux-Kernel kann nämlich noch vor dem Mounten der eigentlichen Root-Partition ein kleines Dateisystem in einer solchen RAM-Disk ansprechen, um dort bestimmte Programme auszuführen. Die initrd wird dazu vom Kernel entpackt und dann als temporäre Root-Partition gemountet. Der Inhalt dieses initrd-Dateisystems ist ein minimales Linux-System, dass ein Programm namens linuxrc enthält. Dieses Programm wird gestartet, bevor die eigentliche Root-Partition eingebunden wird. Nachdem linuxrc seine Aufgabe erfüllt hat, löscht der Kernel die gesamte initrd aus dem Speicher (falls dies möglich ist) und startet das Programm init. Weitere Informationen zur initrd finden Sie unter Abschnitt 7.1.1, „initrd“.
linuxrc
Dieses Programm führt alle Aktionen aus, die zum Mounten der eigentlichen Root-Partition erforderlich sind, wie die Bereitstellung von Kernel-Funktionen für das Dateisystem und Gerätetreiber für Massenspeicher-Controller. Nachdem die Root-Partition gemountet ist, beendet sich linuxrc, und der Kernel startet das Programm init. Weitere Informationen zu linuxrc finden Sie unter Abschnitt 7.1.2, „linuxrc“.
init
Dieses Programm ist für den eigentlichen Systemstart verantwortlich, bei dem eine Reihe von Funktionsebenen abgearbeitet werden. init wird unter Abschnitt 7.2, „Das init-Programm“ genauer beschrieben.
Bei initrd handelt es sich um ein kleines (üblicherweise komprimiertes) Dateisystem, das in eine RAM-Disk geladen und dann als temporäre Root-Partition eingebunden werden kann. Dieses minimale Linux-System wird von BIOS-Routinen in den Arbeitsspeicher geladen und hat keine speziellen Hardwareanforderungen außer dem Bedürfnis nach einem ausreichend großen Speicher. Die initrd muss immer ein Programm namens linuxrc bereitstellen, dass ohne Fehler abgeschlossen werden muss.
Bevor die Root-Partition eingebunden und das System gestartet werden kann, muss der Kernel über die entsprechenden Treiber verfügen, um Zugriff auf das Gerät zu erhalten, auf dem sich dieses Dateisystem befindet. Dies können spezielle Treiber für bestimmte Festplatten sein, aber auch Netzwerktreiber (denn es kann sich dabei auch um ein Netzwerk-Dateisystem handeln — siehe Vorbereitung des Netzwerks). Zusätzlich muss der Kernel über die Treiber zum Lesen des eigentlichen Dateisystems der initrd verfügen. Die für das Root-Dateisystem benötigten Module können von linuxrc geladen werden.
Eine initrd kann mit dem Skript
mkinitrd erstellt werden. Bei SUSE LINUX werden die zu
ladenden Treibermodule unter der Variablen
INITRD_MODULES in der Datei
/etc/sysconfig/kernel angegeben.
Nach der Installation des Systems ist diese Variable bereits auf den
korrekten Wert gesetzt (da linuxrc die während der Installation geladenen
Treiber automatisch ermittelt und hier abspeichert). Die Treibermodule
werden in genau der Reihenfolge geladen, in der sie unter
INITRD_MODULES angegeben sind. Dies ist besonders
dann von Belang, wenn mehrere SCSI-Treiber verwendet werden, denn nur mit
der richtigen Reihenfolge kann man vermeiden, dass die Bezeichnungen von
Festplatten vertauscht werden. Streng genommen müsste man zu diesem
Zeitpunkt nur die Treiber laden, die für den Zugriff auf die Root-Partition
notwendig sind. Tatsächlich werden jedoch alle für die Installation
erforderlichen SCSI-Treiber schon mittels initrd geladen, denn ein späteres
Laden solcher Treiber würde zu Problemen führen.
![]() | Aktualisierung der initrd |
|---|---|
Der Bootloader lädt die initrd in der gleichen Weise wie den Kernel. Daher ist es nach einer Aktualisierung der initrd nicht erforderlich, GRUB neu zu installieren. GRUB durchsucht beim Booten das entsprechende Verzeichnis nach der passenden Datei. | |
Das Programm linuxrc ist hauptsächlich dafür verantwortlich, das Mounten und den Zugriff auf die eigentliche Root-Partition zu ermöglichen. Je nach der Konfiguration des System werden dabei die folgenden Schritte abgearbeitet:
In Abhängigkeit von der bestehenden Hardware-Konfiguration werden spezielle Treiber für den Zugriff auf einzelne Komponenten geladen (wobei die Festplatte meist die wichtigste davon ist). Außerdem werden Treibermodule für den Zugriff auf das eigentliche Dateisystem geladen.
Wenn Ihr System so konfiguriert ist, dass die Root-Partition in einem RAID- oder LVM-Schema enthalten ist, so startet linuxrc RAID bzw. LVM, um später Zugriff auf das entsprechende Dateisystem zu erlauben. Informationen über RAID finden sie unter Abschnitt 3.8, „Konfiguration von Soft-RAID“, und über LVM unter Abschnitt 3.7, „LVM-Konfiguration“.
Wenn das System so konfiguriert ist, dass die Root-Partition übers Netzwerk geladen werden soll (mittels NFS), wird linuxrc sicherstellen, dass die erforderlichen Netzwerk-Treiber geladen werden, und dass das Netzwerk für den Zugriff auf das Dateisystem eingerichtet wird.
Während einer Installation wird linuxrc ebenfalls beim erstmaligen Booten ausgeführt. Die dabei abgearbeiteten Schritte unterscheiden sich von den Obengenannten:
Zu Beginn der Installation wird von der Installationsquelle ein Installations-Kernel und eine spezielle initrd mit dem YaST-Installationsprogramm geladen. Das YaST-Installationsprogramm, das von einem virtuellen Dateisystem läuft, muss über den Ort der Installationsquelle informiert sein, damit es darauf zugreifen und das Betriebssystem installieren kann.
Wie im Abschnitt 7.1.1, „initrd“ erwähnt, wird der Bootvorgang
mit einer minimalen Auswahl an Treibern begonnen, die für die meisten
Hardware-Kombinationen geeignet ist. Zur Ermittlung der passenden Treiber
für Ihr System startet linuxrc dann einen Prozess zur Hardware-Erkennung.
Die ermittelten Werte werden zum einen unter der Variablen
INITRD_MODULES in der Datei
/etc/sysconfig/kernel eingetragen und können später
zum Booten mit einer modifizierten initrd verwendet werden. Zum anderen
verwendet linuxrc die ermittelten Werte, um die entsprechenden Treiber
für die Installation zu laden.
Sobald die Hardware erkannt und die passenden Treiber geladen sind, startet linuxrc das Installationssystem, also das eigentliche YaST-Installationsprogramm bzw. das Rettungssystem.
Abschließend startet linuxrc YaST, mit dem sich die Pakete installieren lassen und das System konfiguriert werden kann.