8.2. Der init-Vorgang

Das Programm init ist der Prozess mit der Prozess-ID 1. Es ist für die ordnungsgemäße Initialisierung des Systems verantwortlich. Hierbei nimmt init eine besondere Rolle ein. Es wird direkt vom Kernel gestartet und widersteht dem Signal 9, das in der Regel Prozesse beendet. Alle anderen Programme werden entweder direkt von init oder von einem seiner untergeordneten Prozesse gestartet.

init wird zentral in der Datei /etc/inittab konfiguriert, in der auch die Runlevel definiert werden (siehe Abschnitt 8.2.1, „Runlevel“). Diese Datei legt auch fest, welche Dienste und Daemons in den einzelnen Levels verfügbar sind. Je nach den Einträgen in /etc/inittab werden von init mehrere Skripts ausgeführt. Diese Skripts, die der Deutlichkeit halber als init-Skripts bezeichnet werden, befinden sich alle im Verzeichnis /etc/init.d (siehe Abschnitt 8.2.2, „Init-Skripts“).

Der gesamte Vorgang des Startens und Herunterfahrens des Systems wird von init verwaltet. Von diesem Gesichtspunkt aus kann der Kernel als Hintergrundprozess betrachtet werden, dessen Aufgabe es ist, alle anderen Prozesse zu verwalten und die CPU-Zeit sowie den Hardwarezugriff entsprechend den Anforderungen anderer Programme anzupassen.

8.2.1. Runlevel

Unter Linux definieren Runlevel, wie das System gestartet wird und welche Dienste im laufenden System verfügbar sind. Nach dem Booten startet das System wie in /etc/inittab in der Zeile initdefault definiert. Dies ist in der Regel die Einstellung 3 oder 5. Siehe Tabelle 8.1, „Verfügbare Runlevel“. Alternativ kann der Runlevel auch zur Boot-Zeit (beispielsweise an der Eingabeaufforderung) angegeben werden. Alle Parameter, die nicht direkt vom Kernel ausgewertet werden können, werden an init übergeben.

Tabelle 8.1. Verfügbare Runlevel

Runlevel

Beschreibung

0

Systemstopp

S

Einzelbenutzer-Modus; über die Boot-Eingabeaufforderung, nur mit der amerikanischen Tastaturbelegung verfügbar

1

Einzelbenutzer-Modus

2

Lokaler Mehrbenutzer-Modus mit entferntem Netzwerk (NFS usw.)

3

Mehrbenutzer-Vollmodus mit Netzwerk

4

Nicht verwendet

5

Mehrbenutzer-Vollmodus mit Netzwerk und X-Display-Manager - KDM, GDM oder XDM

6

Systemneustart

[Important]Runlevel 2 mit einer über NFS eingehängten Partition ist zu vermeiden

Sie sollten Runlevel 2 nicht verwenden, wenn Ihr System eine Partition, wie /usr, über NFS einhängt. Das System zeigt möglicherweise unerwartetes Verhalten, wenn Programmdateien oder Bibliotheken fehlen, da der NFS-Dienst in Runlevel 2 nicht zur Verfügung steht (lokaler Mehrbenutzer-Modus ohne entferntes Netzwerk).

Um die Runlevel während des laufenden Systembetriebs zu ändern, geben Sie telinit und die entsprechende Zahl als Argument ein. Dies darf nur von Systemadministratoren ausgeführt werden. In der folgenden Liste sind die wichtigsten Befehle im Runlevel-Bereich aufgeführt.

telinit 1 oder shutdown now

Das System wechselt in den Einzelbenutzer-Modus. Dieser Modus wird für die Systemwartung und administrative Aufgaben verwendet.

telinit 3

Alle wichtigen Programme und Dienste (einschließlich Netzwerkprogramme und -dienste) werden gestartet und reguläre Benutzer können sich anmelden und mit dem System ohne grafische Umgebung arbeiten.

telinit 5

Die grafische Umgebung wird aktiviert. Normalerweise wird ein Display-Manager, wie XDM, GDM oder KDM, gestartet. Wenn Autologin aktiviert ist, wird der lokale Benutzer beim vorausgewählten Fenster-Manager (GNOME, KDE oder einem anderem Fenster-Manager) angemeldet.

telinit 0 oder shutdown -h now

Das System wird gestoppt.

telinit 6 oder shutdown -r now

Das System wird gestoppt und anschließend neu gestartet.

Runlevel 5 ist der standardmäßige Runlevel bei allen SUSE Linux-Standardinstallationen. Die Benutzer werden aufgefordert, sich mit einer grafischen Oberfläche anzumelden, oder der Standardbenutzer wird automatisch angemeldet. Wenn 3 der standardmäßige Runlevel ist, muss das X Window System wie unter Kapitel 14, Das X Window-System beschrieben konfiguriert werden, bevor der Runlevel auf 5 geändert werden kann. Prüfen Sie anschließend, ob das System wie gewünscht funktioniert, indem Sie telinit 5 eingeben. Wenn alles ordnungsgemäß funktioniert, können Sie mithilfe von YaST den standardmäßigen Runlevel auf 5 setzen.

Beim Ändern der Runlevel geschehen in der Regel zwei Dinge. Zunächst werden Stopp-Skripts des aktuellen Runlevel gestartet, die einige der für den aktuellen Runlevel wichtigen Programme schließen. Anschließend werden die Start-Skripts des neuen Runlevel gestartet. Dabei werden in den meisten Fällen mehrere Programme gestartet. Beim Wechsel von Runlevel 3 zu 5 wird beispielsweise Folgendes ausgeführt:

  1. Der Administrator (root) fordert init durch die Eingabe des Befehls telinit 5 auf, zu einem anderen Runlevel zu wechseln.

  2. init prüft seine Konfigurationsdatei (/etc/inittab) und stellt fest, dass es /etc/init.d/rc mit dem neuen Runlevel als Parameter starten soll.

  3. Jetzt ruft rc alle Stopp-Skripts des aktuellen Runlevel auf, jedoch nur die, für die es im neuen Runlevel keine Start-Skripts gibt. In diesem Beispiel sind dies alle Skripts, die sich in /etc/init.d/rc3.d (alter Runlevel war 3) befinden und mit einem K beginnen. Die Zahl nach K gibt die Reihenfolge für den Start an, da einige Abhängigkeiten zu berücksichtigen sind.

  4. Die Start-Skripts des neuen Runlevel werden zuletzt gestartet. In diesem Beispiel befinden sie sich im Verzeichnis /etc/init.d/rc5.d und beginnen mit einem S. Hier wird dasselbe Verfahren hinsichtlich der Startreihenfolge angewendet.

Bei dem Wechsel in denselben Runlevel wie der aktuelle Runlevel prüft init nur /etc/inittab auf Änderungen und startet die entsprechenden Schritte, z. B. für das Starten von getty auf einer anderen Schnittstelle. Dieselbe Funktion kann durch den Befehl telinit q erreicht werden.

8.2.2. Init-Skripts

Im Verzeichnis /etc/init.d gibt es zwei Skripttypen:

Skripts, die direkt von init ausgeführt werden

Dies ist nur während des Bootvorgangs der Fall oder wenn das sofortige Herunterfahren des Systems initiiert wird (Stromausfall oder ein Benutzer drückt Strg-Alt-Entf). Die Ausführung dieser Skripts ist in /etc/inittab definiert.

Skripts, die indirekt von init ausgeführt werden

Diese werden beim Wechsel des Runlevel ausgeführt und rufen immer das Master-Skript /etc/init.d/rc auf, das die richtige Reihenfolge der relevanten Skripts gewährleistet.

Sämtliche Skripts befinden sich im Verzeichnis /etc/init.d. Skripts, die während des Bootens ausgeführt werden, werden über symbolische Links aus /etc/init.d/boot.d aufgerufen. Skripts zum Ändern des Runlevel werden jedoch über symbolische Links aus einem der Unterverzeichnisse (/etc/init.d/rc0.d bis /etc/init.d/rc6.d) aufgerufen. Dies dient lediglich der Übersichtlichkeit und der Vermeidung doppelter Skripts, wenn diese in unterschiedlichen Runleveln verwendet werden. Da jedes Skript sowohl als Start- als auch als Stopp-Skript ausgeführt werden kann, müssen diese Skripts die Parameter start und stop verstehen. Die Skripts erkennen außerdem die Optionen restart, reload, force-reload und status. Diese unterschiedlichen Optionen werden in Tabelle 8.2, „Mögliche init-Skript-Optionen“ erläutert. Die von init direkt ausgeführten Skripts verfügen nicht über diese Links. Sie werden unabhängig vom Runlevel bei Bedarf ausgeführt.

Tabelle 8.2. Mögliche init-Skript-Optionen

Option

Beschreibung

start

Startet den Dienst.

stop

Stoppt den Dienst.

restart

Wenn der Dienst läuft, wird er gestoppt und anschließend neu gestartet. Wenn der Dienst nicht läuft, wird er gestartet.

reload

Die Konfiguration wird ohne Stoppen und Neustarten des Dienstes neu geladen.

force-reload

Die Konfiguration wird neu geladen, sofern der Dienst dies unterstützt. Andernfalls erfolgt dieselbe Aktion wie bei dem Befehl restart.

status

Zeigt den aktuellen Status des Dienstes an.

Mithilfe von Links in den einzelnen Runlevel-spezifischen Unterverzeichnissen können Skripts mit unterschiedlichen Runleveln verknüpft werden. Bei der Installation oder Deinstallation von Paketen werden diese Links mithilfe des Programms „insserv“ hinzugefügt oder entfernt (oder mithilfe von /usr/lib/lsb/install_initd, ein Skript, das dieses Programm aufruft). Weitere Informationen hierzu finden Sie auf der Manualpage „insserv(8)“.

Im Folgenden finden Sie eine kurze Einführung in die zuerst bzw. zuletzt gestarteten Boot- und Stopp-Skripts sowie eine Erläuterung des Steuerskripts.

boot

wird ausgeführt, wenn das System direkt mit init gestartet wird. Es wird unabhängig vom gewählten Runlevel und nur einmalig ausgeführt. Dabei werden die Dateisysteme proc und pts eingehängt und blogd (Boot Logging Daemon) wird aktiviert. Wenn das System nach einer Aktualisierung oder einer Installation das erste Mal gebootet wird, wird die anfängliche Systemkonfiguration gestartet.

Der blogd-Daemon ist ein Dienst, der von boot und rc vor allen anderen Diensten gestartet wird. Er wird gestoppt, wenn alle Aktionen, die durch die oben beschriebenen Skripts ausgelöst wurden (z. B. das Ausführen einer bestimmten Anzahl von Subskripts), abgeschlossen sind. blogd schreibt alle auf dem Bildschirm ausgegebenen Informationen in die Protokolldatei /var/log/boot.msg, aber nur dann, wenn /var mit Lese- und Schreibrechten eingehängt wurde. Andernfalls puffert blogd alle Bildschirmdaten, bis /var zur Verfügung steht. Weitere Informationen zu blogd erhalten Sie auf der Manualpage „blogd(8)“.

Das Skript boot ist zudem für das Starten aller Skripts in /etc/init.d/boot.d verantwortlich, deren Name mit S beginnt. Dort werden die Dateisysteme überprüft und bei Bedarf Loop-Devices konfiguriert. Außerdem wird die Systemzeit festgelegt. Wenn bei der automatischen Prüfung und Reparatur des Dateisystems ein Fehler auftritt, kann der Systemadministrator nach Eingabe des Root-Passworts eingreifen. Zuletzt wird das Skript boot.local ausgeführt.

boot.local

Hier können Sie zusätzliche Befehle eingeben, die beim Booten ausgeführt werden sollen, bevor Sie zu einem Runlevel wechseln. Dieses Skript ist mit der AUTOEXEC.BAT in DOS-Systemen vergleichbar.

boot.setup

Dieses Skript wird bei einem Wechsel vom Einzelbenutzer-Modus in einen anderen Runlevel ausgeführt. Es ist verantwortlich für eine Reihe grundlegender Einstellungen, z. B. die Tastaturbelegung und die Initialisierung der virtuellen Konsolen.

halt

Dieses Skript wird nur beim Wechsel zu Runlevel 0 oder 6 ausgeführt. Es wird entweder als halt oder als reboot ausgeführt. Ob das System heruntergefahren oder neu gebootet wird, hängt davon ab, wie halt aufgerufen wird.

rc

Dieses Skript ruft die entsprechenden Stopp-Skripts des aktuellen Runlevel und die Start-Skripts des neu gewählten Runlevel auf.

Sie können Ihre eigenen Skripts erstellen und diese problemlos in das oben beschriebene Schema integrieren. Anweisungen zum Formatieren, Benennen und Organisieren benutzerdefinierter Skripts finden Sie in den Spezifikationen von LSB und auf den Manualpages von init, init.d und insserv. Weitere Informationen finden Sie zudem auf den Manualpages zu startproc und killproc.

[Warning]Fehlerhafte init-Skripts können das System stoppen

Bei fehlerhaften init-Skripts kann es dazu kommen, dass der Computer hängt. Diese Skripts sollten mit großer Vorsicht bearbeitet werden und, wenn möglich, gründlich in der Mehrbenutzer-Umgebung getestet werden. Einige hilfreiche Informationen zu init-Skripts finden Sie in Abschnitt 8.2.1, „Runlevel“.

Sie erstellen ein benutzerdefiniertes init-Skript für ein bestimmtes Programm oder einen Dienst, indem Sie die Datei /etc/init.d/skeleton als Schablone verwenden. Speichern Sie eine Kopie dieser Datei unter dem neuen Namen und bearbeiten Sie die relevanten Programm- und Dateinamen, Pfade und ggf. weitere Details. Sie können das Skript auch mit eigenen Ergänzungen erweitern, sodass die richtigen Aktionen vom init-Prozess ausgelöst werden.

Der Block INIT INFO oben ist ein erforderlicher Teil des Skripts und muss bearbeitet werden. Siehe Beispiel 8.1, „Ein minimaler INIT INFO-Block“.

Beispiel 8.1. Ein minimaler INIT INFO-Block

### BEGIN INIT INFO
# Provides:          FOO
# Required-Start:    $syslog $remote_fs
# Required-Stop:     $syslog $remote_fs
# Default-Start:     3 5
# Default-Stop:      0 1 2 6
# Description:       Start FOO to allow XY and provide YZ
### END INIT INFO
    

Geben Sie in der ersten Zeile des INFO-Blocks nach Provides: den Namen des Programms oder des Dienstes an, das bzw. der mit diesem Skript gesteuert werden soll. Geben Sie in den Zeilen Required-Start: und Required-Stop: alle Dienste an, die gestartet oder gestoppt werden müssen, bevor der Dienst selbst gestartet oder gestoppt wird. Diese Informationen werden später zum Generieren der Nummerierung der Skriptnamen verwendet, die in den Runlevel-Verzeichnissen enthalten sind. Geben Sie nach Default-Start: und Default-Stop: die Runlevel an, in denen der Dienst gestartet oder gestoppt werden soll. Geben Sie für Description: schließlich eine kurze Beschreibung des betreffenden Dienstes ein.

Um in den Runlevel-Verzeichnissen (/etc/init.d/rc?.d/) die Links auf die entsprechenden Skripts in /etc/init.d/ zu erstellen, geben Sie den Befehl insserv neuer skriptname ein. Das Programm „insserv“ wertet den INIT INFO-Header aus, um die erforderlichen Links für die Start- und Stopp-Skripts in den Runlevel-Verzeichnissen (/etc/init.d/rc?.d/) zu erstellen. Das Programm sorgt zudem für die richtige Start- und Stopp-Reihenfolge für die einzelnen Runlevel, indem es die erforderlichen Nummern in die Namen dieser Links aufnimmt. Wenn Sie zum Erstellen der Links ein grafisches Werkzeug bevorzugen, verwenden Sie den von YaST zur Verfügung gestellten Runlevel-Editor wie in Abschnitt 8.2.3, „Konfigurieren von Systemdiensten (Runlevel) mit YaST“ beschrieben.

Wenn ein in /etc/init.d/ bereits vorhandenes Skript in das vorhandene Runlevel-Schema integriert werden soll, erstellen Sie die Links in den Runlevel-Verzeichnissen direkt mit insserv oder indem Sie den entsprechenden Dienst im Runlevel-Editor von YaST aktivieren. Ihre Änderungen werden beim nächsten Neustart wirksam und der neue Dienst wird automatisch gestartet.

Diese Links dürfen nicht manuell festgelegt werden. Wenn der INFO-Block Fehler enthält, treten Probleme auf, wenn insserv zu einem späteren Zeitpunkt für einen anderen Dienst ausgeführt wird. Der manuell hinzugefügte Dienst wird bei der nächsten Ausführung von insserv entfernt.

8.2.3. Konfigurieren von Systemdiensten (Runlevel) mit YaST

Nach dem Starten dieses YaST-Moduls mit YaST+System+Systemdienste (Runlevel) werden ein Überblick über alle verfügbaren Dienste sowie der aktuelle Status der einzelnen Dienste (deaktiviert oder aktiviert) angezeigt. Legen Sie fest, ob das Modul im einfachen Modus oder im Expertenmodus ausgeführt werden soll. Der vorgegebene einfache Modus sollte für die meisten Zwecke ausreichend sein. In der linken Spalte wird der Name des Dienstes, in der mittleren Spalte sein aktueller Status und in der rechten Spalte eine kurze Beschreibung angezeigt. Der untere Teil des Fensters enthält eine ausführlichere Beschreibung des ausgewählten Dienstes. Um einen Dienst zu aktivieren, wählen Sie ihn in der Tabelle aus und klicken Sie anschließend auf Aktivieren. Führen Sie die gleichen Schritte aus, um einen Dienst zu deaktivieren.

Abbildung 8.1. Systemdienste (Runlevel)

Systemdienste (Runlevel)

Die detaillierte Steuerung der Runlevel, in denen ein Dienst gestartet oder gestoppt bzw. die Änderung des vorgegebenen Runlevel erfolgt im Expertenmodus. Der aktuell vorgegebene Runlevel oder „initdefault“ (der Runlevel, in den das System standardmäßig bootet) wird oben angezeigt. Der standardmäßige Runlevel eines SUSE Linux-Systems ist in der Regel Runlevel 5 (Mehrbenutzer-Vollmodus mit Netzwerk und X). Eine geeignete Alternative kann Runlevel 3 sein (Mehrbenutzer-Vollmodus mit Netzwerk).

In diesem YaST-Dialogfeld können Sie einen Runlevel (wie unter Tabelle 8.1, „Verfügbare Runlevel“ aufgeführt) als neuen Standard wählen. Zudem können Sie mithilfe der Tabelle in diesem Fenster einzelne Dienste und Daemons aktivieren oder deaktivieren. In dieser Tabelle sind die verfügbaren Dienste und Daemons aufgelistet und es wird angezeigt, ob sie aktuell auf dem System aktiviert sind und wenn ja, für welche Runlevel. Nachdem Sie mit der Maus eine der Zeilen ausgewählt haben, klicken Sie auf die Kontrollkästchen, die die Runlevel (B, 0, 1, 2, 3, 5, 6 und S) darstellen, um die Runlevel festzulegen, in denen der ausgewählte Dienst oder Daemon ausgeführt werden sollte. Runlevel 4 ist anfänglich nicht definiert, um das Erstellen eines benutzerdefinierten Runlevel zu ermöglichen. Unterhalb der Tabelle wird eine kurze Beschreibung des aktuell ausgewählten Dienstes oder Daemons angezeigt.

Legen Sie mit den Optionen „Start“, „Anhalten“ oder „Aktualisieren“ fest, ob ein Dienst aktiviert werden soll. Status aktualisieren prüft den aktuellen Status. Mit „Anwenden“ oder „Zurücksetzen“ können Sie wählen, ob die Änderungen für das System angewendet werden sollen, oder ob die ursprünglichen Einstellungen wiederhergestellt werden sollen, die vor dem Starten des Runlevel-Editors wirksam waren. Mit Beenden speichern Sie die geänderten Einstellungen.

[Warning]Fehlerhafte Runlevel-Einstellungen können das System beschädigen

Fehlerhafte Runlevel-Einstellungen können ein System unbrauchbar machen. Stellen Sie vor dem Anwenden der Änderungen sicher, dass Sie deren Auswirkungen kennen.