Systemd Baustein Container
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 |
- Die Images liegen meist unter /var/lib/portables/.
- Genauer: Systemd-portabled
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.