Aller au contenu
English
English
Virtualisation medium

Installer KVM/libvirt sur Linux

60 min de lecture

Logo KVM

Vous voulez créer des machines virtuelles sur votre serveur Linux ? Ce guide vous accompagne pour installer KVM/libvirt en 15 minutes. À la fin, vous aurez un hôte de virtualisation fonctionnel, prêt à créer vos premières VMs.

  • Vérifier que votre CPU supporte la virtualisation
  • Installer les paquets nécessaires selon votre distribution
  • Configurer les permissions pour gérer les VMs sans sudo
  • Valider l'installation avec les commandes de diagnostic
  • Un serveur ou PC avec un processeur Intel VT-x ou AMD-V
  • Un système Linux (Debian/Ubuntu ou RHEL/Rocky/Fedora)
  • Accès root ou sudo

La virtualisation KVM nécessite un processeur avec les extensions Intel VT-x ou AMD-V. Sans ce support matériel, vos VMs fonctionneront en émulation pure (très lent).

Le fichier /proc/cpuinfo expose un bloc de flags par cœur logique. Compter les lignes contenant vmx ou svm revient donc à compter les cœurs capables d'accélérer une machine virtuelle. Ce que vous cherchez ici est binaire : zéro ou pas zéro. La valeur exacte n'a aucune importance, elle reflète simplement le nombre de cœurs logiques vus par le noyau.

Fenêtre de terminal
# Compter le nombre de cœurs avec support virtualisation
grep -Ec '(vmx|svm)' /proc/cpuinfo

Résultat attendu : un nombre supérieur à 0.

RésultatSignification
0Pas de support ou désactivé dans le BIOS
4, 8, 16...Support activé (nombre = cœurs logiques)

Savoir si votre processeur est Intel ou AMD détermine le module noyau que Linux doit charger, et donc le nom à chercher plus loin dans la sortie de lsmod. La commande ci-dessous affiche la première ligne de flags trouvée : si elle contient vmx, vous êtes sur Intel, si elle contient svm, sur AMD. Vous n'avez jamais à charger ce module à la main, le noyau s'en charge au démarrage dès que le matériel le permet.

Fenêtre de terminal
# Intel ou AMD ?
grep -E 'vmx|svm' /proc/cpuinfo | head -1
ExtensionFabricantModule kernel
vmxIntelkvm_intel
svmAMDkvm_amd

L'installation diffère selon votre distribution. Sélectionnez l'onglet correspondant :

Les paquets de virtualisation dépendent étroitement de la version du noyau installée. Mettre le système à jour avant l'installation évite le cas classique où qemu-system-x86 arrive dans une version plus récente que les modules noyau chargés, ce qui produit des erreurs difficiles à relier à leur cause.

Fenêtre de terminal
sudo apt update && sudo apt upgrade -y

Une installation de virtualisation se compose de trois briques distinctes : le moteur d'exécution (qemu-system-x86), le service de gestion (libvirt-daemon-system) et les outils que vous manipulez (libvirt-clients, virtinst). Le tableau qui suit les détaille. Sur un serveur sans écran, retirez virt-manager de la commande, il tire toute une chaîne de dépendances graphiques inutiles.

Fenêtre de terminal
sudo apt install -y \
qemu-system-x86 \
libvirt-daemon-system \
libvirt-clients \
virtinst \
virt-manager

Détail des paquets :

PaquetRôle
qemu-system-x86Émulateur QEMU pour x86, avec accélération KVM
libvirt-daemon-systemDaemon libvirtd + configuration système
libvirt-clientsOutils CLI (virsh)
virtinstOutil virt-install pour créer des VMs
virt-managerInterface graphique (optionnel sur serveur)

Sur la famille Debian, qemu-kvm n'est pas un paquet. C'est un nom virtuel, une étiquette que plusieurs paquets réels déclarent fournir. Celui qui contient l'émulateur x86 s'appelle qemu-system-x86, et c'est lui qui porte la ligne Provides: qemu-kvm. Vous pouvez le constater avec apt-cache show qemu-system-x86.

Tant qu'un seul paquet fournit ce nom, apt choisit à votre place et l'installation passe sans rien signaler. Dès que deux paquets ou plus le fournissent, apt refuse de trancher et s'arrête sur une erreur de résolution :

Package qemu-kvm is a virtual package provided by:
qemu-system-x86-hwe 1:10.2.1+ds-1ubuntu4.3
qemu-system-x86 1:10.2.1+ds-1ubuntu3.2
You should explicitly select one to install.
Error: Package 'qemu-kvm' has no installation candidate

C'est ce qui se produit sur Ubuntu 26.04, où qemu-system-x86-hwe (issu du paquet source qemu-hwe, qui livre un QEMU plus récent) est venu s'ajouter comme second fournisseur. Partout ailleurs, un fournisseur unique laisse apt résoudre, et le problème reste invisible :

DistributionFournisseurs de qemu-kvmRésultat de apt install qemu-kvm
Debian 12, 13 et 141 seul, qemu-system-x86Passe
Ubuntu 24.04 (noble)1 seul, qemu-system-x86Passe
Ubuntu 26.04 (resolute)2, dont qemu-system-x86-hweÉchoue
RHEL, Rocky, Alma, Fedorasans objet, paquet réelPasse

Nommer qemu-system-x86 directement fonctionne dans tous ces cas, et continuera de fonctionner le jour où une distribution ajoutera un fournisseur supplémentaire, comme Ubuntu vient de le faire. La dernière ligne du tableau explique au passage pourquoi l'onglet RHEL parle toujours de qemu-kvm : là-bas, le paquet existe réellement.

Là où grep /proc/cpuinfo ne regarde que les capacités du processeur, kvm-ok va plus loin : il vérifie que le fichier de périphérique /dev/kvm existe réellement, ce qui prouve que le module noyau est chargé et que le BIOS n'a pas désactivé l'extension. C'est la vérification la plus fiable des deux.

Fenêtre de terminal
sudo apt install -y cpu-checker
kvm-ok

Résultat attendu :

INFO: /dev/kvm exists
KVM acceleration can be used

Installer les paquets ne démarre pas toujours le service. libvirtd est le daemon qui détient les définitions de vos machines et parle à QEMU en votre nom : sans lui, virsh n'a personne à qui s'adresser. Les deux mots de la commande ci-dessous répondent à deux besoins différents, enable inscrit le service au démarrage de la machine, --now le lance immédiatement sans attendre un redémarrage.

  1. Activer et démarrer le service

    Fenêtre de terminal
    sudo systemctl enable --now libvirtd
  2. Vérifier le statut

    Fenêtre de terminal
    sudo systemctl status libvirtd

    Résultat attendu : Active: active (running)

  3. Vérifier la socket

    Fenêtre de terminal
    ls -la /run/libvirt/libvirt-sock

    Ce fichier socket permet la communication avec libvirt.

Par défaut, seul root gère les machines. La méthode courante consiste à ajouter son utilisateur aux groupes libvirt et kvm, ce qui évite de taper sudo à chaque commande.

Ce n'est pas un réglage de confort. L'appartenance au groupe libvirt donne un accès plein au driver qemu:///system, celui qui pilote la virtualisation côté serveur : créer et détruire des machines, mais aussi rattacher un périphérique PCI ou USB de l'hôte, ouvrir un disque brut, définir des réseaux. Autrement dit, elle confère une administration de l'hyperviseur, et non la permission de lancer quelques commandes. Sur un poste personnel, c'est le compromis normal ; sur un serveur partagé, cela mérite d'être décidé plutôt que subi.

Fenêtre de terminal
# Ajouter l'utilisateur aux groupes libvirt et kvm
sudo usermod -aG libvirt $USER
sudo usermod -aG kvm $USER

Cette vérification cause plus de confusion que n'importe quelle autre étape du guide, parce que Linux distingue les groupes enregistrés dans /etc/group des groupes actifs dans votre session en cours. usermod écrit dans le fichier immédiatement, mais votre shell garde la liste chargée à l'ouverture de session.

Fenêtre de terminal
groups $USER

Résultat attendu : ... libvirt kvm ...

Pourquoi virt-manager demande encore un mot de passe

Section intitulée « Pourquoi virt-manager demande encore un mot de passe »

Les groupes gouvernent l'accès à la socket libvirt, donc les commandes que vous tapez. Les interfaces graphiques, virt-manager et Cockpit, passent en plus par Polkit, un second mécanisme d'autorisation qui a ses propres règles et interroge l'utilisateur par une fenêtre. Voir surgir une demande de mot de passe alors que id affiche bien libvirt n'est donc pas le signe d'une configuration ratée : les deux systèmes coexistent, et votre appartenance aux groupes reste correcte.

libvirt expose deux espaces de travail distincts, et c'est la source de confusion la plus fréquente après les groupes. Le mode system (qemu:///system) appartient au daemon lancé par la machine : c'est là que vivent le réseau default, le pool de stockage et les VMs d'un serveur. Le mode session (qemu:///session) crée un second univers, propre à votre utilisateur, avec ses propres VMs et sans le réseau default. Une sortie vide de virsh net-list, alors que tout semble installé, signifie presque toujours que vous interrogez session quand vous pensiez parler à system.

Solution rapide (recommandée pour serveurs) :

Fenêtre de terminal
# Ajouter dans ~/.bashrc ou ~/.zshrc
export LIBVIRT_DEFAULT_URI="qemu:///system"
source ~/.bashrc

Vérification :

Fenêtre de terminal
virsh uri
# Doit afficher : qemu:///system

Plusieurs commandes permettent de confirmer que tout fonctionne.

C'est le test le plus simple, et son but n'est pas de voir des machines : il vérifie que virsh parvient à ouvrir la socket du service libvirt avec vos droits actuels. Une liste vide est donc un succès. L'échec, lui, se manifeste par un message de permission plutôt que par une absence de résultat.

Fenêtre de terminal
# Si LIBVIRT_DEFAULT_URI est configuré :
virsh list --all
# Sinon, précisez l'URI :
virsh -c qemu:///system list --all

Résultat attendu (installation fraîche) :

Id Name State
--------------------

Une liste vide est normale, vous n'avez pas encore créé de VM.

libvirt crée un réseau nommé default qui fournit du NAT et un serveur DHCP aux VMs via le pont virbr0. Sans lui, vos machines démarreront mais n'obtiendront aucune adresse IP. Trois colonnes comptent dans la sortie : State doit valoir active maintenant, Autostart doit valoir yes pour que le réseau revienne après un redémarrage, et Persistent confirme que la définition est écrite sur disque et non seulement en mémoire.

Fenêtre de terminal
virsh net-list --all

Résultat attendu :

Name State Autostart Persistent
--------------------------------------------
default active yes yes

Si le réseau default n'est pas actif (State = inactive) :

Fenêtre de terminal
virsh net-start default
virsh net-autostart default

Test 3 : Vérifier (et créer) le pool de stockage

Section intitulée « Test 3 : Vérifier (et créer) le pool de stockage »

Un pool de stockage est simplement un répertoire que libvirt surveille pour y ranger les disques virtuels de vos machines. Contrairement au réseau default, il n'est pas créé partout : certaines distributions le fournissent, une installation minimale le laisse absent, et virt-manager le crée parfois au premier lancement. Commencez donc par regarder ce que vous avez avant de le définir, la commande ci-dessous ne modifie rien.

Fenêtre de terminal
virsh pool-list --all

Si le pool existe déjà (virt-manager l'a peut-être créé) :

Name State Autostart
-------------------------------
default active yes

Si le pool est absent (fréquent sur installation minimale) :

Créer le pool default :

Fenêtre de terminal
# Définir le pool (pointe vers /var/lib/libvirt/images/)
virsh pool-define-as default dir --target /var/lib/libvirt/images
# Créer le répertoire si nécessaire
sudo mkdir -p /var/lib/libvirt/images
# Démarrer et activer au boot
virsh pool-start default
virsh pool-autostart default

Vérification :

Fenêtre de terminal
virsh pool-list --all

Résultat attendu :

Name State Autostart
-------------------------------
default active yes

Le pool default pointe vers /var/lib/libvirt/images/.

virt-host-validate déroule une série de contrôles et affiche un verdict par ligne. C'est le seul test qui vérifie l'ensemble de la chaîne : matériel, module noyau, droits d'accès aux périphériques et contrôleurs cgroup. Lisez-le de haut en bas et arrêtez-vous à la première ligne FAIL, les suivantes en découlent souvent. La sortie réelle contient aussi des lignes préfixées LXC:, propres au pilote conteneur de libvirt, sans rapport avec vos machines virtuelles.

Fenêtre de terminal
virt-host-validate

Exemple de résultat :

QEMU: Checking for hardware virtualization : PASS
QEMU: Checking if device /dev/kvm exists : PASS
QEMU: Checking if device /dev/kvm is accessible : PASS
QEMU: Checking if device /dev/vhost-net exists : PASS
QEMU: Checking if device /dev/net/tun exists : PASS
QEMU: Checking for cgroup 'memory' controller support : PASS
QEMU: Checking for device assignment IOMMU support : WARN (...)
QEMU: Checking for secure guest support : WARN (...)

Ces cinq chemins sont ceux vers lesquels vous reviendrez à chaque incident. Deux méritent une attention particulière : /var/lib/libvirt/images/ est l'emplacement qui remplit le disque système si vous ne surveillez pas la taille des disques virtuels, et /var/log/libvirt/qemu/ contient un fichier de journal par machine virtuelle, c'est là que se trouve la vraie raison d'un démarrage qui échoue, pas dans journalctl.

CheminContenu
/etc/libvirt/Configuration libvirt
/etc/libvirt/qemu/Définitions XML des VMs
/var/lib/libvirt/images/Disques virtuels (pool default)
/run/libvirt/libvirt-sockSocket de communication
/var/log/libvirt/qemu/Logs des VMs

Trois des quatre lignes ci-dessous se ramènent à la même cause : le shell n'a pas rechargé vos groupes, ou virsh parle au mauvais service. Avant de chercher plus loin, exécutez id puis virsh uri : ces deux commandes éliminent la majorité des symptômes en dix secondes.

ErreurCause probableSolution
Permission denied sur socketGroupe libvirt non actifSe déconnecter/reconnecter ou newgrp libvirt
/dev/kvm n'existe pasVirtualisation désactivéeActiver VT-x/AMD-V dans le BIOS, puis modprobe kvm kvm_intel
virsh net-list videConnecté à qemu:///sessionUtiliser virsh -c qemu:///system ou configurer LIBVIRT_DEFAULT_URI
libvirtd inactif / n'existe pasService non démarré ou démons modulairessystemctl enable --now libvirtd ou activer les sockets modulaires

Vérifiez que l'essentiel de ce guide est acquis. Les questions portent uniquement sur ce qui vient d'être expliqué ici.

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

6 questions
6 min.
70% requis

Informations

  • Le chronomètre démarre au clic sur Démarrer
  • Questions à choix multiples, vrai/faux et réponses courtes
  • Vous pouvez naviguer entre les questions
  • Les résultats détaillés sont affichés à la fin

Lance le quiz et démarre le chronomètre

  1. Vérifier le CPU avec grep -Ec '(vmx|svm)' /proc/cpuinfo, doit être > 0

  2. Installer les paquets : qemu-system-x86, libvirt-daemon-system, virtinst (Debian/Ubuntu, où qemu-kvm n'est qu'un nom virtuel) ou @virtualization (RHEL)

  3. Activer libvirt : systemctl enable --now libvirtd (ou sockets modulaires sur distros récentes)

  4. Configurer les permissions : usermod -aG libvirt,kvm $USER puis se reconnecter

  5. Valider avec virt-host-validate, /dev/kvm doit être PASS

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens ce site gratuitement, sans publicité, sans profilage et sans compte à créer. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn