--- categories: virtualisation title: Howto LXC ... * Documentation : * Statut de cette page : test / bookworm [LXC](https://linuxcontainers.org/lxc/introduction/) est une interface en espace utilisateur pour piloter les fonctionnalités d'isolation du noyau Linux, permettant de créer des containers. # Installation ~~~ # apt install lxc bridge-utils debootstrap $ lxc-info --version 5.0.2 ~~~ > Note: Avec Debian Buster, il faut rajouter le paquet lxc-templates # Mise en place du réseau virtuel Obligatoire si vous voulez un accès Internet dans vos conteneurs. Une des façons de faire et de monter un bridge qui contiendra tout les conteneurs. Ensuite via iptables, on fera du NAT pour router le réseau privé du bridge via l'interface principale (souvent eth0). ~~~ # cat /etc/network/interfaces [...] auto br0 iface br0 inet static address 192.0.2.254/24 ~~~ ~~~ # echo 1 > /proc/sys/net/ipv4/ip_forward # /sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE ~~~ # Installation d'un container En choisissant de créer un conteneur avec `-t download`, cela vous permettra via un prompt de choisir quel type de distribution à installer. ~~~ # lxc-create -t download -n foo ~~~ On peut directement choisir quel type de distribution on veut. ~~~ # lxc-create -t debian -n foo ~~~ ## Déclarer le réseau virtuel dans la configuration du conteneur Exemple avec la machine `foo`, via le fichier `/var/lib/lxc/foo/config` ~~~ lxc.network.type = veth lxc.network.link = br0 lxc.network.ipv4 = 192.0.2.10/24 lxc.network.ipv4.gateway = 192.0.2.254 lxc.network.name = eth0 lxc.network.flags = up ~~~ Pas de réseau (sauf lo) : ~~~ lxc.network.type = empty ~~~ Partage du réseau avec l'hôte ~~~ lxc.network.type = none ~~~ ## Monter des répertoires dans le conteneur Il faut utiliser l'option `lxc.mount.entry` dans `/var/lib/lxc//config` avec la syntaxe `fstab`. Par exemple : ~~~ lxc.mount.entry = /home home none bind 0 0 lxc.mount.entry = /srv srv none bind 0 0 ~~~ On ne mets pas le `/` pour `home` et `srv` pour la destination. Ces chemins seront complétés avec le chemin de la racine du conteneur (`/var/lib/lxc//rootfs`). # Utilisation basique Lister les conteneurs : ~~~ # lxc-ls foo bar baz ~~~ On peut obtenir plus de détails avec l'option `--fancy` ~~~ # lxc-ls --fancy NAME STATE AUTOSTART GROUPS IPV4 IPV6 foo STOPPED 0 - - - bar RUNNING 1 - 192.0.2.73 2001:DB8::73 ~~~ Démarrer un conteneur : ~~~ # lxc-start -n foo -d ~~~ Entrer dans un conteneur : ~~~ # lxc-attach -n foo ~~~ Arrêter un conteneur : ~~~ # lxc-stop -n foo ~~~ Autres commandes utiles : ~~~ # lxc-info -n foo # lxc-console -n foo # lxc-halt -n foo # lxc-destroy -n foo ~~~ Pour quitter un `lxc-console`. Il faut faire ``. Il semblerait cependant que cela ne fonctionne pas ! Pour exécuter une commande dans un conteneur, sans y rester attaché : ~~~ # lxc-attach -n foo -- command --with --arguments ~~~ # Divers / FAQ / Diagnostic ## systemd Si systemd dans un container pose souci, on peut revenir à sysvinit. ~~~ # apt install sysvinit-core ~~~ ## Erreur accès /dev ~~~ Couldn't open /dev/null: Permission denied ~~~ C'est parce que /dev est crée en 700 au lieu de 755. Pour fixer : ~~~ # chmod 755 /dev ~~~ ## Failed to load config for foo ~~~ # lxc-ls Failed to load config for foo ~~~ Il faut mettre à jour la config : ~~~ # lxc-update-config -c /var/lib/lxc/foo/config ~~~ ## Erreur de démarrage d'un conteneur LXC Si un conteneur est stoppé et qu'il retourne ces erreurs : ``` # lxc-start -n $container_name lxc-start: $container_name: lsm/lsm.c: lsm_process_label_set_at: 174 No such file or directory - Failed to set AppArmor label "lxc-container-default-cgns" lxc-start: $container_name: lsm/apparmor.c: apparmor_process_label_set: 1097 Failed to change AppArmor profile to lxc-container-default-cgns lxc-start: $container_name: sync.c: __sync_wait: 62 An error occurred in another process (expected sequence number 5) lxc-start: $container_name: start.c: __lxc_start: 1951 Failed to spawn container "php73" lxc-start: $container_name: tools/lxc_start.c: main: 330 The container failed to start lxc-start: $container_name: tools/lxc_start.c: main: 336 Additional information can be obtained by setting the --logfile and --logpriority options ``` Alors, il faut réinstaller le paquet et apparmor et relancer le service systemd : ``` # apt reinstall apparmor # systemctl restart lxc # lxc-start -n $container_name ``` Note : le redémarrage du service LXC n'affecte pas le statut des conteneurs. Pour éviter d'autres problèmes à l'avenir avec AppArmor, si le conteneur n'a pas vocation de sécurité, on peut le déconfiner dans sa configuration et le redémarrer : ``` # vim /var/lib/lxc/$container_name/config + lxc.apparmor.profile = unconfined # lxc-stop -n $container_name && lxc-start -n $container_name ```