LXC Doc
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
Version | EOL | Release |
---|---|---|
3.0 LTS | June 1st 2023 | Buster |
4.0 LTS | June 1st 2025 | Bullseye |
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
Créer le fichier lxc-net s'il n'existe pas /etc/default et ajouter la ligne suivante:
USE_LXC_BRIDGE="true"
-
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:xxLaisser le reste tel quel.
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