systemdjournalctl: Abfragen des systemd-Journalsudev
Das Booten eines Linux-Systems umfasst verschiedene Komponenten und Tasks. Die Hardware selbst wird vom BIOS oder dem UEFI initialisiert, das den Kernel mithilfe eines Bootloaders startet. Anschließend wird der Bootvorgang vollständig vom Betriebssystem gesteuert und über systemd abgewickelt. systemd bietet eine Reihe von „Zielen“, mit denen Konfigurationen für den normalen Gebrauch, für Wartungsarbeiten oder für Notfälle gebootet werden.
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/UEFI. Nach dem Einschalten des Computers initialisiert das BIOS oder das UEFI den Bildschirm und die Tastatur und testet den Hauptspeicher. 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 Systemkontrolle vom BIOS an den Bootloader über. Wenn das BIOS Netzwerk-Booting unterstützt, ist es auch möglich, einen Boot-Server zu konfigurieren, der den Bootloader bereitstellt. Auf x86_64-Systemen ist PXE-Boot erforderlich. Andere Architekturen verwenden meist das BOOTP-Protokoll, um den Bootloader abzurufen.
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 2, dem Linux-Bootloader, finden Sie unter Kapitel 13, Der Bootloader GRUB 2. Bei einem Netzwerk-Boot fungiert das BIOS als Bootloader. Es erhält das Boot-Image vom Boot-Server und startet das System. Dieser Vorgang ist vollständig unabhängig von den lokalen Festplatten.
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. Die Inhalte der Datei initramfs können direkt vom Kernel verwendet werden. initramfs enthält eine kleine ausführbare Datei namens init, die das Einhängen des Root-Dateisystems übernimmt. Spezielle Hardware-Treiber für den Zugriff auf den Massenspeicher müssen in initramfs vorhanden sein. Weitere Informationen zu initramfs finden Sie unter Abschnitt 10.2, „initramfs“. Wenn das System über keine lokale Festplatte verfügt, muss initramfs das Root-Dateisystem für den Kernel bereitstellen. Dies kann mithilfe eines Netzwerkblockgeräts, wie iSCSI oder SAN, bewerkstelligt werden, es kann aber auch NFS als Root-Gerät eingesetzt werden.
init-VorgängeDerzeit gibt es zwei unterschiedliche Programme mit dem Namen „init“:
der initramfs-Vorgang, mit dem das Root-Dateisystem eingehängt wird
der Betriebssystemvorgang, mit dem das System eingerichtet wird
Die beiden Vorgänge werden in diesem Kapitel daher als „init unter initramfs“ bzw. „systemd“ bezeichnet.
init unter initramfs.
Dieses Programm führt alle erforderlichen Aktionen aus, mit denen das eigentliche Root-Dateisystem eingehängt wird. Es bietet Kernel-Funktionen für das benötigte Dateisystem sowie Gerätetreiber für Massenspeicher-Controller mit udev. Nachdem das Root-Dateisystem gefunden wurde, wird es auf Fehler geprüft und eingehängt. Wenn dieser Vorgang erfolgreich ist, wird das initramfs bereinigt, und der systemd-Daemon wird für das Root-Dateisystem ausgeführt. Weitere Informationen zu init unter initramfs finden Sie unter Abschnitt 10.3, „init unter initramfs“. Weitere Informationen zu udev finden Sie in Kapitel 17, Gerätemanagement über dynamischen Kernel mithilfe von udev.
systemd.
systemd wickelt das eigentliche Booten des Systems ab; hierzu werden Dienste gestartet und Dateisysteme eingehängt. systemd wird in Kapitel 11, Der Daemon systemd beschrieben.
initramfs #
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 durch eine BIOS- oder UEFI-Routine in den Arbeitsspeicher geladen, wobei lediglich ausreichend Arbeitsspeicher zur Verfügung stehen muss; ansonsten gelten keine besonderen Anforderungen. Das initramfs-Archiv must stets eine ausführbare Datei mit der Bezeichnung init umfassen, die den systemd-Daemon auf dem Root-Dateisystem ausführt, so dass der Bootvorgang fortgesetzt werden kann.
Bevor das 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. Später im Boot-Vorgang, nach dem Ändern des Root-Dateisystems, müssen die Geräte regeneriert werden. Hierzu wird die systemd-Einheit udev.service mit dem Kommando udevtrigger verwendet.
Wenn in einem installierten System Hardwarekomponenten (z. B. Festplatten) ausgetauscht werden müssen und diese Hardware zur Boot-Zeit andere Treiber im Kernel erfordert, müssen Sie die Datei initramfs aktualisieren. Dies erfolgt durch Aufruf von dracut (durch -f-f wird die bestehende initramfs-Datei überschrieben). Zum Hinzufügen eines Treibers für die neue Hardware müssen Sie der Datei /etc/dracut.conf.d/01-dist.conf folgende Zeile hinzufügen.
force_drivers+="driver1"
Ersetzen Sie dabei driver1 durch den Modulnamen des Treibers. Sie können auch mehrere Treiber hinzufügen. In diesem Fall geben Sie eine durch Leerzeichen getrennte Liste der Modulnamen ein (driver1 driver2).
initramfs oder init
Der Bootloader lädt initramfs oder init auf dieselbe Weise wie den Kernel. Es ist nicht erforderlich, GRUB 2 nach der Aktualisierung von initramfs oder init neu zu installieren, da GRUB 2 beim Booten das Verzeichnis nach der richtigen Datei durchsucht.
initramfs #
Der Hauptzweck von init unter initramfs ist es, das Einhängen des eigentlichen Root-Dateisystems sowie die Vorbereitung des Zugriffs darauf. Je nach aktueller Systemkonfiguration ist init unter initramfs für die folgenden Tasks verantwortlich.
Je nach Hardware-Konfiguration sind für den Zugriff auf die Hardware-Komponenten 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.
Der Kernel generiert Geräteereignisse für alle geladenen Module. udev verarbeitet diese Ereignisse und generiert die erforderlichen blockspezifischen Dateien auf einem RAM-Dateisystem im Verzeichnis /dev. Ohne diese speziellen Dateien wäre ein Zugriff auf das Dateisystem und andere Geräte nicht möglich.
Wenn Ihr System so konfiguriert ist, dass das Root-Dateisystem sich unter RAID oder LVM befindet, richtet init unter initramfs LVM oder RAID so ein, dass der Zugriff auf das Root-Dateisystem zu einem späteren Zeitpunkt erfolgt. Informationen über RAID und LVM finden Sie in Kapitel 12, Fortgeschrittene Festplattenkonfiguration, Bereitstellungshandbuch .
Wenn Ihr System für die Verwendung eines netzwerkeingehängten Root-Dateisystems (über NFS eingehängt) konfiguriert ist, muss init unter initramfs sicherstellen, dass die entsprechenden Netzwerktreiber geladen und für den Zugriff auf das Root-Dateisystem eingerichtet werden.
Wenn sich das Dateisystem auf einem Netzwerkblockgerät wie iSCSI oder SAN befindet, wird die Verbindung zum Speicherserver ebenfalls vom init unter initramfs eingerichtet.
Wenn init unter initramfs im Rahmen des Installationsvorgangs während des anfänglichen Boot-Vorgangs aufgerufen wird, unterscheiden sich seine Tasks von den oben beschriebenen:
Beim Starten des Installationsvorgangs lädt der Rechner einen Installations-Kernel und eine besondere Einheit mit dem YaST-Installationsprogramm. Das YaST-Installationsprogramm wird in einem RAM-Dateisystem ausgeführt und benötigt Daten über den Speicherort des Installationsmediums, um auf dieses zugreifen und das Betriebssystem installieren zu können.
Wie unter Abschnitt 10.2, „initramfs“ beschrieben, startet der Boot-Vorgang 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 Treiber werden zur Erstellung der zum Booten des Systems benötigten, benutzerdefinierten initramfs-Datei verwendet. Falls die Module nicht für "boot", sondern für "coldplug" benötigt werden, können sie mit systemd geladen werden. Weitere Informationen finden Sie unter Abschnitt 11.6.3, „Laden der Kernelmodule“.
Sobald die Hardware ordnungsgemäß erkannt wurde, werden die entsprechenden Treiber geladen. Das udev-Programm erstellt die speziellen Gerätedateien, und init startet das Installationssystem mit dem YaST-Installationsprogramm.
init startet schließlich YaST, das wiederum die Paketinstallation und die Systemkonfiguration startet.