Die Nummer, die mit dem Runlevels verknüpft sind, variieren mit den verschiedenen Distributionen. Sie werden in der /etc/inittab aufgeführt. So sieht z. B. der Eintrag für SuSE-Linux 6.4 so aus:
# runlevel 0 is halt # runlevel S is single-user # runlevel 1 is multi-user without network # runlevel 2 is multi-user with network # runlevel 3 is multi-user with network and xdm # runlevel 6 is reboot
und der für SuSE-Linux 7.3 so aus:
# runlevel 0 is System halt (Do not use this for initdefault!) # runlevel 1 is Single user mode # runlevel 2 is Local multiuser without remote network (e.g. NFS) # runlevel 3 is Full multiuser with network # runlevel 4 is Not used # runlevel 5 is Full multiuser with network and xdm # runlevel 6 is System reboot (Do not use this for initdefault!)
Die Einteilung der Runlevel von 7.3 ist auch aktuell (8.1) noch gültig.
Um zu bestimmen, in welchem Runlevel Sie sich gerade befinden, können Sie den Befehl runlevel verwenden.
Die Runlevels 0 und 6 sind normalerweise reserviert für die Zustände halt und reboot. Aber egal wie die Nummernvergabe auch läuft, der Init-Daemon arbeitet nur die Zeilen der /etc/inittab ab, die mit dem Runlevel verknüpft sind.
Der Runlevel Single-User unterscheidet sich etwas von den anderen Runlevels. Er wird gerne zur Administration und Konfiguration des Systems verwendet, wie z. B. die Reparatur eines beschädigten Dateisystems. Niemand kann sich in das System einloggen, wenn es sich in diesem Modus befindet. Trotzdem können mehrere Prozesse gleichzeitig ausgeführt werden. Dieser Modus ist auch der einzige, in dem der Init-Daemon nicht die Datei /etc/inittab ausliest und abarbeitet. Normalerweise starten Sie das Programm /bin/su um dann als Superuser zu arbeiten.
Wenn Sie einen höheren Runlevel einstellen als den Single-User-Modus, dann startet das System immer im Multiuser-Betrieb. Dann werden die Zeilen mit den Aktionen sysinit, boot und bootwait ausgeführt. Oft werden in diesen Zeilen auch die Dateisysteme gemountet.
Danach führt der Init-Daemon die anderen Zeilen aus, die mit dem Runlevel verknüpft sind. Der angestrebte Runlevel wird in der Zeile
id:2:initdefault:
definiert. Denken Sie daran, daß diese Zeile keinen Prozeß startet, sondern den Runlevel festlegt, mit dem gestartet werden soll. Ein Wechsel des Runlevels erfolgt mit den Befehlen init und telinit.
Im nächsten Abschnitt wird definiert, welche Startskripte ausgeführt werden sollen. Diese Zeile könnte lauten
si::sysinit:/etc/rc.d/rc.sysinit
oder z. B. bei SuSE
si:I:bootwait:/sbin/init.d/boot
Die ID si am Anfang der Zeile wird intern vom Init-Daemon verwendet. Diese Zeile startet das Skript rc.sysinit, welches Aufgaben wie die Aktivierung der Swap-Partition, Starten von fsck und Mounten des Dateisystems übernimmt.
Der folgende Abschnitt definiert die Skripte, die für den jeweiligen Runlevel ausgeführt werden sollen. Sie stehen im Verzeichnis /etc/rc.d bzw. bei SuSE im Verzeichnis /etc/init.d.
l0:0:wait:/sbin/init.d/rc 0 l1:1:wait:/sbin/init.d/rc 1 l2:2:wait:/sbin/init.d/rc 2 l3:3:wait:/sbin/init.d/rc 3 l6:6:wait:/sbin/init.d/rc 6
Das rc-Skript wird mit einem Parameter, der den Runlevel angibt, aufgerufen. Dabei führt es Skripte aus dem Verzeichnis rcn.d aus, wobei n für die Nummer des Runlevels steht.
Daneben kann rc auch Kernel-Module aufrufen. Dies sind Teile des Kernels, die nicht fest einkompiliert wurden. Sie können bei Bedarf nachgeladen und wieder entladen werden. Meistens handelt es sich hierbei um Gerätetreiber, die nicht oft benötig werden.
Die Datei /etc/modules.conf enthält die Liste der Module mit ihren Parametern. Oft handelt es sich bei den Parametern um I/O-Adressen und Interrupts. Ein Ausschnitt aus der /etc/modules.conf könnte so aussehen.
# Aliases - specify your hardware alias parport_lowlevel parport_pc options parport_pc io=0x378 irq=none,none isp16_cdrom_type=Sanyo options ne io=0x300 alias block-major-1 rd alias block-major-2 floppy alias char-major-4 serial alias char-major-5 serial alias char-major-6 lp alias char-major-9 st
Als nächstes werden die Prozesse abgearbeitet, die bei jedem Runlevel ausgeführt werden. Dies ist u. a. der getty-Prozeß, der die virtuellen Terminals anlegt.
# getty-programs for the normal runlevels 1:123:respawn:/sbin/mingetty --noclear tty1 2:123:respawn:/sbin/mingetty tty2 3:123:respawn:/sbin/mingetty tty3 4:123:respawn:/sbin/mingetty tty4 5:123:respawn:/sbin/mingetty tty5 6:123:respawn:/sbin/mingetty tty6
Nach dem Lesen und abarbeiten der /etc/inittab bleibt der Init-Daemon aktiv. Er überwacht das System auf Anweisungen den Runlevel zu ändern oder ob ein Prozeß gestoppt wurde. Wenn einer der Kindsprozesse von init gestoppt ist, macht der Daemon zwei Sachen.
Genauso liest der Daemon die /etc/inittab ein, wenn der Runlevel geändert wurde oder er das Signal über einen Stromausfall bekommt.
Änderungen in der /etc/inittab können Sie mit einem einfachen Editor machen während das System läuft. Bevor die Änderungen aber wirksam werden, muß erst wieder die /etc/inittab gelesen werden. Dies passiert
Seien Sie sehr vorsichtig und gründlich, wenn Sie die Datei /etc/inittab bearbeiten wollen. Ein Fehler in der Datei kann dazu führen, daß Sie sich nicht mehr am System einloggen können. Legen Sie deshalb vorher eine Kopie der Datei an und erstellen Sie eine Bootdiskette für den Notfall. Es besteht die Möglichkeit, daß Sie noch im Single-User-Modus starten können, darauf sollten Sie aber nicht vertrauen. Auch ist es möglich, daß Sie eine Endlosschleife programmieren, so daß ein Prozeß immer wieder gestartet wird. Für diesen Fall überprüft der Init-Daemon, ob ein Prozeß innerhalb von 2 Minuten 10 mal gestartet wurde. Er gibt dann eine Warnung aus und wartet 5 Minuten, bevor er den Prozeß wiederum startet.