Skip to content

KVM & Libvirt Virtualization

Virtualisation native Linux avec KVM et gestion via Libvirt.


Architecture KVM

KVM Virtualization Stack

Les Briques de la Virtualisation

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    Applications                              โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                  virt-manager (GUI)                          โ”‚
โ”‚                     virsh (CLI)                              โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                      Libvirt                                 โ”‚
โ”‚            (API de gestion unifiรฉe)                          โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                       QEMU                                   โ”‚
โ”‚          (ร‰mulation matรฉrielle)                              โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                        KVM                                   โ”‚
โ”‚              (Module Kernel)                                 โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                   Linux Kernel                               โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚              CPU (Intel VT-x / AMD-V)                        โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
Composant Rรดle Type
KVM Module kernel qui transforme Linux en hyperviseur Type 1 Kernel module
QEMU ร‰mule le matรฉriel virtuel (disques, cartes rรฉseau, USB) Userspace
Libvirt API et dรฉmon de gestion unifiรฉ Service/API
virsh CLI pour piloter Libvirt Outil
virt-manager Interface graphique GUI

Hyperviseur Type 1 vs Type 2

Type Description Exemples
Type 1 (Bare-metal) Directement sur le hardware KVM, VMware ESXi, Hyper-V
Type 2 (Hosted) Sur un OS hรดte VirtualBox, VMware Workstation

KVM est un Type 1 car le module s'intรจgre directement dans le kernel Linux.


Installation & Validation

Vรฉrification CPU

# Vรฉrifier le support de virtualisation hardware
egrep -c '(vmx|svm)' /proc/cpuinfo

# vmx = Intel VT-x
# svm = AMD-V
# Rรฉsultat > 0 = OK

Rรฉsultat = 0 ?

  • Vรฉrifier que la virtualisation est activรฉe dans le BIOS/UEFI
  • Sur une VM imbriquรฉe, activer "Nested Virtualization"

Installation des Paquets

# Debian/Ubuntu
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virtinst

# RHEL/CentOS
sudo dnf install qemu-kvm libvirt virt-install bridge-utils

# Ajouter l'utilisateur au groupe libvirt
sudo usermod -aG libvirt $USER
sudo usermod -aG kvm $USER

# Relogin pour appliquer les groupes
newgrp libvirt
Paquet Description
qemu-kvm QEMU avec support KVM
libvirt-daemon-system Dรฉmon Libvirt
libvirt-clients Outils CLI (virsh)
bridge-utils Gestion des bridges rรฉseau
virtinst virt-install pour crรฉer des VMs

Validation

# Dรฉmarrer et activer libvirtd
sudo systemctl enable --now libvirtd

# Vรฉrifier que KVM est chargรฉ
lsmod | grep kvm
# kvm_intel (ou kvm_amd)
# kvm

# Vรฉrifier libvirt
virsh list --all

# Output (vide au dรฉbut):
#  Id   Name   State
# ----------------------

# Vรฉrifier la connexion
virsh uri
# qemu:///system

Virsh Cheatsheet

Crรฉer une VM (virt-install)

# Crรฉation avec ISO
virt-install \
    --name ubuntu-server \
    --ram 2048 \
    --vcpus 2 \
    --disk path=/var/lib/libvirt/images/ubuntu.qcow2,size=20 \
    --os-variant ubuntu22.04 \
    --network network=default \
    --graphics vnc \
    --cdrom /path/to/ubuntu-22.04.iso

# Crรฉation depuis image cloud (cloud-init)
virt-install \
    --name vm1 \
    --ram 2048 \
    --vcpus 2 \
    --import \
    --disk /var/lib/libvirt/images/vm1.qcow2 \
    --os-variant ubuntu22.04 \
    --network network=default \
    --noautoconsole

# Lister les OS variants disponibles
osinfo-query os | grep ubuntu

Gestion du Cycle de Vie

# Lister toutes les VMs
virsh list --all

# Dรฉmarrer une VM
virsh start vm1

# Arrรชt propre (ACPI - comme appuyer sur le bouton power)
virsh shutdown vm1

# Arrรชt forcรฉ (comme dรฉbrancher la prise)
virsh destroy vm1

# Redรฉmarrer
virsh reboot vm1

# Suspendre / Reprendre
virsh suspend vm1
virsh resume vm1

# Autostart au boot de l'hรดte
virsh autostart vm1
virsh autostart --disable vm1
Commande Action ร‰quivalent physique
shutdown Arrรชt ACPI propre Appuyer sur le bouton power
destroy Arrรชt immรฉdiat Dรฉbrancher la prise
reboot Redรฉmarrage ACPI Ctrl+Alt+Del

Informations et Console

# Infos dรฉtaillรฉes
virsh dominfo vm1

# Configuration XML
virsh dumpxml vm1

# Statistiques CPU/Mรฉmoire
virsh domstats vm1

# Console sรฉrie (Ctrl+] pour quitter)
virsh console vm1

# Adresse IP (si qemu-guest-agent installรฉ)
virsh domifaddr vm1

Snapshots

# Crรฉer un snapshot
virsh snapshot-create-as vm1 snap1 "Before upgrade"

# Lister les snapshots
virsh snapshot-list vm1

# Infos sur un snapshot
virsh snapshot-info vm1 snap1

# Revenir ร  un snapshot
virsh snapshot-revert vm1 snap1

# Supprimer un snapshot
virsh snapshot-delete vm1 snap1

Snapshots et format de disque

Les snapshots nรฉcessitent le format qcow2. Les disques raw ne supportent pas les snapshots internes.

Modification ร  Chaud

# Ajouter de la RAM (si maxMemory configurรฉ)
virsh setmem vm1 4G --live

# Ajouter un vCPU (si maxVcpus configurรฉ)
virsh setvcpus vm1 4 --live

# Attacher un disque
virsh attach-disk vm1 /path/to/disk.qcow2 vdb --live

# Dรฉtacher un disque
virsh detach-disk vm1 vdb --live

Supprimer une VM

# Arrรชter si nรฉcessaire
virsh destroy vm1

# Supprimer la dรฉfinition
virsh undefine vm1

# Supprimer avec les volumes associรฉs
virsh undefine vm1 --remove-all-storage

# Supprimer avec snapshots
virsh undefine vm1 --snapshots-metadata

Rรฉseau & Stockage

Modes Rรฉseau

Default NAT (Par dรฉfaut)

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                       Internet                               โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                              โ”‚
                    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                    โ”‚   Hรดte Linux      โ”‚
                    โ”‚   (192.168.1.10)  โ”‚
                    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                              โ”‚ NAT (virbr0)
                    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                    โ”‚  192.168.122.0/24 โ”‚
            โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
            โ”‚               โ”‚                   โ”‚
         โ”Œโ”€โ”€โ”ดโ”€โ”€โ”         โ”Œโ”€โ”€โ”ดโ”€โ”€โ”            โ”Œโ”€โ”€โ”ดโ”€โ”€โ”
         โ”‚ VM1 โ”‚         โ”‚ VM2 โ”‚            โ”‚ VM3 โ”‚
         โ”‚.101 โ”‚         โ”‚.102 โ”‚            โ”‚.103 โ”‚
         โ””โ”€โ”€โ”€โ”€โ”€โ”˜         โ””โ”€โ”€โ”€โ”€โ”€โ”˜            โ””โ”€โ”€โ”€โ”€โ”€โ”˜
  • VMs accรจdent ร  Internet via NAT
  • VMs non accessibles directement depuis l'extรฉrieur
  • Idรฉal pour le dรฉveloppement
# Voir les rรฉseaux
virsh net-list --all

# Dรฉtails du rรฉseau default
virsh net-info default
virsh net-dumpxml default

Bridge Public

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                       Internet                               โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                              โ”‚
                    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                    โ”‚      Switch       โ”‚
                    โ”‚  192.168.1.0/24   โ”‚
                    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                              โ”‚ br0
            โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
            โ”‚                 โ”‚                 โ”‚
         โ”Œโ”€โ”€โ”ดโ”€โ”€โ”           โ”Œโ”€โ”€โ”ดโ”€โ”€โ”          โ”Œโ”€โ”€โ”ดโ”€โ”€โ”
         โ”‚Hรดte โ”‚           โ”‚ VM1 โ”‚          โ”‚ VM2 โ”‚
         โ”‚ .10 โ”‚           โ”‚ .20 โ”‚          โ”‚ .21 โ”‚
         โ””โ”€โ”€โ”€โ”€โ”€โ”˜           โ””โ”€โ”€โ”€โ”€โ”€โ”˜          โ””โ”€โ”€โ”€โ”€โ”€โ”˜
  • VMs ont une IP sur le rรฉseau physique
  • VMs accessibles directement
  • Idรฉal pour la production
# Crรฉer un bridge (Netplan)
# /etc/netplan/00-bridge.yaml
network:
  version: 2
  ethernets:
    eth0:
      dhcp4: false
  bridges:
    br0:
      interfaces: [eth0]
      dhcp4: true
      # ou addresses: [192.168.1.10/24]

Stockage

Formats de Disque

Format Avantages Inconvรฉnients Usage
qcow2 Snapshots, thin provisioning, compression Lรฉgรจrement plus lent Recommandรฉ
raw Performances maximales Taille fixe, pas de snapshot I/O intensif
# Crรฉer un disque qcow2
qemu-img create -f qcow2 disk.qcow2 20G

# Crรฉer un disque raw
qemu-img create -f raw disk.raw 20G

# Convertir raw โ†’ qcow2
qemu-img convert -f raw -O qcow2 disk.raw disk.qcow2

# Infos sur un disque
qemu-img info disk.qcow2

# Redimensionner
qemu-img resize disk.qcow2 +10G

Pools de Stockage

# Lister les pools
virsh pool-list --all

# Pool par dรฉfaut
ls /var/lib/libvirt/images/

# Lister les volumes d'un pool
virsh vol-list default

# Crรฉer un volume
virsh vol-create-as default newdisk.qcow2 20G --format qcow2

Rรฉfรฉrence Rapide

# === INSTALLATION ===
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients virtinst
sudo usermod -aG libvirt,kvm $USER

# === Vร‰RIFICATION ===
egrep -c '(vmx|svm)' /proc/cpuinfo    # Support CPU
virsh list --all                       # Liste VMs

# === CYCLE DE VIE ===
virsh start vm1                        # Dรฉmarrer
virsh shutdown vm1                     # Arrรชt propre
virsh destroy vm1                      # Arrรชt forcรฉ
virsh reboot vm1                       # Redรฉmarrer

# === SNAPSHOTS ===
virsh snapshot-create-as vm1 snap1 "Description"
virsh snapshot-list vm1
virsh snapshot-revert vm1 snap1

# === INFO ===
virsh dominfo vm1                      # Infos
virsh console vm1                      # Console (Ctrl+] quit)

# === Rร‰SEAU ===
virsh net-list --all                   # Rรฉseaux

# === STOCKAGE ===
qemu-img create -f qcow2 disk.qcow2 20G
qemu-img info disk.qcow2