(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
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
- Legen Sie einen Debian-Container mit debootstrap an.
- Setzen Sie das root-Passwort und booten Sie den Container.
- Starten Sie ihn mit machinectl im Hintergrund und melden Sie sich mit machinectl login an.
- Lassen Sie sich mit machinectl status die Prozesse anzeigen. Wie sehen sie auf dem Host mit ps aus?
- Lassen Sie den Container beim Start des Hosts mitstarten.
Für Schnelle
- Geben Sie dem Container mit VirtualEthernet=yes eine eigene Netzwerkkarte und installieren Sie darin einen Webserver.
- Schalten Sie PrivateUsers=pick ein. Mit welcher UID läuft root aus dem Container auf dem Host?
- Hängen Sie ein Verzeichnis des Hosts nur lesbar in den Container.
Weiter