05/2014

Initsystem-Alternative Sysadmin Mittelstrecke Runit Runit

68 Wem Sys-V- zu altbacken und zu übergriffig ist, der sollte ein paar Runden mit Runit drehen. Das

Initsystem vereint Vorteile beider Welten miteinander, der Admin behält die Kontrolle. Dominik Honnef www.-magazin.de

nen Unannehmlichkeiten verabschieden. Diese Dateien brauchte Sys-V-Init, um zu erahnen, ob und unter welcher Prozess- ID ein Prozess läuft. Die Methode erwies sich in der Praxis allerdings als anfällig für Race Conditions, nicht gelöschte PID- Dateien verursachen weitere Störungen.

Runits Struktur

Runit besteht aus mehreren aufeinander aufbauenden Komponenten. An unterster Stelle steht »runsv«, das einzelne Dienste startet und überwacht. Dabei helfen sim- ple Shellskripte, die den jeweiligen Dienst (etwa »sshd«) aufrufen. Stürzen das Shellskript und der mit ihm verbundene Dienst unvermittelt ab, startet »runsv« Letzteres neu. Ein zweites Shellskript kümmert sich bei Bedarf um das Logging und verwendet die Standardausgabe des © mezzotint123rf, 123RF © mezzotint123rf, ersten Skripts als Eingabe. Auch dieses Skript überwacht »runsv«. Während eine Distribution nach der zudem, dem aktuellen Trend folgend, An zweiter Stelle steht »runsvdir«: Wie anderen zu Systemd wechselt, geraten mit Linux-Containern oder virtuellen der Name verrät, startet und überwacht bewährte Initsystem-Alternativen wie Maschinen für einzelne Dienste hantiert, es die »runsv«-Prozesse, für jeden Unter- das zehn Jahre alte Runit [1] schnell in braucht womöglich nur die Kernfunktion ordner einen. Alternativ gibt der Admin Vergessenheit. Kein Wunder: Systemd eines guten Initsystems, also die Super­ einen Ordner an, in dem »runsvdir« nach [2] gilt zurzeit als erfolgreichster Zehn- vision von Prozessen. Symlinks sucht, die auf die »runsv«-Ver- kämpfer, weil es so viele Features in sich zeichnisse verweisen. Sie stehen typi- vereint. Es verwaltet die Control Groups Supervision scherweise im Ordner »/service/«. (Cgroups), unterstützt D-Bus und Kernel- Der Admin ergänzt oder entfernt die zu- D-Bus, beherrscht Socket-Aktivierung Zur Supervision gehört, dass ein Init- gehörigen Dienste, indem er die Symlinks und löst Console Kit ab – selbst eine system mit Prozess-ID 1 (PID) startet, modifiziert. Stirbt ein »runsv«-Prozess grafische Konfigurationsoberfläche [3] um Dienste zu überwachen und im Falle unerwartet, startet ihn »runsvdir« neu. darf nicht fehlen. eines Absturzes neu aufzurufen. Dazu Dem Überwachungsdienst entgeht auch Obwohl der Anwender von einzelnen muss es Signale zuverlässig zustellen und nicht, wenn das »/service«-Verzeichnis Features durchaus profitiert, wird er sel- Prozesse beenden können. plötzlich neue Unterordner anbietet oder ten alle Möglichkeiten ausschöpfen. Wer Im Gegensatz zu Sys-V-Init startet Runit alte fehlen. In diesem Fall startet respek- Dienste parallel und stellt sich gegen den tive beendet er die zugehörigen »runsv«- Listing 1: Nginx-Skript traditionellen Ansatz, sie als Daemons Prozesse. in den Hintergrund zu verbannen. Auf Die Hauptkomponente ist aber das 01 #!/bin/sh 02 exec /usr/sbin/nginx ‑g ' off;' 2>&1 diese Weise kann es sich von lästigen »runit«-Programm selbst, das Linux mit PID-Dateien und den damit verbunde- PID 1 ausführt. Seine Aufgabe: Es fährt 05/2014 Sysadmin das System und seine Dienste hoch und wieder runter. Nach dem Start durchläuft »runit« drei Phasen (Stages): n In Stage 1 startet es ein grundlegendes Runit Linux-System. Es mountet und prüft Dateisysteme, richtet Konsolen ein, setzt die Systemuhr und so weiter. n In Stage 2 befindet sich das System 69 vom Start bis zum Ausschalten. Nur Abbildung 1: Das Runit-Tool »sv« kann unter anderem den Status von Diensten abfragen. in dieser Phase nimmt es Signale (»CONT«, »INT«) entgegen, in ihr star- Dienst einsetzen. Auf diese Weise verwal- Tool integriert sich auch gut in die zu den

tet gewöhnlich auch »runsvdir«. ten die User ihre Dienste selbst. Diensten gehörenden Shellskripte. www.linux-magazin.de n Stage 3 kommt ins Spiel, wenn das Neben den drei Hauptkomponenten Als letztes Helferlein sei »svlogd« er- System runterfährt. Darin hängt Runit »runsv«, »runsvdir« und »runit« gibt es wähnt, das Logging samt Logrotation Dateisysteme aus, speichert die Sys- noch diverse weitere Werkzeuge. Am offeriert. Dazu liest es Daten von der temuhr und so weiter. wichtigsten ist »sv«, das Dienste verwal- Standardeingabe und schreibt sie in Interessant für Admins: Sie können bei tet (Abbildung 1). Es kann sie starten, Logdateien. Es achtet auch darauf, dass Bedarf jede Komponente einzeln verwen- stoppen, Signale senden und natürlich Logdateien und Verzeichnisse eine festge- den. Sinn ergibt das beim Einsatz von den Status von Diensten abfragen. legte Maximalgröße nicht überschreiten. »runsvdir«, das nicht notwendigerweise Das Tool »chpst« führt Programme mit mit der Prozess-ID 1 starten muss. So verändertem Prozessstatus aus. Mit ihm Schlecht integriert kann ein Systembetreuer Runit in Ver- ersetzt ein Admin den ausführenden Nut- bindung mit Sys-V-Init verwenden oder zer oder passt die verwendeten Ressour- Die meisten Distributionen arbeiten mit eine »runsvdir«-Instanz pro Benutzer als cen über die »ulimit«-Settings an. Das einem bestimmten Initsystem. Bei Debian 05/2014 Sysadmin ist dies derzeit noch Sys-V-Init, bei Gen- too Open RC [4], bei Ubuntu [5] und bei vielen anderen Distributionen Systemd. Dies bedeutet unter anderem, Runit Runit dass der Paketmanager direkt mit dem Initsystem interagiert, indem er etwa Pro- zesse startet und stoppt. 70 Noch wichtiger aber ist, dass paketierte Programme Startskripte ausschließlich für das hauseigene Initsystem ausliefern – die sind aber meist nicht mit anderen

www.linux-magazin.de Initsystemen kompatibel. Entscheidet sich ein Admin dazu, ein alternatives Init- system wie Runit zu verwenden, muss er sich selbst um die Startskripte kümmern. Abbildung 2: Mit Htop lässt sich der Admin die laufenden Runit-Prozesse übersichtlich anzeigen. In manchen Fällen gibt es vorgefertigte Sammlungen von Startskripten, etwa im In allen anderen Fällen kommen Admins dem Dienst auch alle Kindprozesse be- Ignite-Projekt [6], das dem Admin dabei nicht darum herum, solche Skripte selbst endet. Ist ein Admin auf dieses Verhal- hilft, Runit unter Arch Linux zu verwen- zu schreiben: Das kann durchaus einige ten angewiesen, darf er es für Runit in den. In den meisten Fällen muss er die Zeit und Recherche erfordern. purem Shellskript nachbauen, wozu etwa Skripte aber selbst entwerfen. 50 Zeilen Code nötig sind. Wer nun aber gleich an 100-zeilige Shell- Das Baukastenprinzip skriptmonster denkt, wie sie Sys-V-Init Fazit zum Teil mitbringt, liegt zum Glück Runit bringt zwar nur wenige Features falsch: Runits Shellskripte beanspruchen mit, ist aber so modular und flexibel ge- Das Fehlen einer Integration von Runit meist nur wenige Zeilen. Sie starten das staltet (Abbildung 2), dass der Admin in den Paketmanager lässt sich, je nach besagte Programm, ohne es aber wie Sys- viele Features größerer Initsysteme ohne Perspektive, als Fluch oder Segen be- V-Init in den Hintergrund zu verbannen, viel Aufwand nachbauen kann, etwa die trachten. Ersteres liegt näher, weil der da Runit ja die Supervision übernimmt. Abhängigkeiten zwischen Diensten. Soll Admin die Startskripte für neu installier- Listing 1 zeigt ein Beispielskript für den etwa der Bluetooth-Daemon erst nach ter Dienste per Hand einrichten muss. Webserver Nginx, Listing 2 ein etwas D-Bus starten, muss der Admin keine Allerdings sollten administrierte Systeme komplexeres Skript für den SSH-Dienst, spezielle Syntax einsetzen, sondern passt im Idealfall keine Überraschungen bereit- das die Existenz eines bestimmten Ord- bei Runit einfach das Shellskript des je- halten, was aber passieren kann, wenn ners voraussetzt. weiligen Dienstes so an, dass es die Ab- ein frisch installierter Dienst wie Post- Etwas haariger wird es bei den Skrip- hängigkeit berücksichtigt. Listing 3 zeigt fix automatisch startet. Runit spielt eher ten, die sich um Stage 1 und Stage 3 ein entsprechendes Startskript, dank dem Admins in die Hände, die mehr Kontrolle kümmern. Sie erledigen in der Regel »bluetoothd« auf D-Bus wartet. über ihr System wollen. grundlegende Aufgaben während des Der Befehl »sv check dbus« überprüft Wer sich also statt eines Zehnkämpfers Bootprozesses und sind häufig stark auf den aktuellen Status von D-Bus. Läuft lieber einen anspruchslosen Mittelstre- die verwendete Distribution zugeschnit- der Dienst noch nicht oder startet ihn ckenläufer wünscht, der auch noch ei- ten. Im Falle von Arch Linux beinhaltet das Skript nicht binnen der nächsten 7 nige Tricks beherrscht, sollte einen Blick das erwähnte Ignite-Projekt passende Sekunden, beendet sich das Skript mit auf Runit werfen. Das Initsystem erweist Skripte für diese Stages. Debianer und dem Exit-Status »1«. Runit versucht nun sich als leichtgewichtige, wartbare Lö- die Anhänger anderer Sys-V-Init-basierter den Dienst erneut zu starten, und das sung für spezielle Probleme. (kki) n Systeme greifen derzeit noch auf existie- Spiel beginnt von vorn. In Extremfällen rende Skripte für diese Phasen zurück. führt das zu Endlosschleifen, der Admin muss Skripte nachjustieren. Infos Listing 2: Sshd-Skript [1] Runit: [http://​­smarden.​­org/​­runit/] 01 #!/​bin/​sh exec 2>&1 Prozessmanagement [2] Systemd: [http://​­freedesktop.​­org/​­wiki/​ 02 if [ ! ‑d /var/​run/​sshd ]; then mkdir /var/​run/​sshd ­Software/​­systemd/] 03 chmod 0755 /var/​run/​sshd fi Ein Markenzeichen von Systemd ist die [3] Systemd grafisch einrichten: 04 exec /usr/​sbin/​sshd ‑D ‑e Integration von Cgroups. Während Runit [https://​­github.​­com/​­systemd/​­systemd‑ui] nicht in jedem Fall erkennt, zu welchem [4] Open RC: [http://​­www.​­gentoo.​­org/​­proj/​­en/​ Listing 3: »sv check« Vaterprozess ein Kindprozess gehört, er- ­base/​­/]

01 #!/bin/sh möglichen es Cgroups über Vererbung, [5] Upstart: [http://​­upstart.​­ubuntu.​­com] 02 sv check dbus || exit 1 diese Beziehungen im Detail zu verfol- [6] Ignite-Projekt: 03 exec bluetoothd ‑n ‑d 2>&1 gen. Das stellt sicher, dass Systemd mit [https://​­github.​­com/​­chneukirchen/​­ignite]