Zwischen dem Einschalten des Computers und dem Einloggen der Benutzer arbeitet das Programm init als erster Prozess. Es initialisiert das System, weckt Daemons wie crond oder syslogd und legt den Runlevel fest, den der Anwender vorfindet.
Der Ursprung der Prozesse
Alle Prozesse Ihres Rechners entspringen direkt oder indirekt dem Programm init. Der Kernel selbst startet dieses Programm, das seine Konfiguration in der Datei /etc/inittab findet. Hier liest init unter anderem die Einstellungen zu den Runlevels, den virtuellen Text-Konsolen und den Init-Skripten, die verschiedene Dienste in Gang setzen und beenden. Nach einem Shutdown-Befehl, ob nun im Text-Terminal oder dem Displaymanager KDM, sorgt init für ein korrektes Herunterfahren des Systems. Das Programm beendet alle Prozesse – und zum Schluss sich selbst.
Die Konfiguration
Bevor wir uns die verschiedenen Runlevel und Init-Skripten ansehen, werfen wir einen Blick in die Konfigurationsdatei /etc/inittab und greifen uns eine beliebige Zeile heraus, um sie zu analysieren:
l0:0:wait:/etc/init.d/rc 0
Diesen Eintrag, wie auch jeden anderen in der Datei, schlüsseln Sie nach folgendem Muster auf:
Id:Runlevel:Aktion:Prozess
Die Befehlssequenz id steht für die Identifizierungsnummer jeder Zeile in der Datei /etc/inittab. Die ID-Nummer variiert zwischen einem und bis zu vier Zeichen, einige Versionen beschränken die Obergrenze jedoch auf zwei Zeichen. In unserem Beispiel identifiziert sich der Eintrag mit der Zeichenkombination l0.
Der nächste Teil der Zeile zeigt den Runlevel an, für den diese Konfigurationsanweisung gilt. Unsere Anweisung greift also im Runlevel 0, dass bedeutet, das der Rechner anhält.
Mit Aktion bestimmen Sie, wie und wann der Befehl, der in der Prozess-Sequenz beschrieben ist, ausgeführt wird. Mit dem Eintrag wait wartet init, bis das Skript /etc/init.d/rc mit dem Parameter 0 seine Arbeit beendet hat. Das Programm init ermöglicht eine Reihe von Aktion-Definitionen, von denen wir die wichtigsten in Tabelle 1 aufgelistet haben. Weitere Einstellungen bietet Ihnen die Manualseite man inittab, die Sie neben der Hilfe man init über xterm oder Konsole erreichen.
Tabelle 1: Action-Definitionen
respawn |
Der Befehl der Prozess-Sequenz wird nach seinem Ende erneut gestartet |
wait |
init wartet auf das Ende des folgenden Befehls |
once |
Nur einmal soll der Befehl beim Wechsel des Runlevels gestartet werden |
boot |
init führt das Kommando während des Hochfahren aus, ohne die Runlevel-Sequenz zu beachten |
bootwait |
Diese Aktion arbeitet wie die Sequenz boot. Allerdings wartet init auf das Ende des Prozesses |
initdefault |
Der Runlevel, in dem das System nach dem Hochfahren startet. Die process-Sequenz bleibt hierbei unbeachtet |
sysinit |
Die Prozess-Sequenz wird während des Bootprozesses ausgeführt, jedoch vor den Anweisungen boot und bootwait |
powerwait |
Bei einem Absacken der Stromzufuhr zum System führt init das nachfolgende Kommando aus und wartet auf dessen Ende |
powerfail |
Wie powerwait, jedoch wartet init nicht mehr auf das Ende des initierten Kommandos |
ctrlaltdel |
sagt init, welcher Befehl auf die Tastenkombination [Strg]+[Alt]+[Entf] antworten soll |
Schauen wir uns die Datei /etc/inittab etwas näher an. Als Beispiel dient uns die Konfigurationsdatei, die der verbreiteten Distribution SuSE 7.2 beiliegt. Beginnen wir mit den Einträgen, die sich mit den virtuellen Textkonsolen beschäftigen:
1:2345:respawn:/sbin/mingetty --noclear tty1 2:2345:respawn:/sbin/mingetty tty2 3:2345:respawn:/sbin/mingetty tty3 4:2345:respawn:/sbin/mingetty tty4 5:2345:respawn:/sbin/mingetty tty5 6:2345:respawn:/sbin/mingetty tty6
Ausnahmweise lesen Sie in diesen Zeilen nicht die ID-Nummer an der ersten Stelle des Eintrags, sondern die Nummer des Devices, die dem Textterminal entspricht. Die zweite Stelle markiert wie gewohnt die Runlevel, und die Anweisung respawn ruft mit dem Kommando /sbin/mingetty die virtuellen Text-Konsolen auf. Damit Sie nach dem Start des Terminals tty1 zu den Meldungen des Bootprozesses scrollen zu können, sorgt die Option --noclear für den Erhalt der Nachrichten, die nützliche Informationen enthalten. Ohne diese Option löscht das System nach dem Terminal-Start jede abgelaufene Mitteilung.
Wahrscheinlich sehen Sie einige Unterschiede zwischen unserer Beispiel-inittab, und der Konfigurationsdatei, die init in Ihrer Distribution nutzt. Selbst in den fortschreitenden Versionen des selben Distributors wechseln die Einträge im Detail, ob sie nun die Runlevel ordnen oder Init-Skripte ansprechen. Sie sollten es deshalb vermeiden, Angaben einer veralteten /etc/inittab in eine neue Version zu kopieren, und davon absehen, eine distributionsfremde init-Konfiguration für Ihr System zu übernehmen. Ein falsch angegebener Pfad oder ein übersehenes Zeichen verhindern unter Umständen ein Hochfahren Ihres Systems. In diesem Falle versuchen Sie einen Systemstart im Single-User-Mode oder die Rettungsaktion mit einer Shell, die Sie in der Eingabe des Bootmanagers Lilo dem Kommando linux init=/bin/sh laden. Für solche Notfälle steht Ihnen das Handbuch Ihrer Distribution Rede und Antwort.
Wo laufen sie denn
Was bedeutet das Wort Single User Mode? An verschiedenen Stellen dieses Artikels fanden die Runlevel bereits ihre Erwähnung. Jeder Runlevel bietet Ihnen spezifische Dienste und Einsatzgebiete an. Der Single User Mode (oder Einzelbenutzer-Modus) ist ein Runlevel, der als Ebene zur Wartung und Administration des Systems zu Ihrer Verfügung steht. In der Tabelle 2 sehen Sie eine Liste der Runlevel, wie sie viele Distributionen aufstellen und anwenden.
Tabelle 2: Liste der Runlevel
0 |
Halt des Sytems |
1 |
Einzelbenutzer-Modus zur Administration |
2 |
Mehrbenutzer-Modus ohne Netzwerk |
3 |
Mehrbenutzer-Modus mit Netzwerk |
4 |
Ungenutzt und frei |
5 |
Mehrbenutzer-Modus mit Netzwerk und grafischer Oberfläche |
6 |
Neustart des Systems |
Eine kurze Zeile verrät dem Programm init in welchem Runlevel Sie nach dem Bootprozess landen möchten. Wie Sie sicher in Tabelle 1 bemerkt haben, trägt die Befehlssequenz initdefault die Verantwortung, ob Sie sich in der Text-Konsole anmelden oder in einem Displaymanager:
id:3:initdefault:
In der Regel beginnen Sie Ihre Anwendungen im Runlevel 3 oder 5, ein Wechsel der Ebene ist jedoch im laufenden Betrieb möglich, wenn Sie es als Systemadministrator wünschen. Das Kommando
root: # init 1
beendet den Runlevel, in dem Sie sich gerade befinden, und ermöglicht Ihnen administrative Aufgaben im Einzelbenutzer-Modus. Der Befehl init 5 bringt Sie danach flugs zurück auf die grafische Oberfläche. Durch ein Init-Kommando können Sie, wie Sie in Tabelle 2 sehen, das System herunterfahren oder den Neustart initialisieren, denn halt und reboot sind ebenfalls Runlevel.
Wie Sie gesehen haben, unterscheiden sich die Runlevel durch die Programme und Dienste, die sie anbieten. Aber das tun sie freilich nicht von sich aus, denn init startet und stoppt die entsprechenden Skripte der einzelnen Runlevel. Picken wir uns die skriptsteuernden Einträge der Datei /etc/inittab einmal heraus, um den Aufbau des Runlevel-Wechsel in Augenschein zu nehmen:
l0:0:wait:/etc/init.d/rc 0 l1:1:wait:/etc/init.d/rc 1 l2:2:wait:/etc/init.d/rc 2 l3:3:wait:/etc/init.d/rc 3 #l4:4:wait:/etc/init.d/rc 4 l5:5:wait:/etc/init.d/rc 5 l6:6:wait:/etc/init.d/rc 6
Diese Konfigurationsanweisung ruft bei jeder Veränderung des Runlevels das Shellskript /etc/init.d/rc auf. Je nach Distribution hört das rc-Skript auch auf den Namen /etc/rc.d/rc. Bei SuSE 7.2 ist das Verzeichnis /etc/rc.d lediglich ein Link auf die Verzeichnisstruktur unter /etc/init.d/. Die Datei /etc/initab der Distribution Red Hat beherbergt statt der SuSE-Anweisungen die folgenden Zeilen:
l0:0:wait:/etc/rc.d/rc 0 l1:1:wait:/etc/rc.d/rc 1 l2:2:wait:/etc/rc.d/rc 2 l3:3:wait:/etc/rc.d/rc 3 l4:4:wait:/etc/rc.d/rc 4 l5:5:wait:/etc/rc.d/rc 5 l6:6:wait:/etc/rc.d/rc 6
Nachdem das Rc-Skript den neuen Runlevel von init erhalten hat, führt es ebenfalls weitere Skripte aus. Zunächst starten die Kill-Skripte des Runlevels, den es zu verlassen gilt. Danach ruft das Rc-Skript die Start-Skripte des Runlevels auf, in den Sie gelangen möchten.
Die Kill- und Start-Skripte liegen beim Nürnberger Distributor SuSE in den Pfaden von /etc/init.d/rc0.d bis /etc/init.d/rc6.d. Das Verzeichnis /etc/init.d/rcS samt des dazugehörigen Runlevels S lassen wir, um der Übersichtlichkeit genüge zu tun, unter den Tisch fallen (der Runlevel S bezeichnet bei SuSE den Single User Mode vom Boot-Terminal aus, und das auch noch mit amerikanischer Tastaturbelegung).
Die Distribution Red Hat stellt die Kill -und Startskripte in einen anderen Zweig des Verzeichnisbaumes, und zwar nach /etc/rc.d/rc0.d bis /etc/rc.d/rc6.d.
Da diese Aufzählung eine Menge Skripte und Verzeichnisse nennt, beschäftigen wir uns einmal konkret mit dem Ablauf, wenn Sie den Runlevel wechseln. Als Root springen Sie vom Runlevel 5 in den Runlevel 1, um am System zu basteln:
root: # init 1
Das Programm init startet als Antwort auf Ihre Eingabe das rc-Skript mit dem Kommando /etc/init.d/rc 1 (SuSE) oder /etc/rc.d/rc 1 (Red Hat), das für diesen Zweck in der Konfigurationsdatei /etc/inittab steht.
Das Rc-Skript initiiert Runlevel 1, indem es zuerst alle Kill-Skripte des aktuellen fünften Runlevels aufruft. Die Kill-Skripte beenden daraufhin jeden Prozess, der im neuen Runlevel nicht gebraucht wird. Sie entdecken diese Skripte am vorangestellten Buchstaben K im Verzeichnis /rc5.d, abhängig von dem Pfad, den Ihre Distribution vorgibt. Danach weckt das Rc-Skript im Verzeichnis rc1.d die Start-Skripte aller Dienste, die zuvor schliefen, deren Arbeit jedoch im neuen Runlevel vom System benötigt wird. Der Buchstabe S kennzeichnet die Start-Skript für Sie. Zusätzlich zu den Buchstaben K und S markieren die nachfolgenden Zahlen die Reihenfolge, in der die Skripte aufgerufen werden.
Beim näheren Hinsehen entpuppen sich die Skripte in den Verzeichnissen rc0.d bis rc6.d als Links, die das System der Red Hat-Distribution zu den Dateien im Verzeichnis /etc/rc.d/init.d knüpft. Bei SuSE liegen die eigentlichen Skripte lose im Verzeichnis /etc/init.d neben den anderen Init-Dateien. Jede der verlinkten Dateien wird zudem, mit dem entsprechenden Parameter, als Kill- oder auch als Start-Skript aufgerufen. Auf diese Weise können Sie Dienste und Daemons per Hand starten, stoppen oder deren Konfiguration neu einlesen:
root: # /etc/init.d/inetd restart
In diesem Beispiel wird der Super-Server inetd gestoppt und sogleich wieder gestartet. Einige Parameter, mit denen Sie die Init-Skripte anstossen können, lesen Sie in Tabelle 3.
Tabelle 3: Parameter der Init-Skripte
start |
Startet den Dienst |
stop |
Stoppt den Dienst |
Status |
Zeigt den Status des Dienstes an |
restart |
Beendet den Dienst und startet ihn neu, bzw. wenn der Dienst noch nicht lief, wird der Dienst nur gestartet |
reload |
Die Konfiguration des Dienstes erneut einlesen |
Grundlegende Init-Skripte
Im letzten Abschnitt unserer Reise durch die Systeminitialisierung wollen wir uns der Dienste annehmen, die während des Hochlaufs des Rechners ausgeführt werden, unabhängig vom Runlevel. Dazu schauen wir noch einmal in die Konfigurationsdatei /etc/inittab. Das Skript, das sofort nach dem Systemstart von init ausgeführt wird, kümmert sich um die Zeiteinstellung, die Verzeichniskonsistenz, regelt die Tastaturbelegung, bindet die Partionen und noch vieles mehr. Es wird, im Gegensatz zum Rc-Skript, nur einmal ausgeführt und ruht danach, gleichgültig, wie häufig Sie den Runlevel wechseln.
Red Hat nennt dieses wichtige Skript /etc/rc.d/rc.sysinit, als Debianer finden Sie die Datei im Pfad /etc/init.d/rcS, und als Nutzer der Nürnberger SuSE 7.2 heisst das Skript in Ihrem Rechner /etc/init.d/boot. Die Datei /etc/inittab schreibt es, je nach Ihrer Distribution, in folgender Anweisung fest:
# SuSE si:I:bootwait:/etc/init.d/boot # Red Hat si::sysinit:/etc/rc.d/rc.sysinit # Debian si::sysinit:/etc/init.d/rcS
Doch nicht nur die Aufrufe und die Namen des Skriptes, das die grundlegenden, in allen Runlevels geltenden Initialierungsschritte besorgt, unterscheiden sich. Auch die Startskripte der zentralen Dienste siedeln je nach Distribution auf anderen Ästen des Verzeichnisbaumes. So bearbeitet das Skript /etc/init.d/rcS von Debian beispielsweise die Dateien des Verzeichnisses /etc/init.d/rcS.d, ein SuSE-System hingegen verlegt diese Arbeit auf die Dateien unterhalb des Pfade /etc/init.d, wobei es das Verzeichnis /etc/init.d/boot.d einbezieht. Bei Red Hat finden Sie schließlich die Startskripte zu Basisdiensten wie halt,crond oder syslogd unter /etc/rc.d/init.d. Ob der verwirrenden Vielfalt der Skripterei möchten wir Sie an dieser Stelle auf das Handbuch Ihrer Lieblings-Distribution hinweisen, das Ihnen spezielle Antworten zur Systeminitialisierung vermittelt.
Zum Schluss unseres Ausfluges gestatten wir uns einen Blick auf die Konfiguration einer Tastenkombination, die echte Erholung verspricht:
ca::ctrlaltdel:/sbin/shutdown -r -t 4 now





