Die Skripten unter /etc/init.d
unterteilen sich in zwei Kategorien:
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.
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 |
|---|---|
| Dienst starten; falls der Dienst bereits läuft, geschieht nichts |
| Dienst stoppen |
| Dienst stoppen und erneut starten, wenn er bereits läuft; andernfalls den Dienst starten |
| Konfiguration des Dienstes erneut einlesen, ohne ihn zu stoppen und neu zu starten |
|
Konfiguration des Dienstes erneut einlesen, wenn der Dienst dies erlaubt;
andernfalls wie |
| 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.setupDieses 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.
rcDieses Skript führt die Stoppskripten des gegenwärtigen Runlevels aus und danach die Startskripten des neuen.
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).
![]() | 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.