Aller au contenu
Virtualisation medium

Snapshots, clones et backups KVM : comprendre les différences

17 min de lecture

Logo KVM

Les snapshots ne sont pas des sauvegardes. C’est l’erreur la plus courante avec KVM/libvirt. Ce guide vous explique la différence, quand utiliser chaque technique, et comment protéger vraiment vos VMs.

À la fin de ce guide, vous saurez :

  • Créer et gérer des snapshots pour tester sans risque
  • Cloner une VM pour la dupliquer proprement
  • Faire des backups indépendants et restaurables
  • Éviter les pièges de performance et de perte de données

Avant de plonger dans les commandes, comprenons ce que fait chaque technique :

TechniqueCe que c’estAnalogieIndépendant ?Usage
SnapshotPhoto de l’état à un instant TMarque-page dans un livre❌ NonTest rapide, rollback
CloneCopie complète de la VMPhotocopie d’un livre✅ OuiDupliquer un template
BackupExport de la config + copie du disqueMettre le livre au coffre✅ OuiSauvegarde, DR

Le piège classique : un admin crée un snapshot avant une mise à jour, pensant être protégé. La mise à jour échoue, il veut restaurer… mais le disque original est corrompu. Le snapshot dépend du disque original — les deux sont perdus.

Dépendance snapshot au disque de base

La règle d’or : un snapshot protège contre les erreurs logiques (mauvaise config, update raté), pas contre les pannes matérielles ou la corruption.

Un snapshot capture l’état d’une VM à un instant T. Avec QCOW2, libvirt utilise une technique appelée copy-on-write :

  1. Le disque original est “gelé” en lecture seule
  2. Les nouvelles écritures vont dans un fichier delta
  3. Pour revenir en arrière : on supprime le delta

Avantage : création quasi-instantanée, peu d’espace disque. Inconvénient : dépendance au fichier original, performance dégradée si trop de snapshots.

  1. Vérifier l’état de la VM

    Fenêtre de terminal
    virsh domstate ma-vm

    Un snapshot peut être créé sur une VM en cours d’exécution ou arrêtée.

  2. Créer le snapshot

    Fenêtre de terminal
    virsh snapshot-create-as ma-vm \
    --name "avant-upgrade" \
    --description "État stable avant mise à jour kernel"

    Sortie attendue :

    Domain snapshot avant-upgrade created
  3. Vérifier la création

    Fenêtre de terminal
    virsh snapshot-list ma-vm

    Sortie attendue :

    Name Creation Time State
    ------------------------------------------------------
    avant-upgrade 2026-01-31 10:15:30 +0100 running

libvirt supporte deux types de snapshots :

TypeCe qu’il captureVM en cours ?Usage
InterneDisque + RAM (état complet)✅ OuiRollback rapide
ExterneDisque uniquement✅ OuiBackup avec delta externe

Par défaut, snapshot-create-as crée un snapshot interne si la VM tourne.

Pour créer un snapshot disque uniquement (externe) :

Fenêtre de terminal
virsh snapshot-create-as ma-vm \
--name "disk-only-snap" \
--disk-only \
--atomic

Lister tous les snapshots d’une VM :

Fenêtre de terminal
virsh snapshot-list ma-vm

Voir l’arborescence (si plusieurs snapshots) :

Fenêtre de terminal
virsh snapshot-list ma-vm --tree

Sortie exemple :

avant-upgrade
|
+- test-nginx
|
+- test-postgres

Obtenir les détails d’un snapshot :

Fenêtre de terminal
virsh snapshot-info ma-vm --snapshotname avant-upgrade

Sortie attendue :

Name: avant-upgrade
Domain: ma-vm
Current: yes
State: running
Location: internal
Parent: -
Children: 2
Descendants: 2
Metadata: yes

Exporter la configuration XML du snapshot :

Fenêtre de terminal
virsh snapshot-dumpxml ma-vm --snapshotname avant-upgrade

C’est l’opération la plus importante : annuler les changements et revenir à l’état sauvegardé.

  1. Vérifier le snapshot actuel

    Fenêtre de terminal
    virsh snapshot-current ma-vm --name
  2. Revenir au snapshot

    Fenêtre de terminal
    virsh snapshot-revert ma-vm --snapshotname avant-upgrade
  3. Forcer le redémarrage après revert

    Si vous voulez que la VM redémarre immédiatement :

    Fenêtre de terminal
    virsh snapshot-revert ma-vm --snapshotname avant-upgrade --running

Une fois que vous n’avez plus besoin d’un snapshot, supprimez-le pour libérer l’espace et améliorer les performances :

Fenêtre de terminal
virsh snapshot-delete ma-vm --snapshotname avant-upgrade

Supprimer un snapshot et tous ses enfants :

Fenêtre de terminal
virsh snapshot-delete ma-vm --snapshotname avant-upgrade --children

Le piège des snapshots QCOW2 : la chaîne de dépendances

Section intitulée « Le piège des snapshots QCOW2 : la chaîne de dépendances »

Voici ce qui se passe quand vous créez plusieurs snapshots :

Chaîne de dépendances QCOW2

Pour lire un bloc de données, QEMU doit :

  1. Chercher dans snap2
  2. Si absent, chercher dans snap1
  3. Si absent, lire dans vm.qcow2

Plus la chaîne est longue, plus les I/O sont lents.

Pour éliminer les couches intermédiaires et retrouver les performances :

Fenêtre de terminal
# Fusionner tout dans le disque de base (VM arrêtée)
virsh blockcommit ma-vm vda --active --pivot

Le clonage crée une copie complète et indépendante d’une VM. Contrairement au snapshot, le clone n’a aucune dépendance avec l’original.

SituationCloner ?
Créer une VM de test à partir d’un template✅ Oui
Dupliquer un serveur pour load balancing✅ Oui
Sauvegarder avant une mise à jour❌ Non (backup)
Tester une config temporairement❌ Non (snapshot)
  1. Arrêter la VM source (recommandé)

    Fenêtre de terminal
    virsh shutdown ma-vm
  2. Cloner la VM

    Fenêtre de terminal
    virt-clone \
    --original ma-vm \
    --name ma-vm-clone \
    --auto-clone

    Sortie attendue :

    Allocating 'ma-vm-clone.qcow2' | 20 GB 00:00:45
    Clone 'ma-vm-clone' created successfully.

    L’option --auto-clone :

    • Génère un nouveau nom de disque
    • Génère une nouvelle adresse MAC
    • Génère un nouvel UUID
  3. Vérifier le clone

    Fenêtre de terminal
    virsh list --all | grep -E "ma-vm|clone"

    Sortie attendue :

    - ma-vm shut off
    - ma-vm-clone shut off

Spécifier le chemin du nouveau disque :

Fenêtre de terminal
virt-clone \
--original ma-vm \
--name ma-vm-clone \
--file /var/lib/libvirt/images/ma-vm-clone.qcow2

Cloner avec un disque COW (reflink) sur Btrfs/XFS :

Fenêtre de terminal
virt-clone \
--original ma-vm \
--name ma-vm-clone \
--reflink

Cette option utilise la copie instantanée du système de fichiers (si supporté). Beaucoup plus rapide qu’une copie complète.

Cloner sans copier certains disques :

Fenêtre de terminal
virt-clone \
--original ma-vm \
--name ma-vm-clone \
--skip-copy vdb

Utile si vdb est un disque de données partagé.

Le clone est une copie exacte. Cela signifie que l’intérieur de la VM a :

  • Le même hostname
  • Les mêmes clés SSH hôte
  • La même adresse IP (si statique)
  • Le même machine-id

Pour nettoyer un clone, utilisez virt-sysprep :

Fenêtre de terminal
# Installer si nécessaire
sudo apt install guestfs-tools # Debian/Ubuntu
sudo dnf install guestfs-tools # Fedora/RHEL
# Nettoyer le clone (VM arrêtée)
virt-sysprep -d ma-vm-clone

virt-sysprep supprime :

  • Les clés SSH hôte (régénérées au boot)
  • Le machine-id
  • Les logs
  • L’historique bash
  • Les caches apt/dnf

Un backup est une copie indépendante que vous pouvez restaurer même si l’hôte KVM est détruit. C’est la seule protection contre :

  • Panne matérielle de l’hôte
  • Corruption du système de fichiers
  • Suppression accidentelle
  • Ransomware

Un backup KVM complet contient :

  1. La configuration XML de la VM
  2. Le(s) disque(s) de la VM
Backup complet
├── ma-vm.xml ← Configuration (virsh dumpxml)
└── ma-vm.qcow2 ← Disque (copie)

C’est la méthode la plus fiable : pas de risque d’incohérence.

  1. Arrêter la VM

    Fenêtre de terminal
    virsh shutdown ma-vm
    # Attendre l'arrêt complet
    virsh domstate ma-vm
  2. Exporter la configuration XML

    Fenêtre de terminal
    virsh dumpxml ma-vm > /backup/ma-vm.xml
  3. Identifier le(s) disque(s)

    Fenêtre de terminal
    virsh domblklist ma-vm

    Sortie exemple :

    Target Source
    --------------------------
    vda /var/lib/libvirt/images/ma-vm.qcow2
    vdb /var/lib/libvirt/images/ma-vm-data.qcow2
  4. Copier les disques

    Fenêtre de terminal
    cp /var/lib/libvirt/images/ma-vm.qcow2 /backup/
    cp /var/lib/libvirt/images/ma-vm-data.qcow2 /backup/
  5. Vérifier l’intégrité

    Fenêtre de terminal
    qemu-img check /backup/ma-vm.qcow2

    Sortie attendue :

    No errors were found on the image.
  6. Redémarrer la VM

    Fenêtre de terminal
    virsh start ma-vm

Parfois, arrêter la VM n’est pas possible. Deux options :

  1. Créer un snapshot externe

    Fenêtre de terminal
    virsh snapshot-create-as ma-vm \
    --name backup-snap \
    --disk-only \
    --atomic \
    --quiesce

    L’option --quiesce demande à l’agent QEMU de geler le système de fichiers (si installé). Cela garantit un état cohérent.

  2. Copier le disque original (maintenant en lecture seule)

    Fenêtre de terminal
    cp /var/lib/libvirt/images/ma-vm.qcow2 /backup/
  3. Fusionner le snapshot (pivot vers le disque original)

    Fenêtre de terminal
    virsh blockcommit ma-vm vda --active --pivot
  4. Supprimer le snapshot

    Fenêtre de terminal
    virsh snapshot-delete ma-vm --snapshotname backup-snap --metadata

Moins fiable mais plus simple :

Fenêtre de terminal
qemu-img convert -f qcow2 -O qcow2 \
/var/lib/libvirt/images/ma-vm.qcow2 \
/backup/ma-vm.qcow2
  1. Copier les disques vers leur emplacement

    Fenêtre de terminal
    cp /backup/ma-vm.qcow2 /var/lib/libvirt/images/
  2. Adapter le XML si nécessaire

    Si vous restaurez sur un hôte différent, vérifiez :

    • Les chemins des disques
    • Le nom du réseau
    • Les capabilities CPU
  3. Importer la VM

    Fenêtre de terminal
    virsh define /backup/ma-vm.xml

    Sortie attendue :

    Domain 'ma-vm' defined from /backup/ma-vm.xml
  4. Démarrer la VM

    Fenêtre de terminal
    virsh start ma-vm
  5. Vérifier

    Fenêtre de terminal
    virsh console ma-vm
    # ou SSH si le réseau fonctionne

Voici un script simple pour automatiser les backups :

#!/bin/bash
# backup-vm.sh - Backup d'une VM KVM
# Usage: ./backup-vm.sh <nom-vm> <dossier-backup>
VM_NAME="${1:?Usage: $0 <vm-name> <backup-dir>}"
BACKUP_DIR="${2:?Usage: $0 <vm-name> <backup-dir>}"
DATE=$(date +%Y%m%d-%H%M%S)
# Créer le dossier de backup
mkdir -p "${BACKUP_DIR}/${VM_NAME}/${DATE}"
DEST="${BACKUP_DIR}/${VM_NAME}/${DATE}"
echo "=== Backup de ${VM_NAME} vers ${DEST} ==="
# Exporter la config XML
echo "[1/3] Export de la configuration..."
virsh dumpxml "${VM_NAME}" > "${DEST}/${VM_NAME}.xml"
# Identifier et copier les disques
echo "[2/3] Copie des disques..."
for DISK in $(virsh domblklist "${VM_NAME}" --details | awk '/disk/ {print $4}'); do
echo " → Copie de ${DISK}..."
DISK_NAME=$(basename "${DISK}")
cp "${DISK}" "${DEST}/${DISK_NAME}"
done
# Vérification
echo "[3/3] Vérification..."
for QCOW in "${DEST}"/*.qcow2; do
qemu-img check "${QCOW}" > /dev/null && echo " ✓ ${QCOW}" || echo " ✗ ${QCOW} ERREUR"
done
echo "=== Backup terminé : ${DEST} ==="
ls -lh "${DEST}"

Utilisation :

Fenêtre de terminal
chmod +x backup-vm.sh
./backup-vm.sh ma-vm /mnt/backup
BesoinTechniqueCommande clé
Tester une mise à jourSnapshotvirsh snapshot-create-as
Revenir en arrièreRevertvirsh snapshot-revert
Dupliquer une VMClonevirt-clone --auto-clone
Protéger contre les pannesBackupdumpxml + copie disque
Restaurer une VMImportvirsh define
ErreurCauseSolution
error: domain is not runningSnapshot avec --quiesce sur VM arrêtéeRetirer --quiesce
Snapshot not foundMauvais nom ou snapshot déjà supprimévirsh snapshot-list
Clone très lentCopie complète de gros disquesUtiliser --reflink si Btrfs/XFS
VM clone avec même IPIdentifiants non nettoyésvirt-sysprep
Backup corrompuCopie de VM en cours sans snapshotUtiliser la méthode snapshot + copie
  1. Snapshot ≠ Backup — le snapshot dépend du disque original
  2. Snapshot = test temporaire — créez, testez, supprimez
  3. Clone = copie indépendante — pensez à nettoyer les identifiants
  4. Backup = XML + disque(s) — testez la restauration régulièrement
  5. Pas plus de 2-3 snapshots — au-delà, les performances se dégradent
  6. Quiesce améliore la cohérence mais nécessite l’agent QEMU

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.