# 1.106.2

# Ändern des Runlevels und Niederfahren oder Neustart des Systems

Beschreibung: Prüfungskandidaten sollten in der Lage sein, den Runlevel des Systems zu verwalten. Dieses Lernziel beinhaltet den Wechsel in den Single-User Modus und das Niederfahren oder Rebooten des Systems. Kandidaten sollten auch in der Lage sein, Benutzer vor dem Wechsel des Runlevels zu benachrichtigen und Prozesse sauber zu beenden. Dieses Lernziel beinhaltet auch das Setzen des Standard-Runlevels.

Die wichtigsten Dateien, Bezeichnungen und Anwendungen:

- shutdown
- init
- `/etc/inittab`

### Runlevel und ihr Wechsel

Linux bietet verschiedene Betriebszustände an, sogenannte Runlevel (manchmal auch init-level genannt). Im Wesentlichen geht es dabei um die Frage, welche Dienste zur Verfügung gestellt werden und welche nicht.

Der erste Prozess eines Linux-Systems (der Prozess mit der ProzessID 1) ist der init-Prozess. Dieser Prozess startet (initialisiert) sowohl die Benutzerprozesse (bzw. die getty-Prozesse, bei denen sich die Benutzer dann später anmelden können), als auch die Daemon-Prozesse, also die, die kein eigenes Termonal benutzen sondern im Hintergrund als Dienst arbeiten.

Um nicht nur einen Betriebszustand zu ermöglichen, der immer die selben Dienste anbietet oder nicht, gibt es eben die sogenannten Runlevel. Welche Dienste in welchem Runlevel gestartet werden sollen, lässt sich in der Datei `/etc/inittab` einstellen. Das Format und die verschiedenen Möglichkeiten dieser Datei können auf der Handbuchseite von inittab(5) nachgelesen werden.

Grundsätzlich stehen die Runlevel 0 bis 6 und S (oder s) zur Verfügung. Dabei haben die Runlevel 0, 6 und S eine festgelegte Bedeutung, alle anderen stehen frei zur Verfügung. Verschiedene Linux-Distributionen belegen diese übriggebliebenen Runlevel mit verschiedenen Bedeutungen, es existiert kein Standard. Meist werden mindestens drei Runlevel definiert, einer für Multiuser ohne Netz, einer für Multiuser mit Netz und einer für Multiuser mit Netz und graphischem Login (xdm). Multiuser heißt in diesem Fall, daß das System in der Lage ist, mehrere User gleichzeitig zu bedienen.

Die drei festgelegten Runlevel sind:

Runlevel | Bedeutung
--- | ---
`0` | System herunterfahren ohne anschließenden Neustart. (halt)
`6` | System herunterfahren und neu starten. (reboot)
`S` | System im Single User Mode betreiben

Der Single User Modus ist ein Modus, der in der Systemverwaltung immer dann benötigt wird, wenn Arbeiten durchgeführt werden sollen, bei denen Aktivitäten anderer Benutzer stören könnten. Zum Beispiel die Reparatur eines Dateisystems oder die Spiegelung einer Platte.

Die Datei /etc/inittab enthält einen Eintrag, der dem init-Prozess mitteilt, welcher Runlevel der voreingestellte ist, in dem das System hochfahren soll (initdefault). Das wird in der Regel ein benutzerdefinierter Runlevel (1-5) sein.

Um einen Runlevel manuell zu wechseln, kann der Systemverwalter (und nur er!) das Programm init mit dem gewünschten Runlevel aufrufen. Der Befehl

      init S

würde also das System in den Single User Modus bringen, der Befehl

      init 3

würde es in den Runlevel 3 bringen. Statt init kann auch das Programm telinit benutzt werden, das exakt genauso funktioniert. In der Regel ist telinit nur ein symbolischer Link auf init, der aus Kompatibilitätsgründen existiert.

### Sauberes Herunterfahren des Systems

Um ein Linux-System jetzt herunterzufahren oder neu zu starten könnten wir jetzt einfach schreiben `init 0` bzw. `init 6`. Diese Lösung funktioniert zwar, ist aber aus verschiedenen Gründen nicht die beste Art.

Es sind verschiedene Aufgaben zu erledigen, um ein System sauber herunterzufahren. Diese Aufgaben beinhalten die saubere Beendigung laufender Dienste und Benutzerprogramme, die Synchronisation der Plattenlaufwerke (das physikalische Schreiben des Cache-Inhalts auf die Platte) und nicht zuletzt die Benachrichtigung der noch eingeloggten User, daß das System jetzt heruntergefahren wird.

Es existieren heute verschiedene Programme, die diese Aufgaben zum Teil erledigen, die aber den für die Systemverwaltung wichtigsten Teil weglassen - die Benachrichtigung der User. Die Programme reboot, poweroff, suspend und halt dienen alle dazu, das System auf verschiedene Arten herunterzufahren (in Wahrheit sind reboot, poweroff und suspend nur Links auf halt). Diese Programme teilen dem Kernel mit, daß er eben das System runterfahren, neu starten usw. soll. Moderne Versionen dieser Programme ermitteln, ob sie im Runlevel 0 oder 6 ausgeführt wurden und wenn nicht, rufen sie das Programm shutdown auf.

Das Programm shutdown ist der beste Weg, ein System herunterzufahren oder neu zu starten. Shutdown tut dies auf einem sicheren Weg. Alle eingeloggten User bekommen eine Nachricht, die sie auf das Herunterfahren hinweist und ein einloggen wird blockiert. Es ist möglich, das System sofort herunterzufahren, oder zu einer anzugebenden Uhrzeit oder Zeitdifferenz.

Shutdown schickt allen Prozessen vor dem Herunterfahren zunächst ein TERM-Signal. Das gibt Programmen wie z.B. vi oder joe die Möglichkeit, die ungesicherten Dokumente noch zu speichern, bevor die Programme beendet werden.

Shutdown wird folgendermaßen aufgerufen:

      shutdown [Optionen] Zeit

Die wichtigsten Optionen sind

`-r`
  Reboot. Shutdown fährt das System herunter und startet es dann erneut. Genau genommen wechselt shutdown in den Runlevel 6 nachdem es alle anderen Arbeiten erledigt hat.
`-h`
  Halt. Shutdown fährt das System nur herunter ohne einen Neustart danach. Also ein Wechsel in den Runlevel 0.
`-c`
  Cancel. Ein schon laufender Shutdown wird unterbrochen und somit das System nicht heruntergefahren.

Das Argument Zeit kann in mehreren Formen angegeben werden. Entweder es enthält eine Uhrzeit in der Form `hh:mm` also Stunde und Minute. Dann wird das System zur angegebenen Zeit heruntergefahren. Die Warnmeldung erscheint aber trotzdem schon gleich nach dem Programmaufruf und vom Zeitpunkt des Programmaufrufs bis zum eigentlichen Shutdown kann sich niemand mehr einloggen. Die zweite Form der Zeitangabe ist die Form `+m` was einfach die Anzahl der Minuten ist, bis das System heruntergefahren wird. Steht das Wort `now` statt einer Zeitangabe, so wird es als `+0m` interpretiert.

Die häufigste Anwendung von Shutdown ist das sofortige Herunterfahren mit

      shutdown -h now

oder das gleiche mit reboot statt halt:

      shutdown -r now

Linux kennt die Möglichkeit, der Tastenkombination Strg-Alt-Entf einen Befehl zuzuordnen (einstellbar in /etc/inittab). In den meisten Fällen ist dieser Befehl ein `shutdown -r now`. Das bedeutet aber, daß jeder User, auch ein Normaluser, die Möglichkeit hat, das System herunterzufahren, wenn er Zugriff auf die Tastatur der Systemkonsole hat. Um das einzuschränken kann shutdown in /etc/inittab mit der Option `-a` aufgerufen werden. In diesem Fall überprüft shutdown, ob ein User, der in der Datei `/etc/shutdown.allow` aufgeführt ist, an einer der Consolen arbeitet. Nur dann wird shutdown ausgeführt. Das Format der Datei /etc/shutdown.allow ist einfach ein Username pro Zeile.