OpenRC: Simple Init System (Artikel 195)
Beherrschung des OpenRC Init-Systems unter Alpine Linux. Erfahren Sie alles über Service-Management, Runlevels und die Erstellung eigener Init-Skripte im Vergleich zu systemd.
# OpenRC Deep Dive: Dienste managen im klassischen Stil
TL;DR / Management Summary Während die meisten Distributionen auf das monolithische systemd setzen, nutzt Alpine Linux das minimalistische OpenRC. OpenRC folgt dem Unix-Prinzip: Es ist eine Sammlung von Skripten, die den Systemstart koordinieren. Es ist deutlich schlanker, transparenter und ideal für Systeme, bei denen jede Sekunde Bootzeit und jedes Megabyte RAM zählt. Wer systemd kennt, muss hier umdenken: Statt
systemctlnutzen wirrc-serviceundrc-update.
# 1. Einführung & Architektur
Dienste als Skripte.
Im Gegensatz zu systemd, das Services als Unit-Files (INI-Format) definiert, nutzt OpenRC klassische Shell-Skripte unter /etc/init.d/.
# Der Service-Fluss (Mermaid)
graph LR
A[PID 1: /sbin/init] --> B[OpenRC Core]
B --> C{Runlevels}
C -->|boot| D[Core Services: hostname, sysctl]
C -->|default| E[User Services: nginx, sshd]
C -->|shutdown| F[Kill all processes]
G[rc-service CLI] --> E
H[rc-update CLI] --> C
# 2. Service Management
Das tägliche Handwerkszeug.
| Aufgabe | systemd Befehl | OpenRC Befehl |
|---|---|---|
| Starten | systemctl start nginx |
rc-service nginx start |
| Stoppen | systemctl stop nginx |
rc-service nginx stop |
| Status | systemctl status nginx |
rc-service nginx status |
| Autostart | systemctl enable nginx |
rc-update add nginx default |
| Deaktivieren | systemctl disable nginx |
rc-update del nginx default |
# 3. Runlevels: Ordnung im Boot-Prozess
Wann startet was?
OpenRC nutzt Runlevels, um Dienste zu gruppieren:
- sysinit: Ganz früh (Mounten von
/proc,/sys). - boot: Kern-Dienste (Netzwerk, Hostname).
- default: Der Standard-Runlevel für Ihre Applikationen (Webserver, DB).
- shutdown: Zum sauberen Beenden.
# Zeige alle Dienste und ihre Runlevels
rc-status
# 4. Eigene Init-Skripte schreiben
Automatisierung unter Alpine.
Ein OpenRC-Skript ist eine einfache Datei unter /etc/init.d/.
# Beispiel: Ein minimaler Dämon
#!/sbin/openrc-run
name="My Proxy"
description="Custom Go Proxy"
command="/usr/local/bin/myproxy"
command_args="--port 8080"
pidfile="/run/myproxy.pid"
command_background="yes"
depend() {
need net
after firewall
}
# 5. Troubleshooting & “War Stories”
Wenn der Dienst stumm bleibt.
# Story 1: “Der hängende Shutdown”
Symptom: Der Alpine-Server braucht beim Herunterfahren 60 Sekunden und wird dann hart gekillt.
Ursache: Ein OpenRC-Skript wartet nicht korrekt auf das PID-File oder ignoriert das SIGTERM Signal.
Lösung: Nutzen Sie retry=TERM/30/KILL/5 im Skript, um OpenRC zu sagen, dass es 30s warten soll, bevor es die harte Keule (KILL) auspackt.
# Story 2: “Dependency Loop im Boot”
Symptom: Der Server bootet, aber das Netzwerk kommt nicht hoch, weil der DHCP-Client auf ein anderes Interface wartet, das nie erscheint.
Ursache: Ein Dienst im Runlevel boot hat eine zyklische Abhängigkeit.
Lösung: Starten Sie mit dem Parameter interactive am Boot-Prompt. OpenRC fragt dann bei jedem Dienst nach, ob er gestartet werden soll. So finden Sie den Übeltäter.
# 6. Fazit & Empfehlung
- Wahl: OpenRC ist perfekt für Docker-Container (falls ein Init nötig ist) und minimalistische VMs.
- Einfachheit: Es gibt keine “Magic” wie bei systemd. Alles ist Shell-Code und für den Admin lesbar.
- Wichtig: Vergessen Sie nicht
rc-update add <service> default, sonst ist Ihr Webserver nach dem nächsten Reboot offline.
# Anhang: Cheatsheet
| Aufgabe | Befehl |
|---|---|
| Alle Runlevels sehen | ls /etc/runlevels |
| Aktuellen Status | rc-status -a |
| Dienst neustarten | rc-service <name> restart |
| Skript Syntax-Check | /etc/init.d/<name> -v |
| Logs einsehen | /var/log/messages (Alpine nutzt kein Journald!) |
| Runlevel wechseln | openrc <target_level> |