Beim Hochfahren des Rechners zeigen die zahlreichen Meldungen, die auf der Konsole vorüberrollen, viele selbsttätig ausgeführte Initialisierungen und Konfigurierungen an. Manchmal möchten Sie vielleicht den Ablauf dieser Phase etwas verändern, weshalb Sie sie gut verstehen müssen. Das ist der Zweck dieses Abschnitts.
Zunächst übernimmt das BIOS die Kontrolle über den Rechner, erkennt die Festplatten, lädt den Master Boot Record und führt den Boot-Loader aus. Der Boot-Loader übernimmt, ermittelt den Kernel auf der Festplatte, lädt ihn und führt ihn aus. Der Kernel wird dann initialisiert und beginnt damit, nach der Partition, die das Wurzel-Dateisystem enthält, zu suchen und sie einzuhängen, und führt schließlich das erste Programm aus – init
. In vielen Fällen befinden sich diese „Wurzel-Partition“ und der init
-Befehl jedoch in einem virtuellen Dateisystem, das nur im Arbeitsspeicher existiert (daher sein Name „initramfs“, früher „initrd“ genannt für „initialization RAM disk“). Dieses Dateisystem wird vom Boot-Loader in den Speicher geladen, häufig aus einer Datei auf einer Festplatte oder aus dem Netzwerk. Es enthält das absolute Minimum dessen, was vom Kernel benötigt wird, um das „wirkliche“ Wurzel-Dateisystem zu laden: dies können Treiber-Module für die Festplatte oder andere Geräte sein, ohne die das System nicht hochfahren kann, oder häufiger Initialisierungsskripten und -module zum Aufbau von RAID-Arrays, zum Öffnen verschlüsselter Partitionen, zur Aktivierung von LVM-Volumes usw. Sobald die Wurzel-Partition eingehängt ist, übergibt initramfs die Kontrolle an das wirkliche init, und der Rechner kehrt zum Standard-Startprozess zurück.
Das "tatsächliche init" wird zur Zeit von sysv-rc (“System V”) bereitgestellt und dieser Abschnitt beschreibt das Init-System.
Init führt mehrere Prozesse gemäß den Anweisungen der Datei
/etc/inittab
aus. Das erste Programm, das ausgeführt wird (und dem Schritt
sysinit entspricht), ist
/etc/init.d/rcS
, ein Skript, das alle Programme im Verzeichnis
/etc/rcS.d/
ausführt.
Unter diesen befinden sich nacheinander Programme, die zuständig sind für:
das Konfigurieren der Konsolentastatur;
das Laden von Treibern: die meisten Kernelmodule werden beim Erkennen der Hardware vom Kernel selbst geladen; zusätzliche Treiber werden selbsttätig geladen, wenn die entsprechenden Module in der Datei /etc/modules
aufgeführt sind;
die Überprüfung des Dateisystems auf Integrität;
das Einhängen lokaler Partitionen;
das Konfigurieren des Netzwerks;
das Einhängen von Netzwerkdateisystemen (NFS).
Nach dieser Phase übernimmt init
und startet die im Standard-Runlevel (der normalerweise Runlevel 2 ist) aktivierten Programme. Es führt /etc/init.d/rc 2
aus, ein Skript, das alle Dienste startet, die in /etc/rc2.d/
aufgeführt sind und mit dem Buchstaben „S“ beginnen. Die anschließenden zweistelligen Zahlen wurden früher dazu benutzt, die Reihenfolge festzulegen, in der die Dienste gestartet werden mussten, aber heute verwendet das Standard-Bootsystem insserv
, das ausgehend von den Abhängigkeiten der Skripten alles selbsttätig zeitlich festlegt. Jedes Boot-Skript legt die Bedingungen fest, die gelten müssen, damit ein Dienst gestartet oder beendet wird (ob er zum Beispiel vor oder nach einem anderen Dienst gestartet werden muss); init
startet sie dann in der Reihenfolge, die diese Bedingungen erfüllt. Die feststehende Nummerierung der Skripten wird daher nicht mehr berücksichtigt (sie müssen trotzdem weiterhin einen Namen haben, der mit „S“ beginnt gefolgt von zwei Zahlen und dem Namen des Skripts, das für die Abhängigkeiten verwendet wird). Im Allgemeinen werden grundlegende Dienste (wie das Protokollieren mit rsyslog
oder die Portzuweisung mit portmap
) als erste gestartet, gefolgt von Standarddiensten und der grafischen Schnittstelle (gdm
).
Dieses Bootsystem auf der Grundlage von Abhängigkeiten ermöglicht es, die Neu-Nummerierung zu automatisieren, die recht mühsam wäre, wenn sie von Hand erledigt werden müsste, und es begrenzt das Risiko menschlichen Versagens, da die Festlegung der zeitlichen Abfolge in Übereinstimmung mit den angegebenen Parametern erfolgt. Ein weiterer Vorteil besteht darin, dass voneinander unabhängige Dienste zeitgleich gestartet werden können, was den Prozess des Hochfahrens beschleunigt.
init
unterscheidet zwischen verschiedenen Runleveln, so dass es mit dem Befehl telinit neuer-level
von einem zum anderen umschalten kann. init
führt bei einem neuen Runlevel unmittelbar ein weiteres Mal /etc/init.d/rc
aus. Dieses Skript startet dann die fehlenden Diensten und beendet die nicht mehr benötigten. Hierzu bezieht es sich auf den Inhalt der Datei /etc/rcX.d
(wobei X den neuen Runlevel bezeichnet). Skripten, deren Namen mit „S“ beginnen (wie in „Start“), verweisen auf zu startende Dienste, solche mit „K“ (wie in „Kill“) auf zu beendende. Das Skript startet keine Dienste, die im vorherigen Runlevel bereits aktiv waren.
Standardmäßig verwendet Debian vier verschiedene Runlevel:
Level 0 wird nur vorübergehend beim Herunterfahren des Rechners benutzt. Daher enthält er nur zahlreiche „K“-Skripten.
Level 1, auch Single-User Modus genannt, entspricht dem System in rudimentärem Zustand. Er umfasst einzig grundlegende Dienste und ist hauptsächlich für den Systemunterhalt gedacht, bei dem Interaktionen mit normalen Benutzern nicht erwünscht sind.
Level 2 ist der Level für den Normalbetrieb, der Netzwerkdienste, eine grafische Schnittstelle, Benutzeranmeldungen usw. umfasst.
Level 6 gleicht Level 0, nur dass er während des Herunterfahrens vor einem Neustart verwendet wird.
Es gibt weitere Level, insbesondere 3 bis 5. Standardmäßig sind sie so konfiguriert, dass sie sich wie Level 2 verhalten. Jedoch kann der Administrator sie verändern (indem er in den entsprechenden Verzeichnissen unter /etc/rcX.d
Skripten hinzufügt oder löscht), um sie so besonderen Bedürfnissen anzupassen.
Alle in den verschiedenen Verzeichnissen unter /etc/rcX.d
enthaltenen Skripten sind in Wirklichkeit symbolische Verknüpfungen - bei der Paketinstallierung durch das Programm update-rc.d
erstellt, die auf die eigentlichen im Verzeichnis /etc/init.d/
gespeicherten Skripten verweisen. Der Administrator kann die in jedem Runlevel verfügbaren Dienste fein einstellen, indem er den Befehl update-rc.d
mit angepassten Parametern erneut ausführt. Die Handbuchseite update-rc.d(1) erläutert die Syntax im Detail. Bitte beachten Sie, dass das Entfernen aller symbolischen Verknüpfungen (mit dem Parameter remove
) kein gutes Verfahren zum Abschalten eines Dienstes ist. Stattdessen sollten Sie ihn einfach so konfigurieren, dass er in dem gewünschten Runlevel nicht startet (und dabei gleichzeitig die entsprechenden Aufrufe zu seinem Abschalten bewahren für den Fall, dass er im vorhergehenden Runlevel läuft). Da update-rc.d
eine etwas verschachtelte Schnittstelle hat, benutzen Sie vielleicht lieber rcconf
(aus dem Paket rcconf), das eine benutzerfreundlichere Schnittstelle bereitstellt.
Schließlich startet init
Steuerprogramme für mehrere virtuelle Konsolen (getty
). Es zeigt eine Eingabeaufforderung an, an der es auf einen Benutzernamen wartet, und führt dann login benutzer
aus, um eine Sitzung zu eröffnen.