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 tracking. 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