Systemd Baustein Container

Aus Xinux Wiki
Version vom 17. Oktober 2026, 17:47 Uhr von Thomas.will (Diskussion | Beiträge) (Neue Seite: Baustein Container (nspawn, machinectl, portable))
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen
Baustein ab Stufe Lernpfad
Container Stufe 2 bis Stufe 3 Übersicht

Einfach erklärt

  • systemd bringt mit systemd-nspawn einen eigenen, einfachen Container mit.
  • Ein nspawn-Container ist ein Verzeichnis mit einem kompletten Linux darin. Gestartet läuft es mit eigenem systemd, eigenen Prozessen und eigenem Hostnamen, aber mit dem Kernel des Hosts.
  • Das ist wie ein sehr starkes chroot, ähnlich wie LXC, aber ohne zusätzliche Software.
  • machinectl verwaltet die Container wie Dienste: starten, stoppen, anmelden, beim Booten mitstarten.
  • Portable Services gehen einen Schritt weiter: Ein Dienst bringt sein eigenes Dateisystem mit und wird trotzdem wie ein normaler Dienst des Hosts gestartet.

Einordnung

systemd-nspawn LXC Docker VM (KVM)
Was läuft darin ein ganzes System ein ganzes System meist ein einzelner Prozess ein ganzes System
Kernel der des Hosts der des Hosts der des Hosts ein eigener
Verwaltung machinectl, systemctl lxc-*, Proxmox docker virsh, Proxmox
Typisch für Tests, Build-Umgebungen, kleine Dienste Systemcontainer in Proxmox Anwendungen alles mit eigenem Kernel

Einen Container anlegen

apt install systemd-container debootstrap
debootstrap --include=systemd,dbus trixie /var/lib/machines/debian
  • Alle Container liegen unter /var/lib/machines/. Der Verzeichnisname ist der Name des Containers.

root-Passwort setzen

  • Einmal ohne Boot hineinwechseln, wie bei chroot:
systemd-nspawn -D /var/lib/machines/debian
passwd
exit

Booten

  • systemd-nspawn -b -D /var/lib/machines/debian
  • -b startet systemd im Container. Man sieht den Start und bekommt ein Login.
  • Beenden: im Container poweroff, oder dreimal schnell Strg+].

Verwalten mit machinectl

Befehl Wirkung
machinectl list-images alle Container unter /var/lib/machines
machinectl start debian im Hintergrund starten
machinectl list laufende Container
machinectl login debian an der Konsole des Containers anmelden
machinectl shell debian direkt eine root-Shell, ohne Passwort
machinectl status debian Prozesse, Adresse, Dienst
machinectl poweroff debian sauber herunterfahren
machinectl enable debian beim Start des Hosts mitstarten
  • Hinter machinectl start steckt ein normaler Dienst: systemd-nspawn@debian.service
  • journalctl -M debian zeigt das Journal im Container.

Konfiguration pro Container

  • /etc/systemd/nspawn/debian.nspawn
[Exec]
PrivateUsers=pick

[Network]
VirtualEthernet=yes
Option Wirkung
PrivateUsers=pick root im Container ist auf dem Host ein unprivilegierter Benutzer
VirtualEthernet=yes eigene Netzwerkkarte host0 im Container, Gegenstück ve-debian auf dem Host
Bridge=br0 die Karte des Containers an eine Bridge des Hosts hängen
Bind=/srv/daten ein Verzeichnis des Hosts im Container einhängen
Bind-ReadOnly=/srv/daten dasselbe, nur lesbar
  • Netzwerk im Container: Wenn systemd-networkd im Container und auf dem Host läuft, bekommt host0 die Adresse automatisch per DHCP und NAT vom Host. Siehe Systemd Baustein Netzwerk.

Portable Services

  • Ein Image mit einem Dienst darin wird an den Host angehängt. Danach ist es ein ganz normaler Dienst, nur mit eigenem Dateisystem.
Befehl Wirkung
portablectl list angehängte und verfügbare Images
portablectl attach ./dienst.raw Image anhängen, die Units werden sichtbar
systemctl start dienst wie jeder andere Dienst
portablectl detach dienst wieder entfernen

Sicherheit

  • Container teilen sich den Kernel mit dem Host. Eine Lücke im Kernel kann aus dem Container herausführen. Siehe Container vs. VM.
  • Ohne PrivateUsers= ist root im Container auch root auf dem Host, wenn er ausbricht.
  • machinectl shell braucht kein Passwort, nur root auf dem Host. Wer root auf dem Host ist, hat alle Container.
  • Für Analysen: Ein verdächtiges System als Abbild in einen nspawn-Container legen und dort mit --read-only untersuchen, ohne es zu booten.

Stolperfallen

  • Kein Login möglich: root-Passwort vergessen. Ohne -b hineinwechseln und passwd setzen.
  • Kein Netz im Container: networkd läuft nicht, im Container oder auf dem Host.
  • Dateirechte seltsam: Mit PrivateUsers=pick gehören die Dateien auf dem Host hohen UIDs wie 1234567. Das ist so gewollt.
  • Strg+C beendet nicht: Aus einem gebooteten Container kommt man mit poweroff oder dreimal Strg+].

Aufgaben

Grundaufgaben

  1. Legen Sie einen Debian-Container mit debootstrap an.
  2. Setzen Sie das root-Passwort und booten Sie den Container.
  3. Starten Sie ihn mit machinectl im Hintergrund und melden Sie sich mit machinectl login an.
  4. Lassen Sie sich mit machinectl status die Prozesse anzeigen. Wie sehen sie auf dem Host mit ps aus?
  5. Lassen Sie den Container beim Start des Hosts mitstarten.

Für Schnelle

  1. Geben Sie dem Container mit VirtualEthernet=yes eine eigene Netzwerkkarte und installieren Sie darin einen Webserver.
  2. Schalten Sie PrivateUsers=pick ein. Mit welcher UID läuft root aus dem Container auf dem Host?
  3. Hängen Sie ein Verzeichnis des Hosts nur lesbar in den Container.

Weiter