KVM in LXC
Objectif
Exécuter une machine libvirt/KVM dans un container LXC.
Problème
La principale difficulté réside dans la gestion des droits à accorder au container afin que KVM puisse s'exécuter.
Environnement de départ
- noyau 4.6 (jessie-backports)
- lxc: (jessie-backports)
- bridge br0 (192.168.0.254/24 qui servira de passerelle au container)
Environnement cible
- un container LXC
- une IP 192.168.0.10/24, passerelle 192.168.0.254
- une IP interne 192.168.1.254 pour un réseau interne au container: 192.168.1.0/24 pour les machines virtuelles KVM
- une VM KVM
Étapes
-
Vérifications initiales:
-
autorisation de /dev/kvm (pour l'accélation de Qemu)
S'assurer de la présence de la ligne suivante dans /usr/share/lxc/config/debian.common.conf
lxc.cgroup.devices.allow = c 10:232 rwm
-
autorisation de /dev/net/tun (pour la création d'interfaces virtuelles par libvirt)
S'assurer de la présence de la ligne suivante dans /usr/share/lxc/config/debian.common.conf
lxc.cgroup.devices.allow = c 10:200 rwm
-
-
création d'un nouveau container (nommé lxchost):
-
Création de l'arborescence lxchost (dans le répertoire courant) à partir du template Debian
# cd /var/lib/lxc # lxc-create -t debian lxchost
-
Autoriser l'accès (depuis le container) à l'ensemble de sysfs (en rw)
-
Mise en place d'un hook pour la création des devices /dev/kvm et /dev/net/tun au démarrage du container:
-
dans le fichier ./lxchost/config, ajout de la ligne:
lxc.hook.autodev = /var/lib/lxc/lxchost/hooks/autodev.sh
-
création du script correspondant au hook (à l'emplacement indiqué, en créant éventuellement le répertoire hooks)
#!/bin/sh cd ${LXC_ROOTFS_MOUNT}/dev mknod kvm c 10 232 mkdir net mknod net/tun c 10 200
-
-
mise en place d'une clé ssh pour se connecter
-
-
démarrage du container
-
configuration de l'environnement cible
# apt-get install libvirt-bin virtinst
-
création de la VM (en mode console)
# virt-install --name kvmguest --ram 512 --location http://ftp.fr.debian.org/debian/dists/jessie/main/installer-amd64/ --disk size=2 --os-variant debianwheezy --console "pty,target_type=serial" --extra-args="console=ttyS0,115200n8 serial"
dans cet exemple, l'installateur est téléchargé depuis un mirroir debian; l'unité de stockage est automatiquement créée sous la forme d'un fichier qcow de 2GB; l'affichage se fait uniquement en mode texte sur la console.
La VM est créée et fonctionnelle dans un container LXC. Bien entendu, les paramètres de création de celle-ci sont libres et doivent être adaptés à votre besoin.
Comme toujours, la lecture de la page [https://linuxcontainers.org/lxc/manpages/man5/lxc.container.conf.5.html man] est très profitable pour affiner cette configuration.
/!En mode console, après l'installation, ne pas oublier pour le premier démarrage d'éditer la ligne de commande GRUB pour ajouter dans les paramètres du noyau: console=ttyS0,115200n8 serial. Sinon, aucun affichage ne sera visible (bien que la VM soit pleinement opérationnelle, ainsi qu'une connexion par SSH l'attestera).