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)

      • Dans le fichier ./lxchost/config, ajout de

        lxc.mount.auto = sys:rw
        
      • Cette manipulation donne beaucoup de droits au container (y compris sur le système hôte)

    • 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

    • en mode daemon:

      # lxc-start -n lxchost
      
    • en mode console:

      # lxc-start -F -n lxchost
      
  • 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).