# Runit (Init-System)

runit ist ein Init-System für POSIX-Systeme, das als Ersatz für SysVinit konzipiert wurde. Es ist das bzw. ein Standard-Init-System von Void Linux, Dragora, Artix Linux (arch-basiert) sowie antiX (ab Version 19, debian-basiert), Project Trident (ab Version 20.02).

## Zielsetzung und Besonderheiten

Das runit-System ist auf Geschwindigkeit, Codegröße und Portierbarkeit ausgelegt. Der Entwickler empfiehlt die Nutzung der diet libc als C-Bibliothek.
Ein wesentliches Ziel von runit ist die Einhaltung grundlegender Designeigenschaften von UNIX. Dazu gehört, dass man Funktionen auf möglichst kleine Programme aufteilt, um die Komplexität und damit die Fehleranfälligkeit zu verringern. Eine weitere Eigenschaft ist die Portierbarkeit, d. h. ein Programm, das für ein unixartiges Betriebssystem geschrieben worden ist, soll auch auf möglichst vielen anderen unixartigen Betriebssystemen kompiliert werden können.
Hervorzuheben ist, wie runit die Prämisse »Everything is a file« interpretiert: Die Konfigurationen der einzelnen Services sind in Reintextdateien gespeichert, die in Verzeichnisstrukturen gegliedert werden. Welche Services aktiviert sind (z. B. cupsd, smbd usw.), ist hingegen nicht in einer Konfigurationsdatei festgehalten, sondern wird anhand von symbolischen Links in einem definierten Verzeichnis vermerkt, die auf den jeweiligen Service-Verzeichnis verweisen. runit braucht deshalb kein eigenes Programm zur Administration der zu aktivierenden Services, sondern kommt mit dem unix-typischen Befehl ln -s zur Erstellung symbolischer Links aus.
Um den Druckerdämon cupsd dauerhaft zu aktiveren, muss z. B. unter Artix runit folgendes gemacht werden:
* Installation des cupsd-Services: # pacman -S cups-runit
* Erstellung des Symlinks: # ln -s /etc/runit/sv/cupsd /run/runit/service
Derselbe Vorgang würde unter Void Linux folgendermaßen aussehen:
* Installation des cupsd-Services: # xbps-install cups
* Erstellung des Symlinks: # ln -s /etc/sv/cupsd /var/service
Dauerhaft deaktiviert wird das jeweilige Service durch die Entfernung des Symlinks.
Da Symlinks als Metadaten des Dateisystems gespeichert sind, erspart sich runit beim Abruf der Serviceliste den Zugriff auf eine Konfigurationsdatei, wodurch einige Arbeitsschritte wegfallen. Da ein ständiges Auslesen der Serviceliste dadurch sehr effizient ausgeführt werden kann, konnten bei runit auch die bei anderen Init-Systemen typischen Befehle zur Prozessaktivierung (enable) und Deaktivierung (disable) eingespart werden.
Für andere Adminstrationsschritte, wie etwa den manuellen Neustart von Services, enthält runit das Programm sv.
Seit 2020 gibt es ein in Rust implementiertes erweitertes Administrationswerkzeug namens rsv, das zusätzlich zu den Funktionen von sv eine tabellarische Übersicht der Services ausgeben kann und einen enable/disable-Befehl enthält, der die entsprechenden Symlinks erstellt bzw. löscht.

## Funktionsweise

runit arbeitet in drei Stufen: Stage 1 (Bootvorgang), Stage 2 (während der Benutzung des Systems) und Stage 3 (Herunterfahren/Neustart des Systems).

### Stage 1

In dieser Stufe startet runit /etc/runit/1, üblicherweise ein Shellskript. In diesem werden die Initialisierungen des Systems durchgeführt. Es besteht voller Zugriff auf /dev/console, um im Notfall eine Rettungskonsole starten zu können.

### Stage 2

Das Skript /etc/runit/2 sollte vor dem Herunterfahren oder Neustart des Systems keinen Wert zurückgeben. Normalerweise werden hier die Systemdienste gestartet und gesteuert. Dafür greift runit über runsvdir auf die einzelnen Dienste zu.

### Stage 3

Wenn runit angewiesen wird, das System zu beenden, oder das Skript der Stufe 2 ohne Fehler beendet wird, wird /etc/runit/3 aufgerufen, das alle noch laufenden Prozesse aus Stufe 2 beendet und das System herunterfährt.