Aus LinuxUser 12/2010

SysV-Init und die Runlevel

Der Nächste, bitte!

Die meisten Distributionen bürden den kompletten Systemstart einem kleinen Programm namens Init auf, das den Job wiederum ganz ungeniert an eine wilde Bande aus Skripten delegiert. Mit denen gilt es zu kämpfen, gerät der Bootprozess einmal ins Stocken.

Direkt nachdem der Linux-Kernel die Hardware unter seine Kontrolle gebracht hat, startet er das Programm /sbin/init – und lehnt sich anschließend erst einmal zurück. Init bleibt jetzt die Aufgabe, alle notwendigen Dienste und Anwendungen zu starten, die für ein voll funktionsfähiges Linux-System notwendig sind. Als erster Prozess im System erhält Init die PID 1. Es bleibt zudem die gesamte Betriebszeit über im Hauptspeicher und lässt sich auch durch Abschussversuche à la kill -9 1 nicht beenden (Abbildung 1). Auf diese Weise kann Init unter anderem lebenswichtigen Prozesse neu starten, falls sich diese einmal unerwartet verabschieden.

Abbildung 1: Wie hier Top verrät, ist Init immer aktiv und trägt die PID 1.
Abbildung 1: Wie hier Top verrät, ist Init immer aktiv und trägt die PID 1.

Hohes Niveau

Hin und wieder möchte man beim Systemstart nur einen ganz bestimmten Teil der Dienste anwerfen. Bereitet beispielsweise die grafische Oberfläche Probleme, wäre es gut, wenn Init sie unbeachtet auf der Festplatte liegen lassen und nur eine einfache Textkonsole hervorholen würde. Um das zu ermöglichen, setzen die meisten Linux-Distributionen ein Init-Programm ein, das mit dem etwas gewöhnungsbedürftigen Konzept der Runlevel arbeitet. Das hoben in den 80er Jahren die Entwickler des Betriebssystems UNIX System V aus der Taufe, weshalb man ein danach arbeitendes Init auch als System-V-Init oder kurz SysV-Init bezeichnet.

Dahinter steht die Idee, dass Init den Computer in einem ganz bestimmten Zustand hinterlässt. So sitzt man nach dem Booten einer Distribution meist vor einem KDE- oder Gnome-Desktop mit funktionierender Netzwerkanbindung. Ein anderer möglicher Systemzustand wäre eine reine Textkonsole ohne Netzwerk oder gar der ausgeschaltete Computer. Ein SysV-Init unterscheidet acht solcher Systemzustände, die man als Runlevel bezeichnet. Zu jedem Runlevel gehört ein Bündel aus Diensten und Programmen, die am Ende des Bootvorgangs aktiv sein sollen. Init teilt man die Nummer des gewünschten Runlevels mit, woraufhin das Programm dann zusammen mit zahlreichen Hilfsskripten den gewünschten Systemzustand herstellt.

TIPP

Stellen Sie sich einen Runlevel einfach als eine von acht möglichen Systemkonfigurationen vor.

Abbildung 2: <code>who -r</code> nennt den aktuellen Runlevel.
Abbildung 2: who -r nennt den aktuellen Runlevel.

Das funktioniert sogar im laufenden System: Wenn Sie als Benutzer root das Kommando /sbin/init 0 eintippen, wechselt Init umgehend in den Runlevel mit der Nummer 0. Dazu beendet es zunächst den aktuellen Runlevel, indem es alle nicht benötigten Dienste stoppt. Anschließend aktiviert es den neuen Runlevel 0. Da dieser dem Systemzustand „Computer ausgeschaltet“ entspricht, fährt Init dabei Linux herunter. Analog dient der Runlevel 6 dem Neustart (Reboot) des Systems. Der Runlevel mit der Nummer 1 führt zu einem Einzelbenutzer-Betrieb, der (genau wie der spezielle Runlevel S) vorwiegend für Wartungsarbeiten gedacht ist. In der Regel darf sich dort nur der Benutzer root anmelden.

Alle übrigen Runlevel belegt jede Distribution etwas anders. Die Macher von OpenSuse 11.3 beispielsweise haben sich für die Konfiguration aus der Tabelle „OpenSuse 11.3: Runlevel“ entschieden. Was dort der Runlevel 5 ist, entspricht unter Debian wiederum dem Runlevel 2.

OpenSuse 11.3: Runlevel

Nummer Beschreibung
0 Computer ausschalten („Shutdown“)
S Einzelbenutzermodus ohne Netzwerk (englisch „Single User Mode“)
1 Einzelbenutzermodus ohne Netzwerk
2 Mehrbenutzermodus ohne Netzwerk
3 Mehrbenutzermodus mit Netzwerk, aber ohne grafische Oberfläche
4 ungenutzt
5 Mehrbenutzerbetrieb mit Netzwerk und grafischer Oberfläche (Standard)
6 Neustart des Systems („Reboot“)

TIPP

Wenn Sie Ihr Linux-System in einem ganz bestimmten Runlevel starten möchten, hängen Sie einfach seine Nummer an den Bootprompt an.

Aktionsplan

Welche Runlevel zur Verfügung stehen, was diese bewirken und welchen davon Init standardmäßig nach dem Einschalten des Computers startet, das regelt die Konfigurationsdatei /etc/inittab. Ein Beispiel für ihren Aufbau zeigt Listing 1: Es zeigt die inittab von OpenSuse 11.3, aus Gründen der Übersichtlichkeit in einer leicht gekürzten Fassung.

Listing 1

# The default runlevel is defined here
id:5:initdefault:
# First script to be executed
si::bootwait:/etc/init.d/boot
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
ls:S:wait:/etc/init.d/rc S
~~:S:respawn:/sbin/sulogin
# what to do when CTRL-ALT-DEL is pressed
ca::ctrlaltdel:/sbin/shutdown -r -t 4 now
# what to do when power fails/returns
pf::powerwait:/etc/init.d/powerfail start
pn::powerfailnow:/etc/init.d/powerfail now
#pn::powerfail:/etc/init.d/powerfail now
po::powerokwait:/etc/init.d/powerfail stop
# getty-programs for the normal runlevels
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

Jede der Zeilen folgt einem identischen Strickmuster und besteht aus vier Spalten, die jeweils ein Doppelpunkt voneinander trennt:

l5:5:wait:/etc/init.d/rc 5

Die erste Spalte gibt der Zeile einen eindeutigen Namen, der aus maximal vier Zeichen bestehen darf – im obigen Beispiel das Kürzel l5. Was genau Init im Runlevel aus der zweiten Spalte machen soll, bestimmen die in der dritten Spalte angegebene Aktion (sie auch Tabelle „Aktionen“) und das in der vierten Spalte vermerkte Kommando. Im Beispiel würde Init im Runlevel 5 den Kommandozeilenbefehl /etc/init.d/rc 5 absetzen und dann warten (wait), bis dieser komplett abgearbeitet wurde.

Die Aktion initdefault bestimmt den Standard-Runlevel nach dem Booten. Gemäß Zeile 2 von Listing 1 handelt es sich dabei unter OpenSuse 11.3 um den Runlevel 5. Ein Befehl ist hier überflüssig, die letzte Spalte bleibt daher leer. Noch bevor Init in diesen Runlevel wechselt, führt es das Skript /etc/init.d/boot aus, wie es die Aktion bootwait in Zeile 5 fordert:

LinuxUser 12/2010 KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS
Deutschland

Hinterlasse einen Kommentar

  E-Mail Benachrichtigung  
Benachrichtige mich zu: