URL: https://linuxfr.org/news/cloonix-et-les-conteneurs Title: Cloonix et les conteneurs Authors: clownix Benoît Sibaud, palm123, Ysabeau, Pierre Jarillon et Florent Zara Date: 2022-01-15T11:28:23+01:00 License: CC By-SA Tags: virtualisation, container, crun et cloonix Score: 3 Cloonix est un logiciel de virtualisation basé sur qemu-kvm, dpdk et openvswitch. Il permet une construction d’un réseau virtuel avec création graphique et visualisation de la topologie. ![Logo Cloonix](http://clownix.net/images/clownix128.png)| ![Logotype cloonix](http://clownix.net/images/logo_cloonix.gif) ----|----  |  En décembre 2021 une nouvelle fonctionnalité a été intégrée dans cloonix : des conteneurs lancés grâce à l’utilisation du logiciel `crun` par cloonix. Cet article a une visée plus large que la simple publicité pour l’utilisation de cloonix, il est toujours formateur d’utiliser des commandes de bas niveau afin de créer et lancer un conteneur. Ces commandes sont données en seconde partie. ---- [bookworm.img.gz](http://clownix.net/downloads/cloonix-22-01/bulk/bookworm.img.gz) [doc cloonix](http://clownix.net/doc_stored/build-22-01/html/index.html) [clownix](http://clownix.net/) [crun](https://github.com/containers/crun) ---- # Les constituants logiques d’un conteneur Avant de présenter les méthodes utilisées par cloonix pour implémenter la fonctionnalité conteneur, il faut préciser les trois constituants logiques d’un conteneur : le système de fichiers privé, la pile IP privée, et enfin l’exécution privée des processus du conteneur. Pour l’exécution privée, `crun` s’en occupe, mais il reste le système de fichiers ainsi que la pile IP à gérer par cloonix. En premier lieu nous allons décrire le format et la création de l’image représentant le disque tel qu’il est utilisé par cloonix. Cette image contient le système de fichiers racine du conteneur. Puis nous allons voir comment utiliser cette image de façon à présenter aux conteneurs un système de fichier du style _copy-on-write_, c’est-à-dire donner au conteneur l’impression qu’il peut écrire son système de fichiers racine sans qu’il ne modifie l’image de référence. Ensuite, pour la pile IP privée, les commandes associées aux _namespaces_ sont utilisées. Ceci permet d’attribuer des interfaces Ethernet au conteneur. Enfin, pour faire tourner ce conteneur qui possède donc son système de fichiers racine privé et sa pile IP privée, il y a le logiciel écrit en C nommé `crun`. Ce logiciel prend en entrée un fichier de configuration nommé config.json dans lequel on doit mettre le chemin du système de fichiers et le nom de l’espace de nommage (_namespace_) pour les interfaces IP. Si vous exécutez les commandes données ci-dessous, vous pouvez faire tourner manuellement un conteneur avec la même méthode que le fait cloonix. Pour `crun` il faut installer le logiciel sur votre hôte. # Les commandes Voici les commandes utilisées sur une Debian pour créer l’image exemple bookworm.img. Vous pouvez aussi télécharger ce fichier à cette adresse [bookworm.img.gz](https://linuxfr.org/redirect/109770). dd if=/dev/zero of=bookworm.img bs=100M count=10 mkfs.ext4 bookworm.img losetup -fP bookworm.img mkdir -p tmp_mnt DEVLOOP=$(losetup -l | grep bookworm.img | awk '{print $1}') echo $DEVLOOP mount -o loop $DEVLOOP tmp_mnt export DEBOOTSTRAP_DIR=/root/debootstrap-1.0.126+nmu1 INCLUDES="openssh-client,vim,bash-completion,net-tools,tcpdump,tini" cd /root/debootstrap-1.0.126+nmu1 ./debootstrap --no-check-certificate \ --no-check-gpg \ --arch amd64 \ --include=${INCLUDES} \ bookworm \ tmp_mnt \ http://deb.debian.org/debian umount tmp_mnt losetup -d $DEVLOOP rmdir tmp_mnt Voici les commandes qui permettent de présenter un système de fichiers au conteneur, ce système de fichiers sera en /root/overlay/rootfs, et une écriture dans ce système de fichiers ne va pas modifier l’image bookworm.img, toute écriture se retrouvera dans /root/overlay/upper. losetup -fP bookworm.img DEVLOOP=$(losetup -l | grep bookworm.img | awk '{print $1}') mkdir -p /root/overlay/{lower,upper,workdir,rootfs} mount -o loop $DEVLOOP /root/overlay/lower LW="/root/overlay/lower" UP="/root/overlay/upper" WK="/root/overlay/workdir" RT="/root/overlay/rootfs" mount none -t overlay -o lowerdir=${LW},upperdir=${UP},workdir=${WK} ${RT} Voici les commandes qui permettent de générer le _namespace_ et d’ajouter les interfaces, le principe étant qu’on a une paire d’interfaces connectées dans l’hôte puis on envoie l’interface nommée eth0 dans le _namespace_ cloonix_1_1. Avec ce montage, tout paquet IP émis sur vgt_1_1_0 se retrouvera sur eth0 donc dans le container. ip netns ls ip netns add cloonix_1_1 ip link add name vgt_1_1_0 type veth peer name eth0 ip link set eth0 netns cloonix_1_1 ip netns exec cloonix_1_1 ip link set lo up ip netns exec cloonix_1_1 ip link set eth0 up Voici les commandes qui permettent de créer le fichier config.json puis de l’adapter de façon à lui donner le répertoire du système de fichiers et le _namespace_ pour l’interface eth0. crun spec sed -i s"%\"path\": \(.*\)%\"path\": \"/root/overlay/rootfs\",%" config.json sed -i s"/\"readonly\": \(.*\)/\"readonly\": \"false\"/" config.json sed -i s"%\"network\"%\"network\",\n\t\t\t\t\"path\": \"/var/run/netns/cloonix_1_1\"%" config.json sed -i s"/\"terminal\": \(.*\)/\"terminal\": \"false\",/" config.json sed -i s"%\"CAP_KILL\",%\"CAP_KILL\",\n\t\t\t\t\"CAP_NET_RAW\",%" config.json sed -i s"%\"CAP_KILL\",%\"CAP_KILL\",\n\t\t\t\t\"CAP_NET_ADMIN\",%" config.json Enfin tout est prêt pour que crun tourne, voici les commandes pour que le conteneur tourne. La commande `crun exec Cloon1 bash` donne un shell dans le conteneur. crun list crun create --config=/root/config.json Cloon1 crun list crun exec Cloon1 bash crun list Nettoyage complet quand la manipulation est terminée : crun list kill -9 crun list crun delete Cloon1 crun list umount /root/overlay/rootfs umount /root/overlay/lower DEVLOOP=$(losetup -l | grep bookworm.img | awk '{print $1}') losetup -d $DEVLOOP Et voila une méthode maison pour faire tourner un conteneur, cloonix prend ces manipulations à sa charge lorsque vous lui demandez de créer un conteneur.