KVM (Kernel-based Virtual Machine) est une solution de virtualisation sous linux. Elle est intégrée au noyau permettant ainsi de diminuer l’overlay (le coût dû à la virtualisation). L’avantage de cette solution est qu’elle n’est pas soumise à l’installation de modules supplémentaires ni de drivers particuliers. KVM est utilisé par plusieurs solutions : Ovirt / Proxmox / Archipel / Openstack. Un des principaux avantages de KVM est de pouvoir virtualiser tout type de système d’exploitation tant qu’ils sont basés sur la même architecture CPU que l’hyperviseur. KVM ne nécessite pas d’installation mais seulement certaines instructions CPU. Afin de le contrôler et le gérer, nous allons utiliser la libvirt qui est la librairie de manipulation de technologie de virtualisation. Elle ne sert pas uniquement à KVM, mais peut être utlisée pour lxc, openvz, xen, etc…

POUVEZ-VOUS UTILISER KVM ?

Afin de déterminer si vous pouvez utiliser KVM, il suffit d’exécuter cette commande :

sudo awk "/vmx/ || /vt/" /proc/cpuinfo

Si vous avez un retour, exemple :

flags      : fpu vme de ... monitor ds_cpl vmx est tm2 ... hwp_epp

c’est que vous allez pouvoir utiliser KVM, et vous pouvez passer à la rubrique suivante.

Si vous n’avez pas de retour, deux hypothèses :

  • Vérifier que la virtualisation est “active” dans le BIOS de votre machine. Si ce n’est pas le cas, activez là. N’hésitez pas à relancer la commande citée plus haut pour vérifier la prise en compte du paramètre
  • Malheureusement, votre processeur ne gère pas la virtualisation

Vous ne pouvez utiliser qu’une seule technologie de Virtualisation à la fois car ce module ne peut être chargé qu’une seule fois.

UTILISATION DE KVM

Installation des paquets

Pour contrôler KVM, installez les paquets suivants :

  • Sous Debian :
    apt install libvirt-bin qemu-kvm
    
  • Sous Redhat :
    yum install libvirt-daemon qemu-kvm
    

Ces paquets permettent la gestion de KVM en ligne de commande via l’outil virsh. Pour un usage avec une interface graphique, il est indispensable d’installer virt-manager. Par défaut, seul l’utilisateur ‘root’ et ceux disposant de droits ‘sudo’ peuvent utiliser libvirt. Si vous souhaitez qu’un utilisateur “non privilégié” puisse l’utiliser aussi, il faut l’ajouter dans le groupe libvirt :

sudo gpasswd -a UTILISATEUR libvirt

Pensez à vous déconnecter/reconnecter de votre session pour que les modifications soient prises en compte.

Configuration de l’environnement

La création de la machine virtuelle se base sur une image ou une ISO, de votre distribution préférée, une configuration réseau, et un stockage permanent (disque virtuel de votre VM).

Il est possible pour le disque système d’utiliser plusieurs solutions :

  • un fichier
  • un disque dur
  • un volume logique LVM

Vous avez le choix de votre configuration réseau, cependant nous vous présentons les plus courantes :

  • NAT
  • Par Pont

Pour le NAT, il n’est pas nécessaire de configurer ni un serveur DNS ni un serveur DHCP, car il embarque un DNSMASQ qui assurera ces rôles.

Pour la configuration par pont, la machine virtuelle se connecte sur le même réseau que l’hôte. Si vous disposez de plusieurs cartes réseaux physique, vous avez la possiblilité de choisir l’interface partagée. Pour identifier le réseau par défaut :

$ virsh  --connect qemu:///system net-list 
 Nom                  État      Démarrage automatique Persistent
----------------------------------------------------------
 default              actif      yes           yes

Puis pour l’editer :

$ virsh --connect qemu:///system net-edit default

<network>
  <name>default</name>
  <uuid></uuid>
  <forward mode='nat'/>
  <bridge name='virbr0' stp='on' delay='0'/>
  <mac address='xx:xx:xx:xx:xx:xx'/>
  <domain name='default'/>
  <ip address='192.168.42.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.42.128' end='192.168.42.254'/>
    </dhcp>
  </ip>
</network>

Pour que vos modifications soient prises en compte :

$ sudo systemctl stop libvirtd 
$ sudo pkill dnsmasq
$ sudo systemctl start libvirtd

Pour la création d’une nouvelle VM, deux choix s’offrent à vous :

  • En ligne de commande : “Première VM en CLI”
  • Via une interface graphique : “Première VM via virt-manager”

PREMIÈRE VM EN CLI

Pour vous simplifier l’utilisation, ajoutez cet alias dans votre bashrc :

alias virsh="virsh --connect qemu:///system"

Dans notre exemple, nous utiliserons un disque “fichier” au format qcow2. Contrairement au disque dur, ce type de disque est plus facile à faire évoluer ; il en est de même pour LVM.

Créer le fichier image disque qui va être utilisé comme disque dur virtuel par votre machine virtuelle :

qemu-img create -f qcow2 image.qcow2 10G

Le fichier de configuration pour créer votre machine doit être construit comme suit (les valeurs à changer sont en majuscules) :

<domain type='kvm'>
  <name>VOTRE_VM</name>
  <memory unit='KiB'>4194304</memory>
  <vcpu placement='static'>4</vcpu>
  <os>
    <type arch='x86_64' machine='pc-i440fx-2.7'>hvm</type>
    <boot dev='cdrom'/>
    <boot dev='hd'/>
    <bootmenu enable='no'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <devices>
    <emulator>/usr/bin/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw' io='threads'/>
      <source file='/home/UTILISATEUR/machines/MACHINE_VIRTUELLE.qcow2'/>
      <target dev='hda' bus='ide'/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <source file='/home/UTILISATEUR/iso/SYSTEME_EXPLOITATION.iso'/>
      <target dev='hdc' bus='ide'/>
      <readonly/>
      <address type='drive' controller='0' bus='1' target='0' unit='0'/>
    </disk>
    <controller type='usb' index='0' model='piix3-uhci'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
    </controller>
    <controller type='pci' index='0' model='pci-root'/>
    <controller type='ide' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
    <interface type='network'>
      <source network='default'/>
      <model type='rtl8139'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <input type='mouse' bus='ps2'/>
    <input type='keyboard' bus='ps2'/>
    <graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1'>
      <listen type='address' address='127.0.0.1'/>
    </graphics>
    <video>
      <model type='cirrus' vram='16384' heads='1' primary='yes'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </memballoon>
  </devices>
</domain>

Pour créer la machine virtuelle, il faut utiliser cette commande :

virsh create /PATH/MACHINE_VIRTUELLE.xml

La section graphics correspond à votre moyen de connexion graphique à votre future machine virtuelle via VNC. Elle écoute volontairement sur une adresse locale pour éviter d’exposer vos systèmes directement. Pour vous y connecter : -Identifiez le port d’écoute : netstat -plant | grep ‘59..’

  • Faites un transfert de port :
      ssh -L UN_PORT_LIBRE:127.0.0.1:LE_PORT_IDENTIFIE_PRECEDEMMENT -l VOTRE_UTILISATEUR VOTRE_HOTE_KVM
    
  • Utilisez votre client VNC :
    vinagre 127.0.0.1:UN_PORT_LIBRE
    

La VM est maintenant créée, vous pouvez poursuivre l’installation classique de votre système d’exploitation.

Remarques : Pour démarrer votre machine virtuelle au lancement de votre système :

virsh autostart MACHINE_VIRTUELLE

Pour l’arrêt, il faut utiliser l’option destroy.

PREMIÈRE VM VIA VIRT-MANAGER

Si vous préférez créer vos VMs en utilisant une interface graphique, lancez virt-manager. Dans l’interface, configurez un nouvel hôte KVM (protocole ssh), et laissez vous guider dans les menus de création d’une nouvelle VM.

KVM Virt manager

Virt-Manager UI

KVM new VM

Nouvelle VM – Étape 1 : Choix du type de média d’installation

KVM new VM

Nouvelle VM – Étape 2 : Choix du média d’installation

KVM new VM

Nouvelle VM – Étape 3 : Choix des spécificités de la VM KVM new VM

Nouvelle VM – Étape 4 : Choix du média de stockage

KVM new VM

Nouvelle VM – Étape 5 : Choix du nom KVM new VM

Nouvelle VM – Étape 5bis : Choix du réseau

KVM new VM

Nouvelle VM – Étape 6 : Installation classique

KVM new VM

AVANTAGES DE KVM

La gestion de l’overlay par KVM est un atout par rapport aux autres solutions ; par exemple si vous utilisez minikube pour faire du kubernetes (attention à ce sujet, il y a un bug ouvert à ce sujet). Cette gestion permet de faire cohabiter KVM avec des solutions de containers type lxc ou docker sans avoir de conflits de module kernel. Dans les cas que nous vous présentons, nous avons utilisé KVM pour les services qui nécessitent des modifications au niveau du noyau de la machine virtuelle.

POUR ALLER PLUS LOIN

  • N’hésitez pas à utiliser LVM en allocation dynamique afin d’économiser de l’espace disque.
  • Pour les sauvegardes, vous pouvez utiliser :
    • virsh suspend VOTRE_MACHINE (fige votre VM)
    • copiez le disque virtuel et le fichier de configuration
    • virsh resume VOTRE_MACHINE (relance votre VM) -Pour nous contacter : info@worteks.com

Sources :