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).