Kapitel 3. Die Systeminitialisierung

Inhaltsverzeichnis

3.1. Ein Überblick über den Bootstrap-Prozess
3.1.1. Stufe 1: das BIOS
3.1.2. Stufe 2: der Bootloader
3.1.3. Stufe 3: das Mini-Debian-System
3.1.4. Stufe 4: das normale Debian-System
3.2. SysV-ähnlicher init
3.2.1. Die Bedeutung der Runlevel
3.2.2. Die Konfiguration der Runlevel
3.2.3. Ein Beispiel für die Runlevel-Verwaltung
3.2.4. Die Standardparameter für jedes init-Skript
3.2.5. Der Rechnername
3.2.6. Das Dateisystem
3.2.7. Initialisierung der Netzwerkschnittstellen
3.2.8. Initialisierung der Netzwerkdienste
3.2.9. Die Systemnachricht
3.2.10. Die Kernel-Nachricht
3.3. Das udev-System
3.3.1. Die Kernel-Modul-Initialisierung

Für Sie als Systemadministrator ist es klug, grob zu wissen, wie das Debian-System gestartet und konfiguriert wird. Obwohl die genauen Details in den Quelldateien der installierten Pakete und deren Dokumentation zu finden sind, ist dies für die meisten von uns ein bisschen viel.

Ich habe mein bestes gegeben, um einen schnellen Überblick über die Kernthemen des Debian-Systems und dessen Konfiguration für Sie als Referenz bereitzustellen, basierend auf dem aktuellen und früheren Wissen von mir und anderen. Da das Debian-System ein sich änderndes Ziel ist, könnte sich die Situation über das System verändert haben. Bevor Sie irgendwelche Änderungen an dem System vornehmen, sollten Sie die aktuellste Dokumentation der jeweiligen Pakete zu Rate ziehen.

Das Computer-System durchläuft verschiedene Phasen des Bootstrap-Prozesses vom Einschalten bis zur Bereitstellung des funktionalen Betriebssytems (engl. operating system, OS) an den Benutzer.

Der Einfachheit halber beschränke ich die Betrachtung auf die typische PC-Plattform mit der Standardinstallation.

Der typische Bootstrap-Prozess ist wie eine 4-stufige Rakete. Jede Stufe übergibt die Systemkontrolle an die jeweils nachfolgende Stufe.

Natürlich können diese unterschiedlich konfiguriert werden. Wenn Sie zum Beispiel Ihren eigenen Kernel kompilieren, werden Sie unter Umständen den Schritt mit dem Mini-Debian-System überspringen. Gehen Sie daher nicht davon aus, dass dies alles in Ihrem Fall zutrifft, solange Sie es nicht selbst überprüft haben.

[Anmerkung] Anmerkung

Bei ungewöhnlichen Computer-Plattformen wie dem SUN- oder dem Macintosh-System könnten das BIOS im ROM und die Partitionen auf der Festplatte sich stark unterscheiden (Abschnitt 9.5.2, „Disk partition configuration“). Bitte suchen Sie in solch einem Fall an anderer Stelle nach Plattform-spezifischer Dokumentation.

Das BIOS ist die erste Stufe des Boot-Prozesses und wird durch das Einschalten gestartet. Es ist im Nur-Lese-Speicher (read only memory/ROM) beherbergt und wird von der speziellen Speicheradresse ausgeführt, auf den der Programmzähler der CPU durch den Einschaltvorgang verwiesen wird.

Das BIOS führt die grundsätzliche Initialisierung der Hardware durch (POST: power on self test / Selbsttest nach dem Einschalten) und übergibt die Systemkontrolle an die nächste, von Ihnen bereitgestellte Stufe. Das BIOS wird üblicherweise mit der Hardware geliefert.

Im BIOS-Startbildschirm wird für gewöhnlich angezeigt, welche Taste(n) Sie drücken müssen, um das BIOS-Setup zu erreichen, in dem das Verhalten des BIOS konfiguriert werden kann. Typisch hierfür sind F1, F2, F10, Esc, Einfg und Entf. Wenn Ihr BIOS-Startbildschirm durch eine hübsche grafische Anzeige versteckt wird, müssen Sie eventuell eine oder mehrere Tasten wie z.B. Esc drücken, um diese Anzeige abzuschalten. Die dazu benötigten Tasten sind stark von der Hardware abhängig.

Die Hardware und die Reihenfolge des Codes, der durch das BIOS gestartet wird, kann über das BIOS-Setup ausgewählt werden. Typischerweise werden die ersten paar Sektoren des ersten gefundenen, vorgewählten Gerätes (Festplatte, Diskette, CD-ROM, …) in den Speicher geladen und dieser initiale Code wird dann ausgeführt. Das kann folgendes sein:

  • Der Bootloader-Code

  • Der Kernel-Code des Ursprungs-Betriebssystems wie z.B. FreeDOS

  • Der Kernel-Code des Ziel-Betriebssystems, falls es in diesen kleinen Speicherbereich passt

Gewöhnlich wird das System von der angegebenen Partition der primären Festplatte gestartet. Die ersten zwei Sektoren der Festplatte enthalten auf normalen PC-Systemen den Master Boot Record (MBR). Die Partitionsinformationen inklusive der Boot-Auswahl ist am Ende dieses MBR gespeichert. Der in der ersten Stufe vom BIOS ausgeführte Bootloader-Code liegt im Rest dieses MBR.

Der Bootloader ist die zweite Stufe des Boot-Prozesses und wird durch das BIOS gestartet. Er lädt das System-Kernel-Image und das initrd-Image in den Speicher und übergibt diesen die Kontrolle. Das initrd-Image ist ein Abbild des Wurzeldateisystems und seine Unterstützung hängt von dem verwendeten Bootloader ab.

Das Debian-System nutzt normalerweise den Linux-Kernel als Standard-System-Kernel. Das initrd-Image des aktuellen 2.6/3.x-Linux-Kernels ist technisch gesehen ein initramfs-Image (initial RAM filesystem). Das initramfs-Image ist ein mit gzip komprimiertes cpio-Archiv der Dateien im Wurzeldateisystem.

Eine Standardinstallation des Debian-Systems auf der PC-Plattform platziert die erste Stufe des GRUB-Bootloaders in den MBR. Es sind allerdings viele Bootloader und Konfigurationsoptionen verfügbar.


[Warnung] Warnung

Spielen Sie nicht mit Bootloadern herum, ohne boot-fähige Rettungsmedien (CD oder Diskette) zur Hand zu haben, die von Images im grub-rescue-pc-Paket erstellt wurden. Damit können Sie Ihr System auch ohne funktionsfähigen Bootloader auf der Festplatte starten.

Bei GRUB Legacy ist die Datei zur Konfiguration des Menüs unter "/boot/grub/menu.lst" abgelegt. Sie enthält zum Beispiel Einträge wie den folgenden:

title           Debian GNU/Linux
root            (hd0,2)
kernel          /vmlinuz root=/dev/hda3 ro
initrd          /initrd.img

Bei GRUB 2 ist die Datei zur Konfiguration des Menüs unter "/boot/grub/grub.cfg" gespeichert. Sie wird automatisch durch "/usr/sbin/update-grub" unter Verwendung von Vorlagen aus "/etc/grub.d/*" und Einstellungen aus "/etc/default/grub" erzeugt. Die Einträge sehen aus wie folgt:

menuentry "Debian GNU/Linux" {
        set root=(hd0,3)
        linux /vmlinuz root=/dev/hda3
        initrd /initrd.img
}

Bei diesen Beispielen bedeuten diese GRUB-Parameter folgendes:


[Anmerkung] Anmerkung

Der Wert der Partitionsnummer, wie er von GRUB Legacy verwendet wird, ist um 1 kleiner als der normal durch den Linux-Kernel und andere Werkzeuge genutzte. Das GRUB-2-Programm behebt dieses Problem.

[Tipp] Tipp

UUID (lesen Sie dazu Abschnitt 9.5.3, „Accessing partition using UUID“) können statt dem Gerätenamen (z.B. "/dev/hda3") genutzt werden, um ein block-orientiertes Gerät eindeutig zu identifizieren, z.B. mittels "root=UUID=81b289d5-4341-4003-9602-e254a17ac232 ro".

[Tipp] Tipp

Sie können einen Bootloader durch einen anderen Bootloader starten, diese Technik nennt man Chain loading.

Weitere Infos finden Sie unter "info grub" und grub-install(8).

Das Mini-Debian-System ist die dritte Stufe des Boot-Prozesses und wird durch den Bootloader gestartet. Es lässt den System-Kernel mit seinem eigenen Wurzeldateisystem im Speicher laufen. Dies ist ein optionaler, vorbereitender Schritt des Boot-Prozesses.

[Anmerkung] Anmerkung

Der Begriff "Mini-Debian-System" wurde von dem Autor erfunden, um diese dritte Stufe des Boot-Prozesses in diesem Dokument zu beschreiben. Dieses System wird normalerweise initrd- oder initramfs-System genannt. Ein ähnliches System wird im Speicher auch durch den Debian Installer verwendet.

Das "/init"-Skript wird als erstes Programm in diesem Wurzeldateisystem im Speicher ausgeführt. Es ist ein Shell-Skript, das den Kernel im Userspace initialisiert und die Kontrolle an die nächste Stufe übergibt. Dieses Mini-Debian-System bietet Flexibilität für den Boot-Prozess, um zum Beispiel Kernel-Module vor dem Hauptteil des Boot-Prozesses hinzuzufügen oder um das Wurzeldateisystem als verschlüsseltes Dateisystem einzubinden.

Sie können diesen Teil des Boot-Prozesses unterbrechen, um eine root-Shell zu bekommen, indem Sie "break=init" usw. zu den Kernel-Boot-Parametern hinzufügen. Informationen zu weiteren Unterbrechungsmöglichkeiten finden Sie im "/init"-Skript. Diese Shell-Umgebung ist ausgeklügelt genug, um eine gute Überprüfung der Hardware Ihrer Maschine zu ermöglichen.

Die verfügbaren Befehle in diesem Mini-Debian-System gehen auf ein GNU-Werkzeug namens busybox(1) zurück und werden auch hauptsächlich von diesem bereitgestellt.

[Achtung] Achtung

Sie müssen die Option "-n" für den mount-Befehl verwenden, wenn Sie sich im Nur-Lese-Wurzeldateisystem befinden.

Das normale Debian-System ist die vierte Stufe des Boot-Prozesses und wird von dem Mini-Debian-System gestartet. Der System-Kernel des Mini-Debian-Systems läuft in dieser Umgebung weiter. Das verwendete Wurzeldateisystem wird von dem im Arbeitsspeicher umgeschwenkt zu dem auf der echten Festplatte.

Das Programm init wird als erstes Programm mit PID=1 ausgeführt, um den Hauptprozess zum Starten verschiedener Programme durchzuführen. Der Standardpfad zum init-Programm ist "/sbin/init", aber er kann über einen Kernel-Boot-Parameter wie "init=/pfad/zum/init-programm" geändert werden.

Das Standard-init-Programm wurde geändert:

  • Debian verwendete vor Squeeze das einfache SysV-ähnliche init.

  • Ab Debian Wheezy wurde das SysV-ähnliche init durch die Sortierung der Boot-Reihenfolge mittels LSB-Header und parallen Start der Boot-Skripte verbessert.

  • Debian könnte nach Wheezy sein init-System auf neuere Systeme wie upstart, systemd, … umstellen.

[Tipp] Tipp

Alle Boot-Mechanismen sind durch die Skripte "/etc/init.d/rc", "/etc/init.d/rcS", "/usr/sbin/update-rc.d" und "/usr/sbin/invoke-rc.d" kompatibel.

[Tipp] Tipp

Der aktuelle init-Befehl auf Ihrem System kann über "ps --pid 1 -f" verifiziert werden.

[Tipp] Tipp

systemd kann ohne irgendwelche Änderungen am System parallel zu sysvinit installiert werden. Fügen Sie "init=/lib/systemd/systemd" zu den Kernel-Boot-Parametern hinzu, um systemd zu aktivieren.

[Tipp] Tipp

Bei der Nutzung von GRUB wird der Kernel-Boot-Parameter in /boot/grub/grub.cfg gesetzt. Auf Debian-Systemen sollten Sie /boot/grub/grub.cfg nicht direkt verändern. Ändern Sie stattdessen den GRUB_CMDLINE_LINUX_DEFAULT-Wert in /etc/default/grub und führen Sie dann update-grub(8) aus, um /boot/grub/grub.cfg zu aktualisieren.


[Tipp] Tipp

Das readahead-fedora-Paket kann den Start von Systemen mit reichlich vorhandenem DRAM beschleunigen.

[Tipp] Tipp

Unter Debian Wiki: BootProcessSpeedup finden Sie aktuelle Tipps zur Beschleunigung des Boot-Prozesses.

Dieser Abschnitt beschreibt, wie das gute alte SysV-ähnliche init-Programm das System startet. Ihr Debian-System funktioniert nicht exakt genauso, wie hier beschrieben, aber es ist ziemlich lehrreich, diese Grundlagen zu kennen, da das neuere init-System tendenziell ähnliche Funktionalitäten bieten wird.

Der SysV-ähnliche Boot-Prozess läuft grundsätzlich wie folgt ab:

  1. Das Debian-System schaltet in den Runlevel N (eigentlich kein Runlevel), um das System gemäß der Festlegung in "/etc/inittab" zu initialisieren.

  2. Das Debian-System schaltet in den Runlevel S, um das System zwecks Vervollständigung der Hardware-Einrichtung etc. im Einzelbenutzer-Modus zu initialisieren.

  3. Das Debian-System schaltet in einen der festgelegten Mehrbenutzer-Runlevel (2 bis 5), um die Systemdienste zu starten.

Der anfängliche Runlevel für den Mehrbenutzer-Modus wird über den Kernel-Boot-Parameter "init=" oder über die "initdefault"-Zeile der "/etc/inittab" festgelegt. Das Debian-System, wie es installiert wurde, startet im Runlevel 2.

Alle Skript-Dateien, die durch das init-System ausgeführt werden, sind in dem Verzeichnis "/etc/init.d/" abgelegt.

Unter init(8), inittab(5) und "/usr/share/doc/sysv-rc/README.runlevels.gz" finden Sie detaillierte Informationen.

Wenn der init(8)- oder telinit(8)-Befehl den Runlevel auf "<n>" ändert, führt das System grundsätzlich die Initialisierungsskripte wie folgt aus:

  1. Die Skripte in "/etc/rc<n>.d/", deren Namen mit einem "K" beginnen, werden in alphabetischer Reihenfolge mit dem einfachen Argument "stop" ausgeführt (Dienst beenden, K steht für kill).

  2. Die Skripte in "/etc/rc<n>.d/", deren Namen mit einem "S" beginnen, werden in alphabetischer Reihenfolge mit dem einfachen Argument "start" ausgeführt (Dienst starten).

Wenn Sie zum Beispiel die Links "S10sysklogd" und "S20exim4" in einem Runlevel-Verzeichnis haben, würde "S10sysklogd" (als symbolischer Link auf "../init.d/sysklogd") vor "S20exim4" ausgeführt (was ein symbolischer Link auf "../init.d/exim4" ist).

Diese einfache, nacheinander ablaufende Initialisierung ist das klassische System V-artige Boot-System und wurde bis Debian Lenny verwendet.

Das jetzige Debian-System ist darauf optimiert, die Initialisierungsskripte stattdessen gleichzeitig auszuführen.

[Warnung] Warnung

Es ist nicht empfehlenswert, irgendwelche Änderungen an den symbolischen Links in "/etc/rcS.d/" vorzunehmen, außer Sie wissen es besser als der Paketbetreuer.

Lassen Sie uns im folgenden beispielhaft ein Runlevel-System ähnlich dem von Red Hat Linux einrichten:

  • init startet das System standardmäßig in Runlevel 3.

  • init startet gdm3(1) nicht in Runlevel 0, 1, 2 und 6.

  • init startet gdm3(1) in Runlevel 3, 4 und 5.

Dies kann erledigt werden, indem mit einem Editor in der Datei "/etc/inittab" der zu startende Runlevel geändert wird; dann können mit benutzerfreundlichen Werkzeugen zur Verwaltung der Runlevel wie zum Beispiel sysv-rc-conf oder bum die einzelnen Runlevel bearbeitet werden. Falls Sie stattdessen nur die Befehlszeile verwenden möchten, erfahren Sie hier, wie Sie dazu vorgehen (nach der Standardinstallation von gdm3 und dessen Auswahl als Displaymanager):

# cd /etc/rc2.d ; mv S21gdm3 K21gdm3
# cd /etc ; perl -i -p -e 's/^id:.:/id:3:/' inittab

Bitte beachten Sie, dass die Datei "/etc/X11/default-display-manager" überprüft wird, wenn die Displaymanager-Daemons xdm, gdm3, kdm und wdm gestartet werden.

[Anmerkung] Anmerkung

Sie können X nach wie vor von jeglicher Konsolen-Shell aus mit dem Befehl startx(1) starten.

Die Standard-Parameter für jedes init-Skript in "/etc/init.d/" werden in der zugehörigen Datei in "/etc/default/" festgelegt, welche nur Definitionen für Umgebungsvariablen enthält. Es ist grob das Gegenstück des "/etc/sysconfig"-Verzeichnisses unter Red Hat Linux und anderen Distributionen. Zum Beispiel kann "/etc/default/cron" genutzt werden, um zu steuern, wie "/etc/init.d/cron" arbeitet.

Die "/etc/default/rcS"-Datei kann verwendet werden, um beim Systemstart die Standardwerte für motd(5), sulogin(8) usw. anzupassen.

Wenn Sie nicht das gewünschte Verhalten erreichen, indem Sie solche Variablen verändern, müssen Sie möglicherweise die init-Skripte selbst modifizieren. Dies sind Konfigurationsdateien, die durch den Systemadministrator editiert werden können.

Viele Netzwerkdienste (lesen Sie Kapitel 6, Netzwerkapplikationen) werden im Mehrbenutzer-Modus durch das init-Skript direkt als Daemon-Prozess gestartet, wie z.B. durch "/etc/rc2.d/S20exim4" (für Runlevel 2), was ein symbolischer Link auf "/etc/init.d/exim4" ist.

Einige Netzwerkdienste können über den Super-Server inetd (oder dessen Ersatz) auch bei Bedarf gestartet werden. inetd selbst wird beim Systemstart durch "/etc/rc2.d/S20inetd" (für Runlevel 2) gestartet, was ein symbolischer Link auf "/etc/init.d/inetd" ist. Im wesentlichen erlaubt es inetd, einen Daemon laufen zu haben, der verschiedene andere aufruft; dies reduziert die Last auf dem System.

Wann immer eine Diensteanfrage den Super-Server inetd erreicht, werden deren Protokoll und Dienst über eine Abfrage der Datenbank in "/etc/protocols" und "/etc/services" ermittelt. Dann sucht inetd einen normalen Internet-Dienst in der "/etc/inetd.conf"-Datenbank oder einen Open Network Computing Remote Procedure Call (ONC RPC)/Sun RPC-basierten Dienst in "/etc/rpc.conf".

Manchmal startet inetd den beabsichtigten Server nicht direkt, sondern das TCP-Wrapper-Programm tcpd(8), mit dem beabsichtigten Server als Argument in "/etc/inetd.conf". In diesem Fall wird der passende Server von tcpd ausgeführt, nachdem die Anfrage protokolliert und einige zusätzliche Überprüfungen mittels "/etc/hosts.deny" und "/etc/hosts.allow" durchgeführt wurden.

Zum Zwecke der Systemsicherheit sollten Sie so viele Netzwerkdienste wie möglich deaktivieren. Weiteres dazu in Abschnitt 4.6.4, „Den Zugriff auf einige Server-Dienste einschränken“.

Lesen Sie inetd(8), inetd.conf(5), protocols(5), services(5), tcpd(8), hosts_access(5), hosts_options(5), rpcinfo(8), portmap(8) und "/usr/share/doc/portmap/portmapper.txt.gz".

Für Linux-Kernel der 2.6-Reihe und neuer bietet das udev-System Mechanismen für automatische Hardware-Erkennung und -initialisierung (lesen Sie dazu udev(7)). Nach der Erkennung eines Gerätes durch den Kernel startet das udev-System einen User-Prozess. Dieser verwendet Informationen aus dem sysfs-Dateisystem (Näheres in Abschnitt 1.2.12, „procfs und sysfs“), lädt über den Befehl modprobe(8) benötigte Kernel-Module, die die Hardware unterstützen (Details in Abschnitt 3.3.1, „Die Kernel-Modul-Initialisierung“), und erstellt die zugehörigen Geräteknoten (device nodes).

[Tipp] Tipp

Falls "/lib/modules/<kernel-version>/modules.dep" mittels depmod(8) aus irgendeinem Grund nicht korrekt erstellt wurde, könnten Module nicht wie erwartet durch das udev-System geladen werden. Führen Sie "depmod -a" aus, um dies zu beheben.

Die Namen der Geräteknoten können über udev-Regel-Dateien in "/etc/udev/rules.d/" konfiguriert werden. Aktuelle Standardregeln neigen dazu, dynamisch generierte Namen zu erzeugen, was (außer bei CD- und Netzwerkgeräten) zu von Mal zu Mal unterschiedlichen Gerätenamen führt. Indem Sie Ihre eigenen Regeln hinzufügen ähnlich denen für CD- und Netzwerkgeräte, können Sie auch für andere Geräte wie z.B. USB-Memory-Sticks fest zugeordnete Gerätenamen vergeben. Lesen Sie dazu "Writing udev rules" oder "/usr/share/doc/udev/writing_udev_rules/index.html".

Da das udev-System ein bisschen so etwas wie ein bewegliches Ziel ist, überlasse ich die Details anderer Dokumentation und beschreibe hier nur das nötigste.

[Tipp] Tipp

Für die Regeln zum Einbinden von Dateisystemen in "/etc/fstab" müssen Geräteknoten nicht fest zugeordnet sein. Sie können auch UUIDs verwenden, um Geräte einzubinden, statt der Gerätenamen wie "/dev/sda". Lesen Sie dazu Abschnitt 9.5.3, „Accessing partition using UUID“.

Das modprobe(8)-Programm erlaubt es uns, einen laufenden Linux-Kernel über einen User-Prozess zu konfigurieren, indem wir Kernel-Module hinzufügen und entfernen. Das udev-System (Näheres in Abschnitt 3.3, „Das udev-System“) automatisiert dessen Aufruf, um bei der Initialisierung des Kernel-Moduls zu helfen.

Es gibt Module, die nicht zu bestimmter Hardware gehören, sowie spezielle Hardware-Treibermodule wie die folgenden, die im Voraus geladen werden müssen, indem Sie in die Datei "/etc/modules" eingetragen werden (Details in modules(5)):

Die Konfigurationsdateien für das modprobe(8)-Programm sind unterhalb des "/etc/modprobes.d/"-Verzeichnisses abgelegt, wie in modprobe.conf(5) beschrieben. (Falls Sie vermeiden möchten, dass einige Kernel-Module automatisch geladen werden, sollten Sie in Betracht ziehen, diese in die Datei "/etc/modprobes.d/blacklist" einzutragen.)

Die Datei "/lib/modules/<version>/modules.dep" (erzeugt durch das Programm depmod(8)) beschreibt Abhängigkeiten zwischen den Modulen; diese Abhängigkeiten werden von modprobe(8) genutzt.

[Anmerkung] Anmerkung

Wenn Sie Probleme beim Laden von Modulen feststellen, entweder während des Systemstarts oder beim Nachladen mit modprobe(8), kann "depmod -a" diese Probleme möglicherweise durch Neuerstellung von "modules.dep" beheben.

Der Befehl modinfo(8) zeigt Informationen über ein Linux-Kernel-Modul an.

Das lsmod(8)-Programm formatiert den Inhalt von "/proc/modules" zu einer hübschen Ausgabe, um anzuzeigen, welche Kernel-Module gerade geladen sind.

[Tipp] Tipp

Sie können die Hardware in Ihrem System exakt identifizieren. Lesen Sie dazu Abschnitt 9.4.3, „Hardware identification“.

[Tipp] Tipp

Möglicherweise wollen Sie Hardware während des Systemstarts konfigurieren, um bestimmte erwartete Hardware-Funktionalitäten zu aktivieren. Näheres finden Sie in Abschnitt 9.4.4, „Hardware configuration“.

[Tipp] Tipp

Unterstützung für spezielle Geräte können Sie unter Umständen durch Neukompilieren des Kernels hinzufügen. Details finden Sie in Abschnitt 9.9, „The kernel“.