Virtualisierung kann gelegentlich schon recht praktisch sein, neben Virtualbox, VM-Ware, Qemu und Docker gibt’s auch noch das gute alte LXC. Da ich’s gerade bei mehreren Projekten benötige schreibe ich hier mal schnell die Schritte zusammen die nötig sind um unter Ubuntu 20.04 ein Virtuelles Ubuntu im LXC Container zu installieren – das ganze mit einer Network Bridge damit der direkte Zugriff auf’s interne Netzwerk gewährleistet ist.
Die Installation erfolgt recht einfach, ich installiere mit folgendem Befehl die nötigen Pakete:
apt-get install lxc lxc-templates lxc-utils bridge-utils
Anschließend wird das für die Bridge zur Verfügung stehende Interface passend konfiguriert:
network:
bridges:
br0:
interfaces: [enp1s0f0]
dhcp4: yes
ethernets:
enp1s0f0: {}
version: 2
Das war die netplan Variante, manche nutzen ja noch gerne die alte Config im /etc/network/interfaces – die sieht dann wie folgt aus:
auto br0
iface br0 inet static
address 0.0.0.0
# oder falls eine adresse am host rechner
# auf dem bridge interface gefragt ist diese variante:
# address 172.16.1.1
# netmask 255.255.255.0
# gateway 172.16.1.254
bridge_ports eth0
bridge_stp on
bridge_maxwait 0
bridge_fd 0
In der /etc/lxc/default.conf veränderen wir den Wert für lxc.net.0.link von lxcbr0 auf br0:
lxc.net.0.type = veth
lxc.net.0.link = br0
lxc.net.0.flags = up
lxc.net.0.hwaddr = 00:16:3e:xx:xx:xx
Und anschließend deaktivieren wir noch die integrierte Bridge vom LXC die per Default aktiv ist (/etc/default/lxc-net)
# This file is auto-generated by lxc.postinst if it does not
# exist. Customizations will not be overridden.
# Leave USE_LXC_BRIDGE as "true" if you want to use lxcbr0 for your
# containers. Set to "false" if you'll use virbr0 or another existing
# bridge, or mavlan to your host's NIC.
USE_LXC_BRIDGE="false"
Und jetzt wären wir soweit den Container zu erstellen, ich hab gerne die Daten in einem eigenen Verzeichnis welches nicht unter /var zu finden ist – daher hier der etwas längere Befehl zum erstellen des Containers:
lxc-create -t /usr/share/lxc/templates/lxc-ubuntu -n contS01 --bdev dir --dir /srv/lxc/cont01/rootfs -- -u meinuser --password meinkennwort -r focal
Der Befehl läuft eine weil und anschließend findet sich unter /srv/lxc/cont01/rootfs die Dateistruktur des neu erstellten Systems. Jetzt muss dieses nur noch gestartet werden:
lxc-start cont01
Und anschließend kann man sich direkt ins System hinein verbinden:
lxc-console cont01
Mit [STRG A][Q] kommt man wieder raus. Wer wissen will welche Container am Laufen sind, dem Hilft der Befehl
lxc-ls -f
NAME STATE AUTOSTART GROUPS IPV4 IPV6 UNPRIVILEGED
cont01 RUNNING 0 - 172.16.0.1 - false
Soll das so erstellte System beim booten des Host-Systems mit gestartet werden, dann ändert dies der folgende Befehl:
echo "lxc.start.auto = 1" >> /var/lib/lxc/cont01/config
Anschließend muss man mit lxc-stop und lxc-start den Container noch neu starten.
Ich hoffe diese Anleitung hilft jemanden, ansonsten dient sie mir zum Nachschlagen! 🙂
20.10.2021 – Nachtrag: Wer auf einem VMWare System in einer virtuellen Umgebung arbeitet der muss am vswitch den promiscuous Modus aktivieren! (https://kb.vmware.com/s/article/1004099)
Ohne diesen läuft die Bridge nicht aus dem LXC heraus und es gehen keine Pakete über’s Netzwerk.
25.10.2021 – Nachtrag: Das mit dem promiscuous Modus aktivieren ist nicht ganz korrekt, hier habe ich die richtige Vorgehensweise nochmal in einem eigenen Beitrag gepostet!