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.
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 |
Runlevel 2 mit einer über NFS eingehängten Partition ist zu vermeiden | |
---|---|
Sie sollten Runlevel 2 nicht verwenden, wenn Ihr System eine Partition, wie |
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.
Das System wechselt in den Einzelbenutzer-Modus. Dieser Modus wird für die Systemwartung und administrative Aufgaben verwendet.
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.
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.
Das System wird gestoppt.
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:
Der Administrator (root
) fordert init durch die Eingabe des Befehls telinit 5
auf, zu einem anderen Runlevel zu wechseln.
init prüft seine Konfigurationsdatei (/etc/inittab
) und stellt fest, dass es /etc/init.d/rc
mit dem neuen Runlevel als Parameter starten soll.
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.
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.
Im Verzeichnis /etc/init.d
gibt es zwei Skripttypen:
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.
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 |
---|---|
| Startet den Dienst. |
| Stoppt den Dienst. |
| Wenn der Dienst läuft, wird er gestoppt und anschließend neu gestartet. Wenn der Dienst nicht läuft, wird er gestartet. |
| Die Konfiguration wird ohne Stoppen und Neustarten des Dienstes neu geladen. |
| Die Konfiguration wird neu geladen, sofern der Dienst dies unterstützt. Andernfalls erfolgt dieselbe Aktion wie bei dem Befehl |
| 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
.
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.
Nach dem Starten dieses YaST-Moduls mit
+ + 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 oder im ausgeführt werden soll. Der vorgegebene 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 . Führen Sie die gleichen Schritte aus, um einen Dienst zu deaktivieren.Die detaillierte Steuerung der Runlevel, in denen ein Dienst gestartet oder gestoppt bzw. die Änderung des vorgegebenen Runlevel erfolgt im 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).
. Der aktuell vorgegebene Runlevel oder „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 ( , , , , , , und ) 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
fest, ob ein Dienst aktiviert werden soll. prüft den aktuellen Status. 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 speichern Sie die geänderten Einstellungen.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. |