7.5. Die Init-Skripten

Die Skripten unter /etc/init.d unterteilen sich in zwei Kategorien:

Skripten, die direkt von init aufgerufen werden

Dies ist nur beim Booten der Fall sowie bei einem sofortigen Herunterfahren des Systems (bei Stromausfall oder durch Drücken der Tastenkombination Strg-Alt-Entf durch einen Benutzer). Die Ausführung dieser Skripten ist in /etc/inittab definiert.

Skripten, die indirekt von init aufgerufen werden

Das geschieht bei einem Wechsel des Runlevels; dabei wird generell das übergeordnete Skript /etc/init.d/rc ausgeführt, das dafür sorgt, dass die relevanten Skripten in der korrekten Reihenfolge aufgerufen werden.

Alle Skripten befinden sich unter /etc/init.d. Die Skripten für das Wechseln des Runlevels befinden sich ebenfalls in diesem Verzeichnis, werden jedoch grundsätzlich als symbolischer Link aus einem der Unterverzeichnisse /etc/init.d/rc0.d bis /etc/init.d/rc6.d aufgerufen. Dies dient der Übersichtlichkeit und vermeidet, dass Skripten mehrfach vorhanden sein müssen, wenn sie in verschiedenen Runlevels verwendet werden. Da jedes dieser Skripten sowohl als Start- wie auch als Stoppskript aufgerufen werden kann, müssen sie alle die beiden möglichen Parameter start und stop verstehen. Zusätzlich verstehen die Skripten die Optionen restart, reload, force-reload und status; die Bedeutung aller Optionen ist in Tabelle 7.2, „Übersicht der Optionen der init-Skripten“ aufgelistet. Skripten, die direkt von init aufgerufen werden, haben diese Links nicht. Sie werden bei Bedarf unabhängig vom Runlevel ausgeführt.

Tabelle 7.2. Übersicht der Optionen der init-Skripten

Option

Bedeutung

start

Dienst starten; falls der Dienst bereits läuft, geschieht nichts

stop

Dienst stoppen

restart

Dienst stoppen und erneut starten, wenn er bereits läuft; andernfalls den Dienst starten

reload

Konfiguration des Dienstes erneut einlesen, ohne ihn zu stoppen und neu zu starten

force-reload

Konfiguration des Dienstes erneut einlesen, wenn der Dienst dies erlaubt; andernfalls wie restart

status

aktuellen Status des Dienstes anzeigen

Die Links in den einzelnen Unterverzeichnissen für die Runlevels dienen also nur dazu, eine Zuordnung der einzelnen Skripten zu bestimmten Runlevels zu ermöglichen. Beim Installieren oder Deinstallieren von Paketen werden die erforderlichen Links mit dem Programm insserv (bzw. mit dem Link /usr/lib/lsb/install_initd, der dasselbe Programm aufruft). Einzelheiten finden Sie in der Manualpage insserv(8). Im Folgenden geben wir eine kurze Beschreibung der ersten Boot- und der letzten Shutdown-Skripten sowie des Steuerskripts:

boot

Wird beim Start des Systems direkt von init ausgeführt. Es ist unabhängig vom eingestellten Standard-Runlevel und wird nur ein einziges Mal ausgeführt. Im Wesentlichen werden hierbei das proc- und das pts-Dateisystem gemountet, der blogd (engl. Boot Logging Daemon) aktiviert sowie — nach einer Erstinstallation oder einem Update des Systems — eine Grundkonfiguration angestoßen.

Der blogd-Daemon wird vom boot- und vom rc-Skript vor allen anderen Diensten gestartet. Nach getaner Arbeit (zum Beispiel dem Aufruf von Unterskripten durch die obigen Skripte) wird er wieder beendet. Dieser Daemon schreibt alle Bildschirmausgaben in die Protokolldatei /var/log/boot.msg, sobald /var les- und schreibbar gemountet ist. Solange /var noch nicht verfügbar ist, puffert blogd alle Bildschirmausgaben. Weitere Informationen zu blogd finden Sie in der Manualpage blogd(8).

Dem Skript boot ist des Weiteren das Verzeichnis /etc/init.d/boot.d zugeordnet; alle in diesem Verzeichnis gefundenen Skripte, die mit S beginnen, werden automatisch beim Hochlauf des Systems ausgeführt. Hierdurch werden die Dateisysteme geprüft, das Loopback-Device eingerichtet (sofern dies vorgesehen ist), und die Systemzeit gesetzt. Tritt beim Prüfen und automatischen Reparieren der Dateisysteme ein Fehler auf, hat der Systemadministrator nach Eingabe des Root-Passwortes die Möglichkeit, manuell eine Lösung des Problems herbeizuführen. Schließlich wird noch das Skript boot.local ausgeführt.

boot.local

Hier können weitere Dinge eingetragen werden, die beim Start geschehen sollen, bevor das System in einen der Runlevels eintritt; es kann von seiner Funktion her mit der vielleicht von DOS her gewohnten AUTOEXEC.BAT verglichen werden.

boot.setup

Dieses Skript wird beim Übergang vom Einzelbenutzerbetrieb zu einem anderen Runlevel ausgeführt. Es ist für verschiedene grundlegende Einstellungen verantwortlich, wie etwa die Tastaturbelegung und die Konsolenkonfiguration.

halt

Dieses Skript wird nur beim Eintritt in den Runlevel 0 oder 6 ausgeführt. Dabei wird es entweder unter dem Namen halt oder dem Namen reboot aufgerufen. Abhängig davon, wie das Skript aufgerufen wurde, wird das System neu gestartet oder ganz heruntergefahren.

rc

Dieses Skript führt die Stoppskripten des gegenwärtigen Runlevels aus und danach die Startskripten des neuen.

7.5.1. Init-Skripten hinzufügen

Zusätzliche Init-Skripten lassen sich in das oben beschriebene Konzept leicht integrieren. Orientieren Sie sich bei Fragen zum Format, Namensgebung und Organisation der Init-Skripten an den Vorgaben des LSB und den Manualpages init(8), init.d(7) und insserv(8). Hilfreich sind in diesem Zusammenhang weiterhin die Manualpages startproc(8) and killproc(8).

[Warning]Erstellung eigener Init-Skripten

Fehlerhafte Init-Skripten können das gesamte System aufhängen. Erstellen Sie eigene Skripten mit äußerster Sorgfalt und testen Sie sie gründlich in einer Mehrbenutzerumgebung. Grundlegende Informationen zum Umgang mit Init-Skripten finden Sie unter Abschnitt 7.3, „Die Runlevel“.

Wenn Sie für ein eigenes Programm oder eigenen Dienst ein Init-Skript erstellen, verwenden Sie die Datei /etc/init.d/skeleton als Vorlage. Speichern Sie diese Datei unter dem neuen Namen. Bearbeiten Sie dann die Nennung von Programm- oder Dateinamen und Pfaden, und fügen Sie wenn nötig eigene Skriptbestandteile hinzu, die für ein korrektes Ausführen des Init-Aufrufes benötigt werden.

Bearbeiten Sie den obligatorischen Block INIT INFO am Anfang der Datei (vgl. Beispiel 7.1, „Eine minimale INIT INFO“).

Beispiel 7.1. Eine minimale INIT INFO

### 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

In der ersten Zeile des INFO-Blocks nennen Sie nach Provides: den Namen des Programms oder Dienstes, der mit diesem Init-Skript gesteuert werden soll. Die Zeilen Required-Start: und Required-Stop: enthalten alle Dienste, die vor dem Start oder Stopp des betroffenen Dienstes oder Programms gestartet oder gestoppt werden müssen. Diese Information wird ausgewertet, um die Nummerierung der resultierenden Start- und Stoppskripten in den Runlevel-Verzeichnissen zu erzeugen. Die Runlevel, in denen Ihre Anwendung automatisch gestartet bzw. gestoppt werden sollen, geben Sie bei Default-Start: und Default-Stop: an. Mit einer kurzen Beschreibung Ihrer Anwendung unter Description: schließen Sie Ihre Eingaben ab.

Um die Links von den Runlevel-Verzeichnissen (/etc/init.d/rc?.d/) zu den entsprechenden Skripten in /etc/init.d/ anzulegen, geben Sie den Befehl insserv <new-script-name> ein. insserv wertet automatisch die im Header des Init-Skripts gemachten Angaben aus und legt die Links für Start- und Stoppskripten in den entsprechenden Runlevelverzeichnissen ab. Die korrekte Start- und Stoppreihenfolge innerhalb eines Runlevels wird ebenfalls über die Nummerierung der Skripte durch insserv gewährleistet. Als grafisches Konfigurationswerkzeug zum Anlegen der Links steht der Runlevel-Editor von YaST zur Verfügung; vgl. Abschnitt 7.6, „System Services (Runlevel)“.

Soll lediglich ein in /etc/init.d/ bereits vorliegendes Skript in das Runlevel-Konzept eingebunden werden, legen Sie mittels insserv die Links in die entsprechenden Runlevelverzeichnisse an, oder aktivieren Sie den Dienst mit dem YaST-Runlevel-Editor. Beim nächsten Start des Systems werden Ihre Änderungen umgesetzt und der neue Dienst automatisch gestartet.

Setzen Sie diese Links nicht manuell. Sollte etwas im INFO-Block falsch sein, ist mit Problemen zu rechnen, wenn insserv später für irgendeinen anderen Dienst ausgeführt wird.


SUSE LINUX Administrationshandbuch 9.3