70 Rootless systemd

Rootless systemd ist ein Konzept, das lange im Schatten des klassischen, systemweiten systemd-Betriebs stand. Viele Administratoren verbinden systemd automatisch mit Root-Rechten, globalen Services und zentralem Boot-Management. Doch systemd besitzt seit Jahren eine vollständige Benutzerinstanz – einen eigenen systemd-Manager pro User. Dieser User-Manager ist weit mehr als ein Randdetail: Er ist die technische Grundlage für moderne Applikationsumgebungen, in denen Entwickler eigene Dienste betreiben, ohne privilegierten Zugriff auf das System zu benötigen. Gerade im Zusammenspiel mit Podman ist rootless systemd ein zentrales Betriebsmodell.

70.1 Der systemd-User-Manager: ein vollwertiges init-System

Sobald sich ein Benutzer einloggt, startet systemd eine User-Instanz. Diese Instanz besitzt:

Technisch ist das kein abgespecktes systemd, sondern eine vollständig isolierte systemd-Umgebung im User-Scope. Sie unterscheidet sich nur in drei Punkten:

  1. Sie darf keine systemweiten Ressourcen manipulieren.
  2. Sie läuft in einem eigenen Slice (user.slice).
  3. Sie wird per Default beim Logout beendet.

Diese dritte Eigenschaft ist der Hauptgrund, weshalb rootless systemd auf den ersten Blick „flüchtig“ wirkt. Doch das ist kein technisches Limit, sondern eine Designentscheidung, die mittels Linger gezielt aufgehoben werden kann.

Ein abstrahiertes Modell:

70.2 Linger: Der Schalter für dauerhafte User-Dienste

Standardmäßig beendet systemd die User-Instanz, sobald sich der Benutzer ausloggt. Das ist sicher und ressourcenschonend. Für Dienste, die auch ohne Session aktiv bleiben sollen – etwa rootless Container –, ist dieses Verhalten hinderlich. Die Lösung lautet:

loginctl enable-linger <username>

Linger bewirkt:

Man könnte sagen: Linger verwandelt die User-Instanz in ein „User-Daemon-System“, das strukturell wie ein globales systemd wirkt, aber ohne Root-Rechte läuft.

70.3 Rootless Podman und systemd: eine ideale Kombination

Podman ist rootless-fähig, systemd ist es auch – die Kombination ist nahezu zwangsläufig. Rootless Container laufen im User-Kontext, verwenden User-Namespaces, UID-Mappings und cgroups im User-Slice. Systemd übernimmt die Verwaltung:

systemctl --user enable webapp.service
systemctl --user start webapp.service

Da kein Root-Daemon beteiligt ist, ist das gesamte Modell vom Kernel nach unten bis zum Applikationsprozess isoliert. Keine privilegierten Systemaufrufe, keine Root-Sockets, keine globalen Dienste.

Für viele Entwickler ergibt sich dadurch ein Betriebsstil, der sich an Kubernetes-Pod-Semantik anlehnt, aber deutlich schlanker bleibt.

Diagrammhaft:

70.4 Ressourcenmodell: cgroups im User-Slice

Rootless systemd erstellt für jeden User einen eigenen cgroup-Baum. Darin laufen auch rootless Container. Dadurch entsteht ein klarer, kontrollierbarer Ressourcenraum:

Rootless Container können darüber hinaus selbst innerhalb ihrer eigenen cgroups weitere Limits nutzen – der Kernel verhindert lediglich Privilegienüberschreitungen. Das bedeutet, ein Entwickler kann in seiner eigenen User-Domain ein vollständiges Ressourcenmanagement betreiben, ohne Root zu involvieren.

Beispiel:

systemctl --user set-property webapp.service MemoryMax=500M

Das betrifft nicht das System, sondern einzig die eigene User-Cgroup.

70.5 Ohne Root starten, mit systemd steuern

Ein wichtiger Aspekt: Rootless systemd darf zwar keine Systemdienste manipulieren, aber er kann Dienste im eigenen Scope persistent starten. Dies umfasst:

Damit lassen sich hochkomplexe Workflows aufbauen, die komplett im User-Kontext laufen. Beispiele:

Typische Unit:

[Unit]
Description=Lokaler Dev-Server

[Service]
ExecStart=/home/dev/bin/start-dev.sh
Restart=always

[Install]
WantedBy=default.target

Kein root, kein sudo – nur der User-Manager.

70.6 Interaktion zwischen rootless systemd und Filesystem

Rootless systemd hat dieselben Rechte wie der Benutzer. Das bedeutet:

Das führt in der Praxis zu Szenarien, die zunächst verwirrend wirken: Ein rootless Container, der ein Verzeichnis nach /var/log mounten soll – das funktioniert nicht. Das Verzeichnis gehört root, und der User darf es nicht beschreiben.

Ein fachlich solides Modell ist daher:

$HOME/.local/share/containers
$HOME/.local/state/...
$HOME/dev-mounts/...

Rootless systemd ist keine Root-Ersatzumgebung – er ist ein Benutzerbetriebssystem.

70.7 Lebenszyklus: Boot → User-Slice → Dienste

Ein vollständiger rootless Boot-Pfad lässt sich sauber darstellen:

Dieser Ablauf macht deutlich, dass rootless Dienste systemweit starten können, ohne selbst privilegiert zu sein.

70.8 Grenzen und Stolperfallen

Rootless systemd besitzt ein paar harte Grenzen, die Architekten und Entwickler kennen sollten:

Daraus folgt in der Praxis: Wer rootless Dienste bereitstellt, muss Ports wie 8080, 3000, 8443 nutzen oder ein Reverse Proxy auf Systemebene einsetzen.

Ebenfalls wichtig: rootless Podman nutzt per Default slirp4netns als Netzwerkisolator. Falls Dienste mit hohen Durchsatzanforderungen laufen, sollte dies bewusst eingeplant werden.

70.9 Architekturvorteile in Multi-User-Umgebungen

Gerade in Shared-Server-Umgebungen – Universitäten, Forschung, Buildserver, Multi-Tenant-Instanzen – ermöglicht rootless systemd ein extrem sauberes Model:

Man kann rootless systemd als „Mini-Cloud im Home-Verzeichnis“ verstehen – mit echter Isolation, echter Prozesssteuerung und echten Systemstrukturen, aber ohne administrative Privilegien.


Rootless systemd eröffnet damit einen Betriebspfad, der technisch klar, sicherheitsarchitektonisch sauber und überraschend leistungsfähig ist.