Utilisation de KVM pour la virtualisation

KVM (pour “Kernel-based Virtual Machine”), est une technologie de virtualisation Open Source integrée au noyau Linux. Cela permet de transformer une distribution Linux en hyperviseur de type 1 (système nu), offrant de meilleures performances et une compatibilité matérielle plus large que les hyperviseurs de type 2 (Virtualbox, Hyper-V…). Le logiciel QEMU, complémentaire à KVM, permet d'émuler différentes architectures processeur et ajoute des fonctions analogues à KVM. On nomme ce duo QEMU/KVM.

Configuration des pré-requis

Lors de l'utilisation de KVM, il est fortement recommandé d'avoir une interface graphique sur sa machine, ou d'avoir des connaissances en affichage avec X11 (Server X Window).

Les bibliothèques à installer pour utiliser QEMU/KVM sont :

  • qemu-system, libvirt-clients, et libvirt-daemon-system pour la partie “système”
  • virt-manager pour l'interface d'administration des VM
  • virt-viewer pour l'affichage des VM

Installer tout d'un coup avec cette commande :

apt-get install qemu-system libvirt-clients libvirt-daemon-system virt-manager virt-viewer

Et ajouter les futurs utilisateurs de KVM au groupe libvirt (remplacer admlnx par un utilisateur à ajouter au groupe) :

adduser admlnx libvirt

Prise en main de KVM

KVM s'administre avec l'utilitaire virsh. C'est lui qui permettra la gestion des machines virtuelles. On peut aussi se servir de virt-manager comme interface graphique mais elle n'est pas aussi complète. Les machines virtuelles dans KVM sont appelées “Domaines”.

Tout d'abord, on peut vérifier la configuration matérielle de l'hyperviseur (processeur & mémoire), avec :

virsh nodeinfo

Ensuite voici la commande qui permet de lister tous les domaines :

virsh list --all

Lister les VM

Ici, c'est tout simplement vide car il n'y a encore aucune machine virtuelle de créée !

Pour n'afficher que les VM actives, il suffit de retirer l'argument –all.

Les commandes de base pour gérer les domaines sont :

  • virsh start domaine : démarrer une machine virtuelle existante (remplacer domaine par le nom de la machine virtuelle à démarrer)
  • virsh shutdown domaine : arrêter une machine virtuelle proprement (envoi du signal d'extinction)
  • virsh destroy domaine : éteindre une machine virtuelle brutalement (comme si on coupait l'alimentation)
  • virsh undefine domaine : supprimer une machine virtuelle (ne supprime pas le disque dur virtuel, il faut le supprimer manuellement dans /var/lib/libvirt/images)
  • virsh dominfo domaine : afficher des informations sur une machine virtuelle existante

La commande virsh help permet de lister les commandes utilisables dans virsh.

Création d'une machine virtuelle

Lorsque l'on souhaite créer un nouveau domaine dans KVM, on utilise le script virt-install. Pour cela, il faut générer un fichier de configuration décrivant la machine virtuelle à générer avec différents paramètres (hardware, disque de boot…).

Par exemple, la commande suivante permet de générer un domaine qui sera nommé “Win10” de type Windows 10, avec un disque dur virtuel de 40Gb, 4096Mb de mémoire, 1 CPU virtuel, ainsi qu'avec le fichier /home/admlnx/ISO/Win10.iso en tant que CD-ROM.

virt-install --virt-type kvm --name Win10 \
--description "VM de Test" \
--cdrom "/home/admlnx/ISO/Win10.iso" \
--os-variant win10 \
--disk size=40 --memory 4096 --vcpu 1

A la place de - -cdrom, on peut demander à KVM de télécharger directement le disque sur lequel le système devra démarrer depuis Internet :

--location http://deb.debian.org/debian/dists/buster/main/installer-amd64/ \

On peut aussi désactiver l'interface graphique d'un domaine en précisant une console texte qui lui sera associée (pratique si on a aucune interface graphique sur l'hyperviseur ou pour les VM Linux). Il faudra obligatoirement utiliser l'option - - location à la place de - -cdrom et préciser la console série virtuelle à utiliser :

virt-install --virt-type kvm --name Debian10 \
--location "/home/admlnx/ISO/deb10.iso" \
--os-variant debian10 \
--disk size=10 --memory 1024 \
--graphics none \
--extra-args console=ttyS0

Ci-dessus, on demande à KVM de lier la VM au terminal série ttyS0 sur la machine physique. Au premier lancement de la VM la console devrait s'ouvrir, pour la fermer faîtes CTRL+] (^]). Pour se reconnecter à la console de la VM, on utilise la commande virsh console XX correspond à un numéro de console, par défaut 1 pour la première.

:!: Via SSH il est possible que le combo de touches CTRL+] ne fonctionne pas. Il faut donc fermer la connexion puis la réouvrir pour revenir au shell de l'hyperviseur.

virsh console 1

Ce qui permet d'afficher la console de ma VM debian, pour effectuer l'installation du système :

Installation de debian

Configuration du réseau pour les VM

Tout d'abord, il faut commencer par activer les fonctions réseau par défaut pour les domaines KVM :

virsh net-start default

Pour que cela démarre tout seul au lancement de KVM, il suffit de faire ceci :

virsh net-autostart default

Par défaut le réseau des VM est natté, c'est à dire qu'une adresse IP hors réseau local est attribuée par KVM aux domaines et qu'une translation d'adresse opère sur l'hyperviseur pour connecter les VM à Internet. Mais le mieux est d'utiliser la méthode d'accès par pont, qui permet de connecter directement les domaines au réseau local de l'hyperviseur.

Pour passer un domaine en “Accès par pont”, il faut d'abord créer un pont avec la carte réseau physique de l'hyperviseur. Ensuite on modifiera la configuration de la VM afin de lui indiquer la méthode d'accès au réseau à utiliser. On aura besoin pour cette manipulation du paquet bridge-utils.

Déja, créer le pont et y ajouter l'interface physique que l'on souhaite utiliser :

brctl addbr br0
brctl addif br0 ens33

Ci-dessus, br0 est le nom du pont créé et ens33 celui de la carte réseau physique de l'hyperviseur.

Une fois le pont créé, il faut aller dans la configuration réseau de l'hyperviseur et le paramétrer comme une carte réseau normale (avec une IP dynamique ou non) :

Configuration réseau du pont

Puis on relance le service réseau de la machine hôte :

service networking restart

Et on modifie alors la configuration du domaine que l'on souhaite “ponter” comme ceci :

virsh edit debian10 

:!: La commande ci-dessus permet de modifier le fichier de configuration d'une VM, où debian10 est à remplacer par le nom de la VM à configurer. Au premier lancement de la commande, il se peut qu'il soit nécessaire de sélectionner un éditeur de texte, dans le cas où plusieurs seraient installés sur l'hôte.

:!: S'assurer que le domaine en cours de réglage est arrêté, avant de modifier son fichier de configuration, c'est mieux !

Dans le fichier de configuration, trouver la partie “réseau” qui doit commencer par <interface type='network'> par défaut.

Remplacer type='network' par type='bridge' et <source network='default'> par <source bridge='br0'> comme ceci :

Configuration du domaine pour l'accès au réseau local par le pont br0

Enfin enregistrer et démarrer le domaine concerné afin de vérifier si cela fonctionne avec ip a :

Accès par pont fonctionnel

On constate sur l'exemple au dessus que la VM a pris l'adresse IP 192.168.1.64 sur le même réseau que l'hyperviseur (192.168.1.60) à la place de l'adresse 192.168.122.X attribuée par l'hyperviseur lui-même. C'est fonctionnel !

Ajout d'un disque virtuel à un domaine