1 Dec 2019

Debian en tant qu'hyperviseur QEMU/KVM et LXC

Ce guide à pour objectif de vous expliquer comment installer un hyperviseur complet sous Debian Buster. C’est l’équivalent d’un serveur Hyper-V ou VMware ESX.

Voici les fonctionnalités supportées

  • Interface d’administration Web des machines virtuelles permettant de les créer ou de les démarrer.
  • Possibilité de faire des snapshots à froid avec l’interface d’administration.
  • Possibilité de faire des snapshot à chaud pour les sauvegardes.
  • Support de la majorité des systèmes d’exploitations invités.
  • QEMU/KVM permet l’émulation d’une machine virtuelle complète et permet l’installation de presque n’importe quel système d’exploitation invité.
  • LXC permet de faire de la paravirtualisation. Ce mode est très économe en ressource, mais ne permet d’utiliser que certaines distributions GNU/Linux invité.

Matériel recommandé

Il faudra bien entendu un processeur supportant la virtualisation (Intel VT ou AMD-V). Il est également possible de virtualiser avec certains processeurs ARM ou PowerPC. Plus d’information :

http://www.linux-kvm.org/page/Processor_support

La mémoire vive est également très importante, minimum 4 Go ou plus suivant le nombre de machines que vous prévoyez de faire fonctionner. Enfin prévoyez un disque dur externe pour les sauvegardes.

Installation de Debian

Effectuez une installation classique d’une Debian Jessie à l’aide d’une Netinstall par exemple. N’oubliez pas de partitionner votre disque avec LVM prenant le soin de laisser un peu de place dans votre pool LVM. Je suggère le schéma de partitionnement suivant.

Partition schema

L’espace libre dans le pool lvm servira à d’éventuel snapshot de la partition home dans le but de faire les sauvegardes. Cet espace devra pouvoir accueillir les données modifiées tout le long de votre sauvegarde.

Installation de la couche réseau

Installation de l’utilitaire de pont réseau

    apt-get install bridge-utils

Modifier le fichier /etc/network/interfaces

auto br0
iface br0 inet static
    address 192.168.3.4
    netmask 255.255.255.0
    gateway 192.168.3.1
    bridge_ports eth0

Activer l’IP forwarding

    sysctl -w net.ipv4.ip_forward=1

Installation de la couche virtualisation

Installer les paquets nécessaires

    apt-get install kvm libvirt-daemon libvirt-daemon-system sasl2-bin lxc debootstrap cgroupfs-mount xz-utils

Modifier le fichier /etc/default/libvirtd et activer les options suivantes

    cgroups="memory devices"
    libvirtd_opts="-l"

Modifier le fichier /etc/libvirt/libvirtd.conf et activer les options suivantes

    listen_tls = 0
    listen_tcp = 1

Créer le fichier template pour LXC et libvirt

cat > ~/.template-lxc.xml << EOF
<domain type='lxc'>
  <name>HOSTNAME</name>
  <memory>128000</memory>
  <os>
    <type>exe</type>
    <init>/sbin/init</init>
  </os>
  <vcpu>1</vcpu>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <devices>
    <emulator>/usr/lib/libvirt/libvirt_lxc</emulator>
    <filesystem type='mount'>
      <source dir='/var/lib/lxc/HOSTNAME/rootfs'/>
      <target dir='/'/>
    </filesystem>
    <interface type='network'>
      <source network='default'/>
    </interface>
    <console type='pty'/>
  </devices>
</domain>
EOF

Création d’un mot de passe pour libvirt

    saslpasswd2 -a libvirt root

Vérifier le nom du compte créé

    sasldblistusers2 -f /etc/libvirt/passwd.db

Configuration du réseau dans libvirtd

Créer un fichier de configuration qui contiendra le bridge

cat > ~/.network-default.xml << EOF
<network>
  <name>default</name>
  <forward mode='bridge'/>
  <bridge name='br0'/>
</network>
EOF

Puis l’appliquer

    virsh net-undefine default
    virsh net-define ~/.network-default.xml
    virsh net-start default
    virsh net-autostart default
    rm ~/.network-default.xml

Configuration du storage dans libvirtd

cat > ~/.storage-default.xml << EOF
<pool type='dir'>
  <name>default</name>
  <target>
    <path>/storage/qemu</path>
    <permissions>
      <mode>0755</mode>
      <owner>0</owner>
      <group>0</group>
    </permissions>
  </target>
</pool>
EOF

Puis le définir

    mkdir /storage/qemu
    virsh pool-define ~/.storage-default.xml
    virsh pool-start default
    virsh pool-autostart default

Configuration du stockage

Activer le RAID 1 (mirroir) pour tous les volumes

    for volume in swap root storage ; do
        lvconvert -m1 /dev/debian/${volume}
    done

Créer les dossiers et les liens symboliques

    mv /var/lib/lxc/ /storage
    ln -s /storage/lxc /var/lib/lxc

Création de la première machine LXC

On défini une variable qu’on utilisera plus tard

    lxchostname=<nom de votre machine>

On créer la machine qui créera un dossier dans /storage/lxc/test contenant notre nouveau système

    lxc-create --template download --name $lxchostname

On peut aussi directement spécifier les options en une seule ligne

    lxc-create --template download --name $lxchostname -d debian -r stretch -l amd64

On créer le fichier de configuration pour libvirtd qu’on applique

    sed "s/HOSTNAME/${lxchostname}/g" ~/.template-lxc.xml > ~/.temp.xml
    virsh -c lxc:// define ~/.temp.xml
    rm ~/.temp.xml

On fait quelques ajustement si nécessaire dans le nouveau filesystem comme corriger un problème avec systemd

    rm /storage/lxc/${lxchostname}/rootfs/etc/systemd/system/getty.target.wants/getty*

On peut entrer (chroot) dans le dossier et faire ce qu’on veut

    mount --bind /dev /storage/lxc/${lxchostname}/rootfs/dev
    mount --bind /proc /storage/lxc/${lxchostname}/rootfs/proc
    cp /etc/resolv.conf /storage/lxc/${lxchostname}/rootfs/etc/resolv.conf
    chroot /storage/lxc/${lxchostname}/rootfs/

Debian

Puis installer par exemple ssh, ajouter un compte et définir le mot de passe root

    apt-get install -y ssh
    passwd root
    adduser *compte_de_votre_choix*
    exit

Ou bien activez sudo, par exemple

    apt-get install -y ssh sudo
    adduser iabsis
    adduser iabsis sudo
    exit

CentOS

Puis installer par exemple ssh, ajouter un compte et définir le mot de passe root

    yum install openssh-server
    passwd root
    adduser *compte_de_votre_choix*
    exit

Ou bien activez sudo, par exemple

    yum install openssh-server sudo
    adduser iabsis
    passwd iabsis
    usermod -aG wheel iabsis
    exit

A la fin, ne pas oublier de démonter les bind

    umount /storage/lxc/${lxchostname}/rootfs/dev
    umount /storage/lxc/${lxchostname}/rootfs/proc

On peut maintenant démarrer le container et le mettre au démarrage

    virsh -c lxc:// start ${lxchostname}
    virsh -c lxc:// autostart ${lxchostname}

Si on souhaite se connecter à la console

    virsh -c lxc:// console ${lxchostname}

Si on souhaite supprimer le container

    virsh -c lxc:// destroy ${lxchostname}
    virsh -c lxc:// undefine ${lxchostname}
    rm -rf /storage/lxc/${lxchostname}

Tags: