KVM : installation et usage courant

KVM est l’hyperviseur du noyau Linux permettant d’exécuter des machines virtuelles, avec un OS dédié pour chacune d’entre elles. KVM nécessite un processeur avec les extensions de virtualisation, mais en retour il offre de bien meilleures performances que la paravirtualisation. Voici un guide pour Debian.

Installation

Pour commencer, il faut vérifier que votre CPU dispose des extensions VMX ou SVM :

% grep --color -E 'vmx|svm' /proc/cpuinfo

Ensuite on installe les paquets de base :

# apt install qemu-system libvirt-daemon-system virtinst qemu-utils

Pour le réseau :

# apt install dnsmasq-base mdevctl bridge-utils

Si vous avez prévu d’utiliser Windows 11 dans une VM :

# apt install ovmf swtpm swtpm-tools

Si vous préférez gérer vos VM avec une interface graphique, plutôt qu’avec des lignes de commande :

# apt install virt-manager gir1.2-spiceclientgtk-3.0

Depuis Bookworm, les limites d’UID et GID pour les utilisateurs systèmes ont changé. Si vous aviez déjà installé KVM sur ce système par le passé, ça peut causer cette erreur :

useradd warning: libvirt-qemu's uid 64055 is greater than SYS_UID_MAX 999

Dans ce cas, choisissez de nouveaux UID et GID < 999. On vérifie qu’ils ne soient pas déjà utilisés, on corrige le problème, puis on réattribue les fichiers systèmes.

% getent passwd 150
% getent group 150
# usermod -u 150 libvirt-qemu
# groupmod -g 150 libvirt-qemu
# find /var/lib/libvirt -user 64055 -exec chown -h libvirt-qemu {} ;
# find /var/lib/libvirt -group 64055 -exec chgrp -h libvirt-qemu {} ;

Vérifiez que l’installation de base fonctionne :

# virsh list --all
 Id   Name   State
--------------------

Quand on utilise virsh en simple utilisateur, il se connecte à libvirt via qemu:///session. Mais les VMs utilisant qemu:///session ont certaines limitations, notamment l’impossibilité d’utiliser les dossiers partagés avec virtiofs. Pour accéder aux VM du système en simple utilisateur, il faut rajouter « --connect qemu:///system » quand on utilise virsh. Pour éviter de surcharger tous les appels à virsh, on peut créer cette variable d’environnement dans ~/.zshrc ou ~/.bashrc :

export LIBVIRT_DEFAULT_URI="qemu:///system"

Ajoutez votre utilisateur au groupe libvirt :

# adduser  libvirt

Déconnectez-vous, reconnectez-vous, et vérifiez que tout fonctionne :

% virsh list --all
 Id   Name   State
--------------------

Pour démarrer le réseau des VM, et faire en sorte qu’il soit démarré automatiquement avec le système hôte :

% virsh net-start default
% virsh net-autostart default

Utilisation courante

Création de VM

Créer une VM Debian en netinstall :

% virt-install --name <NEW_VM> --virt-type kvm \
--vcpus=2 --memory 8192 \
--disk size=20 -o preallocation=off \
--os-variant debian12 \
--location https://deb.debian.org/debian/dists/bookworm/main/installer-amd64/

Créer une VM Debian avec une image ISO :

% virt-install --name <NEW_VM> --virt-type kvm \
--vcpus=2 --memory 8192 \
--disk size=20 -o preallocation=off \
--os-variant debian12 \--cdrom <PATH>/debian-live-12.5.0-amd64-xfce.iso

Créer une VM Debian en mode console :

% virt-install --name <NEW_VM> --virt-type kvm \
--vcpus=1 --memory 2048 \
--disk size=10 -o preallocation=off \
--graphics none --console pty,target_type=serial --extra-args "console=ttyS0" \
--os-variant debian12 \
--location https://deb.debian.org/debian/dists/bookworm/main/installer-amd64/

Importer une VM Windows 10 :

% virt-install --name <NEW_VM> --virt-type kvm \
--vcpus=2 --memory 16384 \
--os-variant win10 \
--disk <PATH_IMAGE> \
--import

Importer une VM Windows 11, qui nécessite UEFI et TPM :

% virt-install --name <NEW_VM> --virt-type kvm \
--vcpus=2 --memory 16384 \
--os-variant win11 \
--video virtio --features kvm_hidden=on,smm=on \
--tpm backend.type=emulator,backend.version=2.0,model=tpm-tis \
--boot loader=/usr/share/OVMF/OVMF_CODE.secboot.fd,loader_ro=yes,loader_type=pflash,nvram_template=/usr/share/OVMF/OVMF_VARS.ms.fd \
--disk <PATH_IMAGE> \
--import

Attribuer une IP fixe à une VM

On modifie la configuration du réseau par défaut :

% virsh net-edit default
<network>
  <name>default</name>
  <forward mode='nat'/>
  <bridge name='virbr0' stp='on' delay='0'/>
  <mac address='52:54:00:00:00:00'/>
  <ip address='192.168.122.254' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.100' end='192.168.122.200'/>
      <host mac='52:54:00:00:00:01' name='VM1' ip='192.168.122.1'/>
      <host mac='52:54:00:00:00:02' name='VM2' ip='192.168.122.2'/>
    </dhcp>
  </ip>
</network>

On redémarre le réseau pour que les changements prennent effet :

% virsh net-destroy default
% virsh net-start default

Partager un dossier de l’hôte avec une VM

On ne peut partager qu’un seul dossier du système hôte pour chaque VM.

% virsh edit <VM>
  <memoryBacking>
    <source type='memfd'/>
    <access mode='shared'/>
  </memoryBacking>

[…]

  <filesystem type='mount' accessmode='passthrough'>
    <driver type='virtiofs'/>
    <source dir='<PATH_FOLDER>'/>
    <target dir='mount_virtio'/>
  </filesystem>

Dans la VM, vous pouvez alors monter le dossier partagé avec :

# mount -t virtiofs mount_virtio /mnt/virtio/

Pour que ce montage soit automatique au démarrage de la VM, ajoutez cette ligne à son /etc/fstab :

mount_virtio /mnt/virtio/ virtiofs defaults,noatime,_netdev 0 0

Monter l’image d’une VM (format qcow2)

Pour accéder au contenu d’un disque virtuel d’une VM éteinte, sans avoir à la démarrer :

# modprobe nbd max_part=8
# qemu-nbd --connect=/dev/nbd0 <PATH_IMAGE>

On regarde la table de partitions de l’image, pour savoir quelle partition monter.

# fdisk /dev/nbd0 -l
# mount /dev/nbd0p2 /mnt/mnt1/

Vous pouvez maintenant accéder au contenu de l’image dans /mnt/mnt1/. Quand vous avez fini les modifications que vous aviez besoin de faire :

# umount /mnt/mnt1/
# qemu-nbd --disconnect /dev/nbd0
# rmmod nbd

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *