Ähnlich wie im Artikel LXC-Cluster erstellen mit LXD 3.0 von Rasputin beschrieben, benötigt man auch unter Debian GNU/Linux das Paket snapd, um LXD (also LXC in der Version 3.0) installieren zu können.
Davon ausgehend, dass man sich per su root-Rechte verschafft hat, lauten die Befehle für eine vollständige Installation folgendermaßen:
apt install lxc snapd
snap install lxd
Jetzt muss der Host noch so konfiguriert werden, dass eine Netzwerkbrücke zur Verfügung steht, sodass die Container direkten Netzwerkzugriff bekommen. Davon ausgehend, dass es sinnvoll ist dem Host eine feste IP-Adresse zu vergeben, sieht hier die Konfigurationsdatei /etc/network/interfaces z. B. so aus:
# The primary network interface
#allow-hotplug enp3s0
#iface enp3s0 inet static
auto hostbr0
iface hostbr0 inet static
bridge_ports enp3s0
bridge_fd 0
address 192.168.1.10
netmask 255.255.255.0
gateway 192.168.1.1
dns-nameservers 192.168.1.1
dns-search some-domain.local
Wichtig ist hierbei tatsächlich, dass das physische Interface auskommentiert ist. Wenn man z. B. auf der Physik die statische IP-Adresse vergibt, wird der Host irgendwann nicht mehr erreichbar sein, weil die Brücke, die von LXC-Containern verwendet wird, die Physik beansprucht. Also nutzen genau genommen das Hostsystem sowie auch die Container diese Netzwerkbrücke, sofern nur ein Netzwerkanschluss zur Verfügung steht. Bei mehreren Netzwerkkarten erübrigt sich diese Vorgehensweise natürlich.
Weiter an diesem Beispiel muss man auf dem Host natürlich noch das Routing anpassen. Aber zunächst sollte man den Netzwerkdienst neustarten:
/etc/init.d/networking restart
Anschließend wird das Routing vom physischen Interface entfernt und auf die Brücke gelegt:
ip route delete default via 192.168.1.1 dev enp3s0
ip route add default via 192.168.1.1 dev hostbr0
Sofern man das System aus der Ferne per SSH konfiguriert, lässt sich das Ganze auch automatisieren, sodass man sich gleich danach wieder verbinden kann. Dafür benötigt man screen:
screen
/etc/init.d/networking restart && ip route delete default via 192.168.1.1 dev enp3s0 && ip route add default via 192.168.1.1 dev hostbr0
Während die Verbindung zwangsläufig abbricht, läuft die Sitzung per screen weiter im Hintergrund und die Aktion wird entsprechend zuende geführt.
Anschließend überprüft man die Netzwerke in LXC:
root@lxc:~# lxc network list
+---------+----------+---------+-------------+---------+
| NAME | TYPE | MANAGED | DESCRIPTION | USED BY |
+---------+----------+---------+-------------+---------+
| enp3s0 | physical | NO | | 0 |
+---------+----------+---------+-------------+---------+
| hostbr0 | bridge | NO | | 0 |
+---------+----------+---------+-------------+---------+
Und erstellt ein Standard-Profil:
lxc profile create default
Jetzt muss man das natürlich noch konfigurieren:
lxc profile edit default
Es erscheint ein Editor und der Inhalt sollte so angepasst werden, dass es so aussieht:
### This is a yaml representation of the profile.
### Any line starting with a '# will be ignored.
###
### A profile consists of a set of configuration items followed by a set of
### devices.
###
### An example would look like:
### name: onenic
### config:
### raw.lxc: lxc.aa_profile=unconfined
### devices:
### eth0:
### nictype: bridged
### parent: lxdbr0
### type: nic
###
### Note that the name is shown but cannot be changed
config: {}
description: Default LXD profile
devices:
eth0:
nictype: bridged
parent: hostbr0
type: nic
name: default
used_by:
- /1.0/containers/web2
Unter devices: erstellt man den Eintrag eth0, der entsprechend die Netzwerkbrücke hostbr0 verwendet, vom Host-System.
Jetzt fehlt nur noch ein Storage, wo Container abgelegt werden:
lxc storage create lxc01 btrfs
Und schon kann man Container anlegen, die direkt Netzwerkzugriff erhalten (und dabei selbst per DHCP vom Netzwerk die Einstellungen beziehen, sofern vorhanden):
lxc launch images:debian/stretch/amd64 web2 -s lxc01 -p default
Am Ende sieht die LXD-Konfiguration etwa so aus:
root@lxc:~# lxc list --fast
+------+---------+--------------+----------------------+----------+------------+
| NAME | STATE | ARCHITECTURE | CREATED AT | PROFILES | TYPE |
+------+---------+--------------+----------------------+----------+------------+
| web2 | RUNNING | x86_64 | 2018/04/12 19:11 UTC | default | PERSISTENT |
+------+---------+--------------+----------------------+----------+------------+
root@lxc:~# lxc network list
+---------+----------+---------+-------------+---------+
| NAME | TYPE | MANAGED | DESCRIPTION | USED BY |
+---------+----------+---------+-------------+---------+
| enp3s0 | physical | NO | | 0 |
+---------+----------+---------+-------------+---------+
| hostbr0 | bridge | NO | | 1 |
+---------+----------+---------+-------------+---------+
root@lxc:~# lxc storage list
+-------+-------------+--------+------------------------------------------+---------+
| NAME | DESCRIPTION | DRIVER | SOURCE | USED BY |
+-------+-------------+--------+------------------------------------------+---------+
| lxc01 | | btrfs | /var/snap/lxd/common/lxd/disks/lxc01.img | 3 |
+-------+-------------+--------+------------------------------------------+---------+
root@lxc:~# lxc profile list
+---------+---------+
| NAME | USED BY |
+---------+---------+
| default | 1 |
+---------+---------+
Um auf die Shell des Containers zu wechseln, empfehle ich:
lxc exec web2 bash
Damit ist man direkt auf der root-Shell und kann z. B. passwd ausführen und SSH installieren / einrichten, Netzwerkeinstellungen vornehmen usw.