LXC installation

Afin d'écrir cette documentation nous avons suivi le wiki de Debian, et le siteweb de Stéphane GRABER. Vous trouverez les références à la fin de cette documentation. LXC ce prononce leex~cee et fournis un logiciel gratuit de virtualisation sytème qui tourne sous GNU/Linux. Pour la documentation officiel, [please visit lxc]

Versions Supportées

VersionEOLRelease
3.0 LTSJune 1st 2023Buster
4.0 LTSJune 1st 2025Bullseye

LXC Installation

Pour installer LXC sur un system DEBIAN, nous avons besoin de lxc.

:~# apt install lxc

Si vous prévoyer d'utiliser des containers non priviligiés (sans être root), vous aurez besoin d'installer les paquets suivants.

:~# apt install lxc libvirt0 libpam-cgfs bridge-utils uidmap

Installation Réseau

Pour utiliser les containers sur le réseau, il faut virtualiser le réseau local de votre ordinateur ou du serveur, en utilsant un bridge. La façon la plus simple est d'installer les paquets suivant:

:~# apt install libvirt-clients libvirt-daemon-system iptables ebtables dnsmasq-base libxml2-utils iproute2
:~# virsh net-start default
:~# virsh net-autostart default

Configuration réseau avec bridge indépendant

Pour configurer un bridge indépendant pous accéder depuis votre local, vous devez configurer les fichiers suivant: /etc/default/lxc-net & /etc/lxc/default.conf

  1. Créer le fichier lxc-net s'il n'existe pas /etc/default et ajouter la ligne suivante:

    USE_LXC_BRIDGE="true"
  2. Editer le fichier default.conf et changer la valeur par défaut

    lxc.network.type = empty

    par ceci:

    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

    Laisser le reste tel quel.

  3. Executer la commande suivante pour redémarrer le service lxc net.

    :~# service lxc-net restart

Activation du Network pour les conteneurs non privilegiés

Pour configurer le réseau pour les conteneurs non privilegiés, vérifier si le user namespace est activé. Exécuter la commande suivante:

:~# sysctl kernel.unprivileged_userns_clone
kernel.unprivileged_userns_clone = 1

Si c'est à 0 aulieu de 1, cela veut dire que c'est désactivé.
Pour l'activer, ajouter 1 au paramétre suivant: kernel.unprivileged_userns_clone=1 dans /etc/sysctl.conf, ou alors dans un fichier comme /etc/sysctl.d/unpriv-usernd.conf, redémarrer le avec run sysctl -p

Copier le fichier de config dans votre ~/.config/lxc/

cp /etc/lxc/default.conf ~/.config/lxc/default.conf

Configuration

La configuration du réseau et l'activation pour les conteneurs non privilegiés, comme pour les conteneurs activés et démarrés par le root. Nous devons pour les conteneurs non-root, autoriser la création du réseau virtuel en ajoutant lxc-netuser au dossier /etc/lxc/lxc-usernet, avec la configuration suivante:

:~# echo myusername veth lxcbr0 10 >> /etc/lxc/lxc-usernet

Cette commande crée un fichier lxc-usernet s'il n'existe pas ou ajoute à la fin du fichier myusername veth lxcbr0 10.

Cela signifie que "myusername" est autorisé à créer maximum de 10 ethernet virtuel, le device 'veth' connect au lxc bridge 'lxcbr0'

Résoudre le réseau qui ne démarre pas

Parfois certains conteneurs (non privilégiés ou non) ne peuvent pas obtenir d'ip, ce qui peut se produire si le réseau n'a pas été démarré. Pour résoudre le problème, connectez-vous au conteneur et redémarrez le réseau.

:~# lxc-attach xenial
:/# su -
:~# ifconfig eth0 up
:~# ifconfig
eth0 Link encap:Ethernet HWaddr 00:16:3e:ca:11:09 inet addr:10.0.3.68 Bcast:10.0.3.255 Mask:255.255.255.0 inet6 addr: fe80::216:3eff:feca:1109/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:32 errors:0 dropped:0 overruns:0 frame:0 TX packets:17 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:3642 (3.6 KB) TX bytes:1802 (1.8 KB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:324 errors:0 dropped:0 overruns:0 frame:0 TX packets:324 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:25552 (25.5 KB) TX bytes:25552 (25.5 KB)

Si vous n'obtenez toujours pas d'adresse IP, vérifiez si votre dossier resolvconf existe :

:~# cd /run/resolvconf/interface

S'il n'existe pas créer le dossier, mettez à jour le nom de serveur & libérez le dhcp:

:~# mkdir /run/resolvconf/interface
:~# resolvconf -u
:~# dhcpclient -r
:~# dhcpclient
:~# ifconfig

Si cela résout votre problème, mais que vous ne pouvez pas envoyer de ping à www.debian.org, par exemple, cela signifie que vous ne pouvez pas accéder à Internet, dans ce cas, le fichier resolv.conf est manquant dans /run/resolvconf.

:~# echo "nameserver 10.0.3.1" > /run/resolvconf/resolv.conf
:~# echo 'nameserver 127.0.0.53 options edns0' > /run/resolvconf/stub-resolv.conf
:~# /etc/init.d/network restart

Après cela, vous devriez vous connecter à Internet. Merci à kianmeng

Configurer AppArmor

Dans votre ~/.config/lxc/default.conf changer lxc.apparmor.profile = generated avec une des options suivates :

- lxc.apparmor.profile = unconfined
- lxc.apparmor.profile = lxc-container-default-cgns

Autoriser l'utilisateur à créer des conteneurs non-privilégié.

Premiérement, nous devnons être sur que l'utilisateur a uid et gid mappé et defini dans /etc/subuid et /etc/subgid, et défini comme suivant.

:~$ more /etc/subuid
myusername:100000:65536

:~$ more /etc/subgid
myusername:100000:65536

Le dernier step est de créer un LXC non-privilégié, vous devez ajouter au fichier ~/.config/lxc/default.conf les lignes suivantes, qui represente le précédent subuid & subguid:

- lxc.idmap = u 0 100000 65536
- lxc.idmap = g 0 100000 65536

Pour compléter, vous devez autoriser lxc à utiliser des conteneurs, pour autoriser lxc à acceder à votre ~/.local & ~/.local/share, avec set acl [acl]:

:~$ setfacl -m u:100000:x /home/myusername/.local
:~$ setfacl -m u:100000:x /home/myusername/.local/share

Conteneurs Privilégier (root)

Pour toutes informations à propos de toutes les commandes lxc, visiter: man lxc-'cmd'

Pour créer un conteneur en tant que root, vous dever definir une image que vous souhaitez utiliser. La liste des images set trouve à l'adresse suivante lxc images list

Un example ci-dessous:

:~# lxc-create -n mycontainername -t Distribution -- -r Release -a Arch --variant variante

Pour démarrer un conteneur en tant que root:

:~# lxc-start mycontainername

Pour arreter un conteneur en tant que root:

:~# lxc-stop mycontainername

Pour acceder à un conteneur vous pouvez l'attacher à votre terminal de la manière suivante:

:~# lxc-attach mycontainername

Pour lister les conteneurs créer utiliser la commande suivant `lxc-ls` vous pouvez ajouter des options à la commande. Un example ci-dessou:

~:# lxc-ls -f
				
NAME STATE AUTOSTART GROUPS IPV4 IPV6 UNPRIVILEGED
deb11 RUNNING 0 - 10.0.3.22 - false
ubu18 RUNNING 0 - 10.0.3.27 - false
alp03 STOPPED 0 - - - false
Debian supporte IPV6 avec stretch, pour les version superrieur > 9 vous devez les configurer manuellement, en l'activant par le systemd-networkd pour plus d'information, visitez debian IPV6

Conteneurs non-privilégié (non-root)

Pour créer un conteneur en tant que non root, vous devez télécharger une image avec la commande lxc-create, un example ci-dessous montre comment:

:~$ lxc-create -n mycontainername -t download -- -d debian -r bullseye -a amd64 --variant default

Si une erreur survient, *ERROR: Unable to fetch GPG key from keyserver* vous devez ajouter l'option suivante à la commande --keyserver avec ubuntu hkp comme url pour fournir GPG. L'example ci-dessous montre la chaine de commmande compléte:

:~$ lxc-create -n mycontainername -t download -- -d debian -r bullseye -a amd64 --variant default --keyserver hkp://keyserver.ubuntu.com

Pour démarrer un conteneur sans ếtre root l'utilisation de la commande lxc-unprivileged-start, comme l'example ci-dessous:

:~$ lxc-unprivileged-start mycontainername

Comme pour root lister les conteneurs avce la commande lxc-ls:

~:$ lxc-ls -f
			
NAME STATE AUTOSTART GROUPS IPV4 IPV6 UNPRIVILEGED
deb10 RUNNING 0 - 10.0.3.22 - true
ubu16 RUNNING 0 - 10.0.3.27 - true
alp043 STOPPED 0 - - - true

Monter un dossier du host vers un conteneur

Pour monter un dossier du host dans un conteneur, ajouter dans le fichier de configuration du conteneur '/var/lib/lxc/mycontainer/config' le point de montage:

lxc.mount.entry=/path/in/host/mount_point mount_point_in_container none bind 0 0

Un autre example de montage:

# Exposer /dev/sde dans le conteneur

lxc.mount.entry = /dev/sde dev/sde none bind,optional,create=file

Monter FS dans un non privilégié conteneur

Quand un conteneur créer par non root, UID ou GID du point de montange (device) doit etre dans le conteneur root. Pour ce faire, en être sûr, vous devez mapper l'utilisateur courrant avec lxc uid

Dans ./local/share/lxc/container_name/config
Ajouter Mount file :

lxc.mount.entry = /path/to/host/folder /home/username/.local/share/lxc/foldername/rootfs/path/in/container none bind,rw 0 0

Et dans .config/lxc/default.conf configurer mapping

# Container's UID/GID 0-65535 are mapped to host's 100000-165535,
# but UID/GID 1000 on the container is mapped to host's UID/GID 1000.
# replace the previous lxc.idmap set with the following idmap assuming that your uid = 1000 and gid =1000

lxc.idmap = u 0 100000 1000
lxc.idmap = g 0 100000 1000
lxc.idmap = u 1000 1000 1
lxc.idmap = g 1000 1000 1
lxc.idmap = u 1001 101001 64535
lxc.idmap = g 1001 101001 64535

Soyez sur que votre UID et GID correspond à votre utilisateur, verifier avec la commande suivante:

:~$ more /etc/passwd | grep your_user_name
username:x:1000:1000:Username,,,:/home/username:/bin/bash

Le premier 1000 est user id, et le second 1000 group id

Vérifier la configuration

Vérifier lxc-configuration pour voir si tout est activer. Parfois, cgroup est désactivé par défaut, cela s'active simplement en ajoutant les dossiers manquant /sys/fs/cgroup/systemd & /sys/fs/cgroup/freezer

Pour les créer:

# Créer le dossier
:~# mkdir /sys/fs/cgroup/systemd
:~# mkdir /sys/fs/cgroup/freezer
:~# mkdir /sys/fs/cgroup/freezer/0

Monter cgroups

mount -t cgroup -o name,name=systemd systemd /sys/fs/cgroup/systemd
mount -t cgroup -ofreezer freezer /sys/fs/cgroup/freezer

Re-vérifier la config et voyer si cela resemble à la configuration comme ci-dessous

~:$ lxc-checkconfig
-- Namespaces --- Namespaces: enabled Utsname namespace: enabled Ipc namespace: enabled Pid namespace: enabled User namespace: enabled Network namespace: enabled --- Control groups --- Cgroups: enabled Cgroup v1 mount points: /sys/fs/cgroup/systemd /sys/fs/cgroup/freezer Cgroup v2 mount points: /sys/fs/cgroup Cgroup v1 clone_children flag: enabled Cgroup device: enabled Cgroup sched: enabled Cgroup cpu account: enabled Cgroup memory controller: enabled Cgroup cpuset: enabled --- Misc --- Veth pair device: enabled, loaded Macvlan: enabled, not loaded Vlan: enabled, not loaded Bridges: enabled, loaded Advanced netfilter: enabled, loaded CONFIG_NF_NAT_IPV4: missing CONFIG_NF_NAT_IPV6: missing CONFIG_IP_NF_TARGET_MASQUERADE: enabled, not loaded CONFIG_IP6_NF_TARGET_MASQUERADE: enabled, not loaded CONFIG_NETFILTER_XT_TARGET_CHECKSUM: enabled, loaded CONFIG_NETFILTER_XT_MATCH_COMMENT: enabled, not loaded FUSE (for use with lxcfs): enabled, loaded --- Checkpoint/Restore --- checkpoint restore: enabled CONFIG_FHANDLE: enabled CONFIG_EVENTFD: enabled CONFIG_EPOLL: enabled CONFIG_UNIX_DIAG: enabled CONFIG_INET_DIAG: enabled CONFIG_PACKET_DIAG: enabled CONFIG_NETLINK_DIAG: enabled File capabilities: Note : Before booting a new kernel, you can check its configuration usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig
Mis à jour le : 18/10/2021

Aller plus loin

cast_for_education Apprendre

LXC est une virtualisation légère au niveau du système d'exploitation. Les conteneurs sont isolés de l'hôte Linux. LXC facile à installer, créer, utiliser et gérer. Apprenez à installer, créer, utiliser et gérer :

mode_comment Discuter

LxcManage est un projet open source, vous pouvez échanger vos idées, ou voir les progrès. Voir tous les fils de discussion sur Lxc Manager

coffee Contribuer

LXC Manager est un projet communautaire et accepte les contributions de code et de documentation de la communauté. Pourquoi ne pas nous rejoindre ?