Aller au contenu
Virtualisation medium

Stockage KVM/libvirt : pools, volumes et formats

11 min de lecture

Logo KVM

Où sont stockés les disques de vos VMs ? Quel format choisir entre RAW et QCOW2 ? Ce guide explique le modèle de stockage libvirt : les pools (conteneurs) et les volumes (disques), pour que vous sachiez toujours où sont vos données.

ConceptCe que c’estExemple
PoolConteneur de disques/var/lib/libvirt/images/
VolumeUn disque individuelubuntu-test.qcow2
  • La différence entre storage pool et volume
  • Les types de pools (directory, LVM, ZFS…)
  • Choisir entre RAW et QCOW2
  • Créer et gérer des pools et volumes avec virsh

libvirt abstrait le stockage avec deux niveaux :

Architecture stockage libvirt : un Storage Pool contient plusieurs volumes (disques qcow2/raw)

Pourquoi cette abstraction ?

  • Uniformité : mêmes commandes quel que soit le backend (fichier, LVM, ZFS)
  • Gestion : libvirt sait où trouver les disques, leur taille, leur disponibilité
  • Portabilité : les VMs référencent des volumes, pas des chemins absolus
TypeBackendCas d’usageComplexité
dirRépertoireLab, homelab⭐ Simple
lvmVolume Group LVMProduction, performance⭐⭐ Moyen
zfsDataset ZFSNAS, snapshots natifs⭐⭐ Moyen
iscsiTarget iSCSISAN, datacenter⭐⭐⭐ Avancé
nfsPartage NFSStockage partagé⭐⭐ Moyen

Après installation de libvirt, le pool default pointe vers /var/lib/libvirt/images/.

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

Sortie réelle :

Name State Autostart
-------------------------------
default active yes
Fenêtre de terminal
virsh pool-info default

Sortie réelle :

Name: default
UUID: 20e70471-c81e-484a-9b5f-dac1e4c856a5
State: running
Persistent: yes
Autostart: yes
Capacity: 294,73 GiB
Allocation: 177,23 GiB
Available: 117,50 GiB

Décryptage :

ChampSignification
State: runningLe pool est actif et utilisable
Persistent: yesDéfini de façon permanente
Autostart: yesDémarre automatiquement au boot
CapacityTaille totale du stockage
AllocationEspace utilisé
AvailableEspace libre
Fenêtre de terminal
virsh pool-dumpxml default

Sortie réelle :

<pool type='dir'>
<name>default</name>
<uuid>20e70471-c81e-484a-9b5f-dac1e4c856a5</uuid>
<capacity unit='bytes'>316464824320</capacity>
<allocation unit='bytes'>190303780864</allocation>
<available unit='bytes'>126161043456</available>
<source>
</source>
<target>
<path>/var/lib/libvirt/images</path>
<permissions>
<mode>0711</mode>
<owner>0</owner>
<group>0</group>
</permissions>
</target>
</pool>

Points clés :

  • type='dir' : pool de type répertoire
  • <path>/var/lib/libvirt/images</path> : emplacement des fichiers disque

Pour stocker les VMs ailleurs (par exemple sur un disque dédié) :

  1. Créer le répertoire

    Fenêtre de terminal
    sudo mkdir -p /data/vms
    sudo chown root:root /data/vms
    sudo chmod 711 /data/vms
  2. Définir le pool

    Fenêtre de terminal
    virsh pool-define-as vms dir --target /data/vms

    Sortie : Pool vms defined

  3. Construire le pool (initialise le répertoire si nécessaire)

    Fenêtre de terminal
    virsh pool-build vms
  4. Démarrer le pool

    Fenêtre de terminal
    virsh pool-start vms
  5. Activer le démarrage automatique

    Fenêtre de terminal
    virsh pool-autostart vms
  6. Vérifier

    Fenêtre de terminal
    virsh pool-list --all
    Name State Autostart
    -------------------------------
    default active yes
    vms active yes

Pour utiliser un Volume Group LVM existant :

Fenêtre de terminal
# Supposons un VG nommé "vg_vms"
virsh pool-define-as lvm-pool logical --source-name vg_vms --target /dev/vg_vms
virsh pool-start lvm-pool
virsh pool-autostart lvm-pool
FormatAvantagesInconvénientsCas d’usage
RAWPerformance maximale, simplePas de snapshots, taille fixeProduction I/O intensif
QCOW2Snapshots, thin provisioning, compressionLégère overheadLab, dev, la plupart des cas
  • Fichier = image bit-à-bit du disque
  • Taille du fichier = taille du disque (pas de thin provisioning par défaut)
  • Aucune fonctionnalité avancée
  • Thin provisioning : le fichier grandit à la demande
  • Snapshots : points de sauvegarde intégrés
  • Compression : optionnelle, réduit l’espace
  • Chiffrement : support natif (LUKS)
  • Backing files : chaînage pour les clones
Fenêtre de terminal
qemu-img info /chemin/vers/disque.qcow2

Exemple de sortie :

image: ubuntu-test.qcow2
file format: qcow2
virtual size: 20 GiB (21474836480 bytes)
disk size: 2.1 GiB
cluster_size: 65536
Format specific information:
compat: 1.1
compression type: zlib
lazy refcounts: false
refcount bits: 16
corrupt: false
extended l2: false

Décryptage :

ChampSignification
virtual sizeTaille vue par la VM (20 GiB)
disk sizeEspace réellement utilisé sur le disque (2.1 GiB)
cluster_sizeTaille des blocs d’allocation
compat: 1.1Version du format QCOW2

Le ratio disk size / virtual size montre le thin provisioning en action.

Fenêtre de terminal
virsh vol-list default

Sortie exemple (pool avec des VMs) :

Name Path
-----------------------------------------------------
ubuntu-test.qcow2 /var/lib/libvirt/images/ubuntu-test.qcow2
debian-srv.qcow2 /var/lib/libvirt/images/debian-srv.qcow2
Fenêtre de terminal
virsh vol-create-as default test-disk.qcow2 10G --format qcow2

Options :

ParamètreSignification
defaultNom du pool
test-disk.qcow2Nom du volume
10GTaille (G = GiB)
--format qcow2Format du disque
Fenêtre de terminal
virsh vol-info test-disk.qcow2 --pool default
Fenêtre de terminal
virsh vol-delete test-disk.qcow2 --pool default

Pour agrandir un disque QCOW2 :

Fenêtre de terminal
# Avec qemu-img (VM arrêtée)
qemu-img resize /var/lib/libvirt/images/vm.qcow2 +10G
# Ou avec virsh
virsh vol-resize vm.qcow2 30G --pool default
FichierEmplacementContenu
Définitions des pools/etc/libvirt/storage/XML des pools
Pool default/var/lib/libvirt/images/Disques des VMs
Définitions des VMs/etc/libvirt/qemu/XML des domains
Fenêtre de terminal
# Voir les définitions de pools
ls /etc/libvirt/storage/
# Sortie :
# autostart/
# default.xml
CommandeDescription
virsh pool-list --allLister tous les pools
virsh pool-list --detailsLister avec capacité/allocation
virsh pool-info <pool>Détails d’un pool
virsh pool-dumpxml <pool>Configuration XML
virsh pool-define-as <nom> <type> --target <path>Créer un pool
virsh pool-start <pool>Démarrer
virsh pool-autostart <pool>Activer au boot
virsh pool-destroy <pool>Arrêter
virsh pool-undefine <pool>Supprimer la définition
virsh pool-refresh <pool>Rafraîchir (rescan)
CommandeDescription
virsh vol-list <pool>Lister les volumes
virsh vol-info <vol> --pool <pool>Infos d’un volume
virsh vol-create-as <pool> <nom> <taille> --format <fmt>Créer
virsh vol-delete <vol> --pool <pool>Supprimer
virsh vol-resize <vol> <taille> --pool <pool>Redimensionner
virsh vol-clone <src> <dst> --pool <pool>Cloner
CommandeDescription
qemu-img info <fichier>Informations du disque
qemu-img create -f qcow2 <fichier> <taille>Créer un disque
qemu-img resize <fichier> +10GAgrandir
qemu-img convert -O qcow2 <src> <dst>Convertir le format
ErreurCauseSolution
Pool not foundPool inexistant ou pas démarrévirsh pool-list --all, virsh pool-start
Vol not foundVolume inexistantvirsh vol-list <pool>
Permission deniedDroits insuffisants sur le répertoireVérifier permissions (chmod 711)
Not enough spacePool pleinLibérer de l’espace ou utiliser un autre pool
Volume is in useVM utilise le disqueArrêter la VM avant suppression
  • Pool default actif et autostart (virsh pool-list --all)
  • Espace suffisant disponible (virsh pool-info default)
  • Format QCOW2 pour la plupart des VMs
  • Permissions correctes sur le répertoire du pool
  • Sauvegardes des disques importants planifiées
  1. Pool = conteneur de disques (répertoire, LVM, ZFS…). Volume = un disque individuel.

  2. Le pool default (/var/lib/libvirt/images/) suffit pour débuter.

  3. QCOW2 = le format recommandé (thin provisioning, snapshots). RAW = performance max mais pas de fonctionnalités.

  4. virsh pool-* pour gérer les pools, virsh vol-* pour les volumes.

  5. qemu-img info pour voir les vraies infos d’un disque (taille virtuelle vs réelle).

  6. Redimensionner le fichier disque ≠ étendre le filesystem (à faire dans la VM).

Ce site vous est utile ?

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

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.