hier schreibe ich mal meine Erfahrungen mit dem Aufsetzen von debmatic in einem systemd-nspawn container auf.
Warum aber das Ganze? In einem halbwegs aktuellen linux ist systemd meist der Standard für das Init-System und bringt "nativ" auch eine schöne Lösung zur Virtualisierung mit: systemd-nspawn und machinectl.
Im Vergleich zu Docker bekommt man damit im Tausch gegen etwas Komfort und Abstraktion dann mehr Kontrolle und Optionen für seine Container.
Übersicht:
- Software installieren, Bridge aufsetzten und feste IP für Host einrichten
- Container vorbereiten und mit fester IP einrichten
- debmatic im Container installieren
I. Software installieren, Bridge aufsetzten und feste IP für Host einrichten
Ausgehend von einem frischen Debian 10 / buster geht es nun los mit der benötigten Software
Code: Alles auswählen
$ sudo apt install bridge-utils systemd-container debootstrap
Code: Alles auswählen
$ sudo mv /etc/network/interfaces /etc/network/interfaces.save
$ sudo systemctl enable systemd-networkd
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
...
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 94:c6:91:18:ee:8b brd ff:ff:ff:ff:ff:ff
inet 192.168.178.3/24 brd 192.168.178.255 scope global eno1
...
Code: Alles auswählen
$ sudo tee /etc/systemd/network/br0.netdev << EOF
[NetDev]
Name=br0
Kind=bridge
EOF
Code: Alles auswählen
$ sudo tee /etc/systemd/network/br0.network << EOF
[Match]
Name=br0
[Network]
Address=192.168.178.3/24
Gateway=192.168.178.1
DNS=192.168.178.1
EOF
Code: Alles auswählen
$ sudo tee /etc/systemd/network/eno1.network << EOF
[Match]
Name=eno1
[Network]
Bridge=br0
EOF
Code: Alles auswählen
$ sudo systemctl reboot
II. Container vorbereiten und mit fester IP einrichten
Zuerst wird das Dateisystem für den künftigen Container erstellt. Anleitungen dazu gibt es einige wie etwa hier und hier. Am einfachsten ist es, wenn der Container gleich dem Host ist, dann muss man sich nicht umgewöhnen.
Als root geht es nun weiter:
Code: Alles auswählen
$ sudo -i
Code: Alles auswählen
# cd /var/lib/machines
# debootstrap --include=systemd,dbus,systemd-container,ssh,sudo,apt-transport-https buster buster http://deb.debian.org/debian
Code: Alles auswählen
# machinectl clone buster debmatic
Code: Alles auswählen
# systemd-nspawn -D debmatic
Code: Alles auswählen
root@debmatic:~# echo 'debmatic' > /etc/hostname
Code: Alles auswählen
root@debmatic:~# tee /etc/systemd/network/host0.network << EOF
[Match]
Name=host0
[Network]
Address=192.168.178.4/24
Gateway=192.168.178.1
DNS=192.168.178.1
EOF
Code: Alles auswählen
root@debmatic:~# useradd -G cdrom,floppy,sudo,audio,dip,video,plugdev,systemd-journal,netdev -m -s /bin/bash <user>
root@debmatic:~# passwd <user>
Code: Alles auswählen
root@debmatic:~# exit
Code: Alles auswählen
# mkdir /etc/systemd/nspawn
# tee /etc/systemd/nspawn/debmatic.nspawn << EOF
[Exec]
Hostname=debmatic
PrivateUsers=no
[Network]
Bridge=br0
[Files]
#Bind=/sys/fs/cgroup
EOF
Code: Alles auswählen
# machinectl start debmatic
# machinectl enable debmatic
Code: Alles auswählen
# machinectl status debmatic
# systemctl status systemd-nspawn@debmatic
Nötig ist hier die Aktivierung des Netzwerks im Container:
Code: Alles auswählen
# machinectl shell debmatic
root@debmatic:~# systemctl start systemd-networkd
root@debmatic:~# systemctl enable systemd-networkd
Code: Alles auswählen
root@debmatic:~# tee /etc/sudoers.d/010_me-nopasswd << EOF
<user> ALL=(ALL:ALL) NOPASSWD:ALL
EOF
root@debmatic:~# exit
Code: Alles auswählen
# machinectl login debmatic
debmatic login: ^] ^] ^]
Code: Alles auswählen
# exit
Code: Alles auswählen
$ cd ~
$ ssh-copy-id -i .ssh/id_rsa.pub <user>@debmatic
$ ssh <user>@debmatic
III. debmatic im Container installieren
Im Prinzip folgen wir der Anleitung von Alex. Zuerst braucht der Host die Gerätetreiber:
Code: Alles auswählen
$ sudo apt install apt-transport-https
Code: Alles auswählen
$ wget -q -O - https://www.debmatic.de/debmatic/public.key | sudo apt-key add -
$ sudo bash -c 'echo "deb https://www.debmatic.de/debmatic stable main" > /etc/apt/sources.list.d/debmatic.list'
$ sudo apt update
Code: Alles auswählen
$ sudo apt install linux-headers-amd64
$ sudo apt install pivccu-modules-dkms
Code: Alles auswählen
$ sudo tee /etc/modules-load.d/debmatic.conf << EOF
eq3_char_loop
rpi_rf_mod_led
ledtrig-default-on
ledtrig-timer
led_trigger_timer
hb_rf_usb
EOF
Code: Alles auswählen
$ sudo systemctl edit systemd-nspawn@debmatic
Code: Alles auswählen
[Service]
DeviceAllow=char-usb_device rwm
DeviceAllow=char-eq3loop rwm
DeviceAllow=char-raw-uart rwm
DeviceAllow=char-gpiochip rwm
Code: Alles auswählen
$ cat /proc/devices
Code: Alles auswählen
$ sudo systemctl reboot
Code: Alles auswählen
$ sudo machinectl login debmatic
Code: Alles auswählen
$ ssh <user>@debmatic
Code: Alles auswählen
$ sudo apt install gnupg wget git apt-transport-https
$ wget -q -O - https://www.debmatic.de/debmatic/public.key | sudo apt-key add -
$ sudo bash -c 'echo "deb https://www.debmatic.de/debmatic stable main" > /etc/apt/sources.list.d/debmatic.list'
$ sudo apt update
Code: Alles auswählen
$ sudo apt --no-install-recommends install debmatic