13.4. Die Init-Skripten

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

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, etwa weil sie in verschiedenen Runlevels verwendet werden sollen. Da jedes dieser Skripten sowohl als Start- wie auch als Stopp-Skript 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 13.2. “Übersicht der Optionen der init-Skripten” aufgelistet.

Tabelle 13.2. Übersicht der Optionen der init-Skripten

OptionBedeutung
startDienst starten
stopDienst stoppen
restart Dienst stoppen und erneut starten, wenn der Dienst bereits lief; andernfalls den Dienst starten
reload Konfiguration des Dienstes erneut einlesen, ohne den Dienst zu stoppen und neu zu starten
force-reload Konfiguration des Dienstes erneut einlesen, wenn der Dienst dies unterstützt; andernfalls wie restart
statusaktuellen Status anzeigen

Die Links in den einzelnen Runlevel-spezifischen Unterverzeichnissen dienen somit also nur dazu, eine Zuordnung der einzelnen Skripten zu bestimmten Runlevels zu ermöglichen. Das Anlegen und Entfernen der notwendigen Links geschieht mit insserv (bzw. dem Link /usr/lib/lsb/install_initd) beim Installieren oder Deinstallieren des jeweiligen Paketes; vgl. die Manualpage von insserv .

Im Folgenden finden Sie eine kurze Beschreibung der ersten Boot- und der letzten Shutdown-Skripten sowie des Steuerskripts:

boot

Wird beim Start des Systems ausgeführt und direkt von init gestartet. Es ist unabhängig vom gewünschten Default-Runlevel und wird nur genau ein einziges Mal ausgeführt: Im Wesentlichen werden proc- und pts-Dateisystem eingehängt („gemountet“), der blogd (engl. Boot Logging Daemon) wird aktiviert und — nach einer Erstinstallation oder einem Update des Systems — wird eine Grundkonfiguration angestoßen.

Der blogd Daemon ist ein Daemon, der vom boot und rc Skript vor allem anderen gestartet wird und nach getaner Arbeit (zum Beispiel dem Aufruf von Unterskripten) wieder beendet wird. Dieser Daemon schreibt in die Log-Datei /var/log/boot.msg, falls /var les- und schreibbar gemountet ist bzw. puffert alle Bildschirmdaten bis das /var les- und schreibbar gemountet wird. Weitere Informationen zu blogd finden Sie unter man blogd.

Diesem Skript 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. Es werden die Dateisysteme geprüft, etwaige überflüssige Dateien unter /var/lock gelöscht und das Netzwerk für das Loopback-Device konfiguriert, sofern dies vorgesehen ist. Weiterhin wird die Systemzeit gesetzt.

Tritt beim Prüfen und automatischen Reparieren der Dateisysteme ein schwerer Fehler auf, hat der Systemadministrator nach Eingabe des Root-Passwortes die Möglichkeit, manuell eine Lösung des Problems herbeizuführen. Schließlich wird 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

Grundlegende Einstellungen, die beim Übergang vom Einzelnutzerbetrieb in irgendeinen Runlevel vorgenommen werden müssen. Hier werden die Tastaturbelegung und die Konsolenkonfiguration geladen.

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 halt aufgerufen wurde, wird das System neu gestartet oder ganz heruntergefahren.

rc

Das übergeordnete Skript, das bei jedem Wechsel des Runlevels aufgerufen wird. Es führt die Stopp-Skripten des gegenwärtigen Runlevels aus und danach die Start-Skripten des neuen.

13.4.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 von init, init.d und insserv. Hilfreich sind in diesem Zusammenhang weiterhin die Manualpages von startproc und killproc.

[Warning]Erstellung eigener Init-Skripten

Fehlerhafte Init-Skripten können das gesamte System „aufhängen“. Erstellen Sie eigene Skripte mit äußerster Sorgfalt und testen Sie sie — soweit möglich — vor dem Ernstfall in der Multiuserumgebung. Grundlageninformation zum Umgang mit Runleveln/Init-Skripten finden Sie im Abschnitt 13.2. “Die Runlevels”.

  • Wenn Sie für ein eigenes Programm oder eigenen Dienst (engl. service) ein Init-Skript erstellen, verwenden Sie die Datei /etc/init.d/skeleton als Vorlage. Speichern Sie diese Datei unter dem neuen Namen und editieren Sie 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.

  • Editieren Sie den obligatorischen INIT INFO Block am Anfang der Datei:

    Beispiel 13.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-Headers nennen Sie nach Provides: den Namen des Programms oder Dienstes, der mit diesem Init-Skript gesteuert werden soll. 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 Numerierung der resultierenden Start- und Stoppskripten in den Runlevel-Verzeichnissen zu generieren. 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.

  • Legen Sie mit dem Befehl insserv <Name des neuen Skripts> die Links von /etc/init.d/ in die entsprechenden Runlevelverzeichnisse (/etc/init.d/rc?.d/) an. insserv wertet automatisch die im Header des Init-Skripts gemachten Angaben aus und legt die Links für Start- und Stoppskripte in den entsprechenden Runlevelverzeichnissen ab. Die korrekte Start- und Stoppreihenfolge innerhalb eines Runlevels wird ebenfalls über die Nummerierung der Skripte von insserv gewährleistet. Als grafisches Konfigurationswerkzeug zum Anlegen der Links steht der Runlevel-Editor von zur Verfügung; vgl. Abschnitt 13.5. “Der YaST Runlevel-Editor”.

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