Simple Container erstellen mit systemd-nspawn

Ich möchte hier kurz beschreiben wie man mit Standardmitteln „systemd“ einen Container erstellen kann. In meinen Test nutze ich als Host Manjaro Linux (Arch). Anreiz für dieses kleine Infoblatt ist das Linux Magazin. Für das herunterladen der Binary nutze ich debootstrap.

sudo pacman -S debootstrap 

Zu erst muss das Grundsystem heruntergeladen werden.

sudo debootstrap --arch amd64 bullseye /nspawnd/containers/bullseye-1 https://debian.inf.tu-dresden.de/debian

oder für ubuntu

sudo debootstrap --arch amd64 focal /nspawnd/containers/fossa-1 http://de.archive.ubuntu.com/ubuntu

Damit man sich später auch anmelden kann an den Container muss in der /etc/securetty ein „pts/0“ stehen.

echo "pts/0" /nspawnd/containers/bullseye-1/etc/securetty

Der Container kann nun mit systemd-nspawn gestartet werden

sudo systemd-nspawn -D /nspawnd/containers/bullseye-1

Danach kann man gleich die Pakete aktualisieren.

apt update && apt upgrade

Die Datei /etc/hostname sollte im Container gelöscht werden, damit nur der Name von nspanw genutzt wird.

Des Weiteren sollte im Container DBus installiert sein, damit es über machinectl genutzt werden kann.

apt install dbus

So, fertig ist unsere Template um jetzt eine neuen Container zu erstellen muss der Inhalt in einen neuen Ordner kopiert werden.

sudo cp -R bullseye-1/* template/bullseye/
sudo cp -R template/bullseye/* /var/lib/machines/webserver-1

Um jetzt zum Beispiel einen neuen Container zu starten macht man folgendes.

sudo systemd-nspawn -M webserver-1 -b -D /var/lib/machines/webserver-1
Mgibt denNamen an
bboot sucht automatisch die ini
DDirectory das Verzeichnis wo es gestartet werden soll

Ich habe jetzt in meinen Beispiel ein nginx installiert auf den Container webserver-1.

Fertig ist ein nginx Container. Die Netzwerkkonfiguration speichere ich mit in eine nspawn File.

#/etc/systemd/nspawn/webserver-1.nspawn
[Exec]
PrivateUsers=pick
[Network]
Port=tcp:80:80
[Files]
PrivateUsersChown=yes                                  

Leider funktioniert dies in Manjaro nicht !! Somit steht weiter unten eine Unit über .service die funktioniert.

Danach kann der Container über machinectl gesteuert werden.

machinectl start webserver-1

Der nspawn kann dann über eine Service Unit in /etc/systemd/system/webservice-1.service vereinfacht werden.

[Unit]
Description=webserver-1

[Service]
LimitNOFILE=100000
ExecStart=/usr/bin/systemd-nspawn -M webserver-1 -b -D /var/lib/machineswebserver-1
Restart=always

[Install]
Also=dbus.service          

So das war der einfach Weg jetzt kommt noch ein Beispiel mit Images, da ich recht Faul bin, habe ich das Tool mkosi genutzt und wir eine Konfigurationsdatei angelegt mkosi.default

[Distribution]
Distribution=ubuntu
Release=focal

[Output]
Format=gpt_ext4
Bootable=yes
Output=focal-image.raw

[Packages]
Packages=
         vim
         openssh-client
         python3

[Validation]
Password=xxxxxxx

und mit dem aufruf mkosi in dem Verzeichnis wird ein .raw Image erstellt. Aus diesem Image kann man dnn Problem los einen Container starten.

sudo systemd-nspawn -M python -i /var/lib/machines/focal-image.raw -b --bind /mein_skript_verzeichnis/:/root/skripte

Hier nun ein weiteres Beispiel für Firefox.

Schreibe einen Kommentar