Runlevel Konfiguration unter Debian
 

Grundlagen:
Ein Linux-System besitzt mehrere sogenannte Runlevels, welche eine Strukturierung der laufenden Dienste darstellen, also so eine Art "Betriebsmodi" des Systems. Debian verwaltet gegenüber dem sonst üblichen Linux-Standard die Runlevel etwas anders. In der Standard-Base sind 6 verschiedene Runlevel definiert:

S1 oder 1 - Ein-Benutzer-Modus (Single User) minimal laufendes System

2 - Mehrbenutzerbetrieb ohne Netzwerkdienste

3 - Mehrbenutzerbetrieb mit Netzwerkdiensten

4 - Unbenutzt, kann individuell konfiguriert werden

5 - Mehrbenutzerbetrieb mit Netzwerkdiensten und grafischer Oberfläche
     (der Standard-Runlevel)

6 - Systemneustart (Reboot)

0 - Systemhalt (Shutdown)

Die Runlevel 0,1 und 6 sind bei Debian identisch, jedoch ist der Standard-Runlevel nach dem Systemstart Nr. 2 und die Runlevel 3,4 und 5 identisch mit 2. Noch eine Besonderheit sind die 7 virtuellen Konsolen, welche nach der Installation Standard mäßig nur in den Runlevel 2 und 3 vorhanden sind. In 1, 4 und 5 gibt es nur eine Konsole (siehe /etc/inittab).

In der Datei /etc/inittab wird der Standard-Runlevel mit folgender Zeile definiert:
id:2:initdefault:
(id:2 hier Runlevel 2)

Die Dienste wie z.B. der Samba-Server oder die grafische Oberfläche werden über sogenannte init-Skripte gestartet, welche bei Debian im Verzeichnis /etc/init.d/ liegen. Das Starten und Stoppen der Programme, also damit das Ausführen der Skripte, wird über Start- und Stop-Links gesteuert. Während dem laufenden Betrieb kann man die Dienste durch Aufruf des Skripts mit dem entsprechendem Befehl starten oder stoppen oder -wenn vorher Konfiguriert- durch Anwählen eines entsprechenden Runlevels:
# /etc/init.d/kdm start
startet den Login-Manager kdm und damit den X-Server.
# /etc/init.d/kdm stop
Stoppt den X-Server.
# /etc/init.d/kdm restart
Macht einen Neustart des X-Servers. Das Gleiche macht auch die Tastenkombi STRG-ALT-BACKSPACE.

Die Entsprechenden Start- und Stop-Links für die Skripte liegen in den Runlevel-Verzeichnissen /etc/rcX.d/, wobei X für die Runlevel 0-6 und auch den Single-User-Mode S steht.
Ein Link besteht aus einem Buchstaben der ihn als Start (S) oder Stopp (K) Befehl kennzeichnet und einer Zahl, die die Reihenfolge festlegt, in der die Befehle abgearbeitet werden, damit Dienste die andere Dienste benötigen nicht zuerst gestartet werden.

Runlevel-Konfigurieren:
Die Runlevel-Konfiguration ist eigentlich sehr einfach, da bei der Paketinstallation schon sämtliche Start- und Stop-Links gesetzt werden. Möchte man diese den eigenen Bedürfnissen anpassen, kann man das entweder auf der Kommandozeile machen oder das KDE-Tool KSysV bemühen. Auf der Kommandozeile schaut man in die Verzeichnisse /etc/rcX.d/ und merkt sich die Zahl vor dem Dienst, den man ändern möchte. Samba hat z.B. für den Stop ein K19 und für den Start ein S20. Nun benennt man einfach in den entsprechenden Verzeichnissen den Befehl um. Ein Beispiel:
# ls /etc/rc3.d/ | grep samba
S20samba (Samba wird hier im Runlevel 3 (rc3) gestartet)
# mv -iv S20samba K19samba
S20samba -> K19samba
Durch das Umbennen wird aus dem Start-Link S20samba ein Stopp-Link namens K19samba und schon startet samba im Runlevel 3 nicht mehr. Möchte man nun das System in den Runlevel 3 versetzen, gibt man einfach
# init 3
auf der Konsole ein.

Beim KDE-Tool KSysV ist es ähnlich einfach. Nach dem Start fragt es nach der verwendeten Software. Nach Auswahl von Linux und Debian hat man mehrere kleine Fenster vor sich, welche übersichtlich nach dem Runlevel und Start (obere Fensterreihe) und Stop (untere Fensterreihe) geordnet sind. Möchte man das Start/Stop-Verhalten eines Dienstes ändern, zieht man ihn einfach von einem der oberen Start-Fenster in das dazugehörige untere Stop-Fenster oder umgekehrt und wählt move (verschieben). Anschließend muß man noch die Nummerierung anpassen und den Speichern-Button betätigen.

Das Debian von den Standard Runlevel abweicht, hat Methode, denn ein einfaches /etc/init.d/Dienst stop stoppt den entsprechenden Dienst, also muß man nicht vorher aufwändig die Runlevel konfiguieren, was nach einem Update sowieso wieder dahin sein kann (siehe Hinweis unten). Eine Runlevel-Konfiguration für einen einzelnen Dienst ist daher nicht sehr zweckmäßig. Geht es jedoch darum eine ganze Palette von Diensten zu beenden (wie im Runlevel 1), dann ist das eine feine Sache, da vielen Aufrufen von /etc/init.d/Dienst stop ein simples init 1 gegenübersteht.

Hinweis:
Bei der Aktualisierung eines Paketes kann die Runlevel-Konfiguration für den jeweiligen Dienst wieder verloren gehen, weil das Paket unter Umständen den Standard wie bei der Installation wieder herstellt.

Runlevel Konfiguration auf der Konsole

Für die Runlevel-Konfiguration auf der Konsole gibt es den Befehl update-rc.d. Ein einfaches
# update-rc.d -f Dienstname remove
entfernt z.B. einen Dienst aus allen Runlevel. Die Option -f (force) benötigt man, da ein vorhandensein des Skripts unter /etc/init.d/ ansonsten die Entfernung verweigert. Möchte man den Befehl vorher testen hilft die Option -n (dry run).

systemd

Ab Debian jessie wird das SysV-System, welches vorher die Dienste verwaltet hat von systemd abgelöst. Ob das neue System besser oder schlechter ist, darüber wurde viel gestritten und schließlich wurde durch eine Abstimmung entschieden systemd zu verwenden. Was für einen Linux-Administrator letzendlich bleibt, sind neue Befehle wie z.B.
# systemctl enable Dienstname
# systemctl disable Dienstname
Leider ist systemd noch sehr neu und verwendet eigene Skripte für die Diensteverwaltung, ist aber abwärtskompatibel zum alten System. Trotzdem kann es natürlich vorkommen, daß der ein oder andere systemctl-Befehl eine Fehlermeldung hervorbringt.

Über mehrere Konfigurationsdateien in /etc/systemd können die Eigenschaften von systemd vorgegeben werden. Über gleichnamige Manpages bekommt man ausführliche Informationen zu den einzelnen Optionen in den jeweiligen Konfigurationsdateien.

In /etc/systemd/system kann man eigene Service-Dateien ablegen. Dies sind Konfigurationsdateien im INI-Format, anhand derer von systemd verwaltbare Services erstellt werden können.

Folgende Dateien und systemd-Programme und -Services werden für die Systemkonfiguration bei der Verwendung von systemd benutzt.

Dateisystemd-ProgrammVerwendungszweck
 systemctlAdministration und Prüfung der verwendeten Services
 journalctlLogeinträge prüfen
/etc/hostnamehostnamectlFestlegen des Computer-Namens im Netzwerk
/etc/localtimetimedatectlFestlegen des Datums, der Uhrzeit, und der Zeitzone
/etc/locale.{conf,gen}localectlDefiniert die verwendete Locale des Systems
 loginctlVerwaltung der Logins und deren Berechtigungen

Einige Beispiele:

# systemctl - zeigt alle momentan laufenden Dienste
# systemctl start Dienst - startet einen Dienst
# systemctl stop Dienst - stoppt einen Dienst
# systemctl restart Dienst - stoppt einen Dienst und startet ihn sofort wieder
# systemctl status Dienst - zeigt den momentanen Status eines Dienstes
# systemctl enable Dienst - aktiviert den Dienst bei Systemstart
# systemctl disable Dienst - deaktiviert den Dienst bei Systemstart

Noch ein Hinweis: Da systemd auch das Logging übernommen hat und ja versucht mehr oder weniger alle Dienste gleichzeitig zu starten um die vorhandenen Rechner-Ressourcen voll auszunutzen, haben die Debian Entwickler bei Debian jessie die Boot-Meldungen beim Start abgeschalten. Möchte man diese behalten, muß man dem Kernel beim booten den Parameter systemd.show_status=1 mitgeben, siehe den Zusatz bei grub2.


Boot Meldungen vom Systemstart

Hat man beim Booten ein paar Fehlermeldungen gesehen (schwups sind sie wieder weg) und möchte diese näher untersuchen, hilft der Befehl journalctl.

journalctl - Query the systemd journal
(zu Deutsch: Das systemd-journal abfragen)

# journalctl
Gibt sämtliche Meldungen aus (eine lange Liste). Möchte man weniger Meldungen haben, hilft der Log-Level:
# journalctl -p 4
-p steuert den Log-Level. Damit kann man die Ausgabe etwas beschränken. Es gibt insgesamt 8 Log Levels wie in syslog dokumentiert:

0 = emerg
1 = alert
2 = crit
3 = err
4 = warning
5 = notice
6 = info
7 = debug

Wird nur ein Log-Level angegeben, werden alle Nachrichten die diesem Level und niedrigeren Leveln entsprechen ausgegeben. Wird ein Bereich angegeben, wird der angegebene Bereich inklusive dem Start und End Level ausgegeben.