LXC (LinuX Containers) est une technologie isolant un ou plusieurs processus sur un système. Ainsi on isole et limite les effets de bords. Par exemple, on peut limiter un process à n'utiliser qu'un certain pourcentage du processus ou de mémoire.
Ci-dessous je présente deux versions qui sont un peu différentes de part leur conception mais aussi via leurs commande.
Ressources :
apt install lxc bridge-utils debootstrap
C'est la version encore bien présente sur les système Debian. Elles à l’inconvénient de ne pas embarqué les connecteurs réseau par défaut. Ainsi sa configuration est un peu plus compliqué mais ça marche tout aussi bien.
Pour cela on a besoin de renseigner les backports :
echo "deb http://ftp.debian.org/debian jessie-backports main" > /etc/apt/sources.list.d/backports.list
apt-get update && apt-get -t jessie-backports install lxc
Lors de la création des conteneurs, ils seront tous enregistré à l'emplacement /var/lib/lxc.
On édite le fichier de configuration où l'on déclare les cartes réseaux :
nano /etc/network/interfaces
On créé notre bridge :
auto br0 iface br0 inet static address 192.168.1.254 netmask 255.255.255.0 pre-up brctl addbr br0 post-down brctl delbr br0 post-up echo 1 > /proc/sys/net/ipv4/ip_forward post-down echo 0 > /proc/sys/net/ipv4/ip_forward post-up iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE post-down iptables -F POSTROUTING -t nat
Un fois fait, on peut lancer la commande suivante pour monter l'interface:
ifup br0
En fait, celle-ci aura pour rôle de “routeur” virtuel.
A son lancement (lors d'un ifup br0 ) :
A son arrêt (lors d'un ifdown br0 ) :
Pour savoir quel interface sélectionner, il faut appliquer cette règle sur l'interface par défaut. Ici j'ai pris l'exemple de eth0.
Concernant le conteneur, on ajoutera ces directives dans le fichier suivants :
nano /var/lib/lxc/container/config
lxc.network.type = veth lxc.network.link = br0 lxc.network.ipv4 = 192.168.1.110/24 lxc.network.ipv4.gateway = 192.168.1.254 lxc.network.name = eth0 lxc.network.flags = up
Au démarrage du container, il aura l'IP ci-dessus et depuis la machine hôte, on verra une nouvelle interface de type veth.
Si ce n'est pas déjà fait, vérifier que le paquet “dnsmasq-base” soit bien installé car LXC aura seulement besoin du binaire et si le service dnsmasq est installé alors le mettre à l'arrêt.
apt install dnsmasq-base systemctl stop dnsmasq systemctl disable dnsmasq
Adapter et Ajouter ces directives dans le fichier /etc/lxc/default.conf
lxc.net.0.type = veth lxc.net.0.link = lxcbr0 lxc.net.0.flags = up lxc.net.0.hwaddr = 00:16:3e:xx:xx:xx
Notons que c'est le service lxc-net qui s'en occupe:
systemctl restart lxc-net
Certaines valeur doivent être renseigné dans le fichier /etc/default/lxc-net
USE_LXC_BRIDGE="true"
LXC_DHCP_CONFILE=/etc/lxc/dhcp.conf
LXC_DOMAIN="labasemarseille.org"
LXC_ADDR="10.0.42.42" LXC_NETWORK="10.0.42.0/24" LXC_DHCP_RANGE="10.0.42.100,10.0.42.200"
Notons que la plage par défaut de LXC est 10.0.3.0/24. Editer le fichier en y ajoutant /etc/lxc/dhcp.conf
dhcp-host=$NOM-DU-CONTENEUR1,10.0.3.x dhcp-host=$NOM-DU-CONTENEUR2,10.0.3.x
lxc-checkconfig
lxc-create -n mon-conteneur -t debian
lxc-start -n mon-conteneur -d
lxc-attach -n mon-container
lxc config set mon-container boot.autostart true
Pour LXC 2 et + , il y a besoin de mettre la directive dans la config du conteneur:
lxc.start.auto = 1
lxc-stop -n mon-container
lxc-console -n mon-conteneur
Taper sur <Ctrl>+<a> puis indépendamment la touche <q>
lxc-copy -n $mon-container -N $mon-nouveau-container
Dans le fichier suivant on peut ajouter ces directives :
nano /var/lib/lxc/$CONTAINER/config
lxc.cgroup.memory.limit_in_bytes = 100M
lxc-create -n monContainer -t opensuse lxc-create -n monContainer -t ubuntu lxc-create -n monContainer -t debian -- -r bullseye --arch amd64
Ces version sont présenté sous forme de template qui se situent dans ce dossier : /usr/share/lxc/templates/
Il se peut que l'on rencontre quelques bugs pas compréhensible mais voici quelque solutions.
A faire dans le container :
mkdir -p /tmp/user/0/ && chmod 711 /tmp/user/ && chmod 700 /tmp/user/0/