Académique Documents
Professionnel Documents
Culture Documents
Avant propos
Pour faire fonctionner des machines virtuelles, il faut un hyperviseur :
➔ Sous Linux, c’est le rôle de KVM et de QEMU (ensemble!)
La surcouche ‘LXD’ permet d’associer les deux fonctions : gestion des VM et des containers
➔ C’est donc LXD qui est intéressant, pas seulement LXC !
LXD est une suite d’outils logiciels émanant du projet LinuX Containers, développé par
‘Canonical' (entreprise qui supporte Ubuntu Linux).
Le projet 'lxc', pour ‘LinuX Containers, est un isolateur de virtualisation permettant de créer des
instances de machines Linux à l’intérieur de 'Containers' isolés.
Les container reposent sur une 'image' d'un système Linux.
Pour créer une nouvelle instance, on réplique l'image d’un système, dans un container qui lui fournit
un environnent dédié.
LXD est en quelques sortes, 'l’hyperviseur' de LXC fournissant les moyens d’exploiter aisément la
couche de gestion des containers et des machines virtuelles Linux, grâce à une seule commande:
'lxc'.
LXD est une surcouche à LXC qui consiste en une fonction d’hyperviseur de VM et de Containers
Dans ce document, les manipulations présentées sont réalisées sur une machine Linux
Debian version 11, sous ‘root', afin de pouvoir saisir les commandes.
Il est préférable de configurer le noyau de la machine hôte, pour permettre le chargement des
‘namespaces’ au démarrage et autoriser tout utilisateur à lancer des containers.
Pour cela, il faut modifier le fichier d’amorçage ‘grub’ (/etc/default/grub)
GRUB_CMDLINE_LINUX="user_namespace.enable=1 namespace.unpriv_enable=1"
Installation de LXD
LXD est installable sous Debian, via un paquet 'snap', il faut donc préalablement installer l’outil
de gestion de paquets 'snapd', ce qui n’est pas nécessaire sous Ubuntu, LXD étant ‘natif’
Maintenant que LXD est installé et configuré, la commande 'lxc' va permettre la manipulation des
instances de Machines Virtuelles et de Containers Linux.
Supprimer un container :
lxc delete Nom-Container
Pour exécuter la commande ‘ls /etc’ dans le container ‘CTN1’ et revenir à la machine hôte :
lxc exec CTN1 -- ls /etc
Pour lancer le shell ‘sh’ afin d’entrer directement en commandes, dans le container ‘CTN1’ :
lxc exec CTN1 -- /bin/sh
Copier le fichier 'exo' de la machine hôte dans le dossier /var/ du container 'CTN1' :
lxc file push exo CTN1/var/
Monter le dossier '/etc/asterisk/' de 'deb-ct', dans le dossier '/var/test' de l'hôte (nécessite sshfs)
lxc file mount deb-ct /etc/asterisk/ /var/test
Créer un profile basé sur le profile 'default', ajoutant un lien réseau vers la carte 'eno1' :
lxc profile copy default new-profile
lxc profile device set new-profile eth0 nictype macvlan
lxc profile device set new-profile eth0 parent eno1 (où eno1 est une carte réseau de la machine hôte)
LXC créé un espace de nom réseau pour chaque container qui se connecte à l’extérieur par une carte
réseau physique ou par un tunnel de type 'veth'.
Les containers se connectent par une carte réseau physique ou un tunnel, de type 'veth'
Pour la mise en réseau, il faut établir un pont entre la machine hôte et l’interface virtuelle veth du
container.
Le container sera donc dans le même domaine de diffusion que l'hôte
Par défaut LXC créé un pont de type NAT (lxdbr0) où chaque container démarré possède une
interface en mode tunnel (veth) dont l’extrémité est connectée au pont 'lxcbr0'
Dans ce cas, une même carte physique apparaît comme ayant plusieurs adresses MAC !
➔ Il faut activer le mode promiscuité : ip link set enp0s3 promisc on
afin que le conteneur puisse communiquer avec les machines du réseau extérieur
à l'exception du serveur LXD.
Pour exploiter facilement cette caractéristique, il peut être intéressant de créer un profil spécifique et
de l’affecter ensuite aux containers qui en auraient besoin.
Il est possible de rediriger des connexions TCP et UDP par redirection de port depuis la machine hôte, vers
l'instance concernée (Container ou V.M.).
Pour cela, il faut que la machine hôte ait une adresse IP affectée au pont réseau sur laquelle l'instance est
connectée.
Exemple :
Rediriger une connexion SSH sur l'hôte 192.168.100.30, vers l'instance 192.168.100.250 attachée au pont
'lxdbr0'
• lxc network forward create lxdbr0 192.168.100.30
• lxc network forward port add lxdbr0 192.168.100.30 tcp 2222 192.168.100.250 22
➔ Pour voir les redirections : lxc network forward show lxdbr0 192.168.1.200
Il faut établir une connexion de type 'Socket proxy' qui redirige les connexions visant un port local,
vers un socket en écoute sur le container.
Exemple :
Permettre l'accès au port TCP/22 du container 'DEB-CT', via le port 2222 local.
• lxc config device add DEB-CT proxy-ssh proxy listen=tcp:0.0.0.0:2222
connect=tcp:0.0.0.0:22
où 'proxy-ssh' est le nom que l'on donne à ce proxy et où '2222 est le n° de port virtuel que
l'on visera pour se connecter au port 22 du container
Exemple :
Établir un proxy pour le port UDP 5060 (protocole SIP) pour le container 'DEB-CT'
Création d’un profile de containers LXC pour associer la carte réseau au Vlan99
• lxc profile copy default VLAN99 ← on créé le profil en partant du modèle ‘default’
• lxc profile device set VLAN99 eth0 nictype macvlan
• lxc profile device set VLAN99 eth0 parent VLAN99
Solution 1
On créé un switch nommé SW-BAT_A, on y attache 2 x interfaces internes avec tag vlan associé et
l’interface physique ‘eth0’, agissant alors comme un Trunk (vlan 1 /10/20)
• ovs-vsctl --may-exist add-br SW-BAT_A
• ovs-vsctl add-port SW_BAT_A eth0
• ovs-vsctl --may-exist add-port SW-BAT_A vlan10 tag=10 -- set interface vlan10 type=internal
• ovs-vsctl --may-exist add-port SW-BAT_A vlan20 tag=20 -- set interface vlan20 type=internal
➔ Le switch comporte deux interfaces en mode ‘access’ (une/vlan)
Solution 2
On créé un switch nommé SW-BAT_A et on y attache 2 x ‘fake-bridge’ et l’interface physique
‘eth0’, agissant alors comme un Trunk (vlan 1 /10/20)
• ovs-vsctl --may-exist add-br SW-BAT_A
• ovs-vsctl add-port SW_BAT_A eth0
• ovs-vsctl --may-exist add-br vlan10 SW-BAT_A 10
• ovs-vsctl --may-exist add-br vlan20 SW-BAT_A 20
➔ Le switch comporte un ‘fake-bridge’/vlan, chacun ayant une interface en mode ‘access’
Etape 3 - On créer ensuite deux profiles de containers en répliquant le profil ‘default’ de LXD
• lxc profile copy default profile-vlan10
• lxc profile copy default profile-vlan20
Etape 4 - On édite ensuite les profiles afin de définir l’interface parent qui lui correspond :
• lxc profile edit profile-vlan10 → parent: vlan10
• lxc profile edit profile-vlan20 → parent: vlan20
Etape 5 - On créé les containers nouveaux en définissant pour chacun, le profile auquel il s’attache
• lxc launch images:alpine/3.18 CT1-ALP -p profile-vlan10
• lxc launch images:alpine/3.18 CT2-ALP -p profile-vlan20
On se connecte avec un navigateur WEB depuis une machine extérieur en visant l’adresse IP du serveur
LXD, sur le port 8080
• Il faudra définir un compte et un mot de passe, pour pouvoir ensuite se connecter
Il s'agit de l’image officielle de MS Windows 10 obtenue par téléchargement sur le site de Microsoft.
Préparation
➢ Il faut commencer par installer l'application 'distrobuilder' qui permet de modifier l'image ISO afin
d'y insérer des fonctions permettant l’accès à distance lors de la procédure d’installation.
➢ Il faut prévoir un client SSH distant avec environnement graphique, depuis lequel seront effectuées
les manips en mode graphique.
NB
Il est nécessaire de prévoir au moins 3 nœuds pour constituer un cluster, ceci afin de pouvoir atteindre un
‘quorum’ suffisant.
Si on ajoute des nœuds existant et possédant déjà une configuration et des instances, tout sera perdu sur le
nœud ajouté.
Cluster - Exploitation
Lancer un container dans un 'node' particulier
• lxc launch ubuntu:22.04 CT-ubuntu --target node2
Mise en place
• snap set lxd ui.enable=true
• systemctl reload snap.lxd.daemon
• snap restart --reload lxd
• lxc config set core.https_address:8443
• ou
• lxc config set core.https_address 192.168.100.1:1234 → (si le serveur dispose de cette adresse)
Il existe aussi la solution LXD mosaic, plus lourde et à installer dans un container