linux-arch-alpine-minimal alpine init-system openrc administration minimalism

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 systemctl nutzen wir rc-service und rc-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>