
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
Prérequis
Section intitulée « Prérequis »- KVM/libvirt installé (guide installation)
- Une VM existante (créer une VM)
- Connaître les commandes virsh de base (guide virsh)
Les 3 techniques : comprendre les différences
Section intitulée « Les 3 techniques : comprendre les différences »Avant de plonger dans les commandes, comprenons ce que fait chaque technique :
| Technique | Ce que c’est | Analogie | Indépendant ? | Usage |
|---|---|---|---|---|
| Snapshot | Photo de l’état à un instant T | Marque-page dans un livre | ❌ Non | Test rapide, rollback |
| Clone | Copie complète de la VM | Photocopie d’un livre | ✅ Oui | Dupliquer un template |
| Backup | Export de la config + copie du disque | Mettre le livre au coffre | ✅ Oui | Sauvegarde, DR |
Pourquoi cette distinction est cruciale
Section intitulée « Pourquoi cette distinction est cruciale »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.
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.
Partie 1 : Les snapshots libvirt
Section intitulée « Partie 1 : Les snapshots libvirt »Qu’est-ce qu’un snapshot ?
Section intitulée « Qu’est-ce qu’un snapshot ? »Un snapshot capture l’état d’une VM à un instant T. Avec QCOW2, libvirt utilise une technique appelée copy-on-write :
- Le disque original est “gelé” en lecture seule
- Les nouvelles écritures vont dans un fichier delta
- 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.
Créer un snapshot
Section intitulée « Créer un snapshot »-
Vérifier l’état de la VM
Fenêtre de terminal virsh domstate ma-vmUn snapshot peut être créé sur une VM en cours d’exécution ou arrêtée.
-
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 -
Vérifier la création
Fenêtre de terminal virsh snapshot-list ma-vmSortie attendue :
Name Creation Time State------------------------------------------------------avant-upgrade 2026-01-31 10:15:30 +0100 running
Types de snapshots
Section intitulée « Types de snapshots »libvirt supporte deux types de snapshots :
| Type | Ce qu’il capture | VM en cours ? | Usage |
|---|---|---|---|
| Interne | Disque + RAM (état complet) | ✅ Oui | Rollback rapide |
| Externe | Disque uniquement | ✅ Oui | Backup 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) :
virsh snapshot-create-as ma-vm \ --name "disk-only-snap" \ --disk-only \ --atomicLister et inspecter les snapshots
Section intitulée « Lister et inspecter les snapshots »Lister tous les snapshots d’une VM :
virsh snapshot-list ma-vmVoir l’arborescence (si plusieurs snapshots) :
virsh snapshot-list ma-vm --treeSortie exemple :
avant-upgrade | +- test-nginx | +- test-postgresObtenir les détails d’un snapshot :
virsh snapshot-info ma-vm --snapshotname avant-upgradeSortie attendue :
Name: avant-upgradeDomain: ma-vmCurrent: yesState: runningLocation: internalParent: -Children: 2Descendants: 2Metadata: yesExporter la configuration XML du snapshot :
virsh snapshot-dumpxml ma-vm --snapshotname avant-upgradeRevenir à un snapshot (revert)
Section intitulée « Revenir à un snapshot (revert) »C’est l’opération la plus importante : annuler les changements et revenir à l’état sauvegardé.
-
Vérifier le snapshot actuel
Fenêtre de terminal virsh snapshot-current ma-vm --name -
Revenir au snapshot
Fenêtre de terminal virsh snapshot-revert ma-vm --snapshotname avant-upgrade -
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
Supprimer un snapshot
Section intitulée « Supprimer un snapshot »Une fois que vous n’avez plus besoin d’un snapshot, supprimez-le pour libérer l’espace et améliorer les performances :
virsh snapshot-delete ma-vm --snapshotname avant-upgradeSupprimer un snapshot et tous ses enfants :
virsh snapshot-delete ma-vm --snapshotname avant-upgrade --childrenLe 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 :
Pour lire un bloc de données, QEMU doit :
- Chercher dans snap2
- Si absent, chercher dans snap1
- Si absent, lire dans vm.qcow2
Plus la chaîne est longue, plus les I/O sont lents.
Fusionner les snapshots (blockcommit)
Section intitulée « Fusionner les snapshots (blockcommit) »Pour éliminer les couches intermédiaires et retrouver les performances :
# Fusionner tout dans le disque de base (VM arrêtée)virsh blockcommit ma-vm vda --active --pivotPartie 2 : Cloner une VM
Section intitulée « Partie 2 : Cloner une VM »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.
Quand cloner ?
Section intitulée « Quand cloner ? »| Situation | Cloner ? |
|---|---|
| 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) |
Cloner avec virt-clone
Section intitulée « Cloner avec virt-clone »-
Arrêter la VM source (recommandé)
Fenêtre de terminal virsh shutdown ma-vm -
Cloner la VM
Fenêtre de terminal virt-clone \--original ma-vm \--name ma-vm-clone \--auto-cloneSortie attendue :
Allocating 'ma-vm-clone.qcow2' | 20 GB 00:00:45Clone '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
-
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
Options de clonage avancées
Section intitulée « Options de clonage avancées »Spécifier le chemin du nouveau disque :
virt-clone \ --original ma-vm \ --name ma-vm-clone \ --file /var/lib/libvirt/images/ma-vm-clone.qcow2Cloner avec un disque COW (reflink) sur Btrfs/XFS :
virt-clone \ --original ma-vm \ --name ma-vm-clone \ --reflinkCette 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 :
virt-clone \ --original ma-vm \ --name ma-vm-clone \ --skip-copy vdbUtile si vdb est un disque de données partagé.
Attention aux identifiants après clonage
Section intitulée « Attention aux identifiants après clonage »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 :
# Installer si nécessairesudo apt install guestfs-tools # Debian/Ubuntusudo dnf install guestfs-tools # Fedora/RHEL
# Nettoyer le clone (VM arrêtée)virt-sysprep -d ma-vm-clonevirt-sysprep supprime :
Partie 3 : Backups — la vraie protection
Section intitulée « Partie 3 : Backups — la vraie protection »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
Stratégie de backup simple
Section intitulée « Stratégie de backup simple »Un backup KVM complet contient :
- La configuration XML de la VM
- Le(s) disque(s) de la VM
Backup complet├── ma-vm.xml ← Configuration (virsh dumpxml)└── ma-vm.qcow2 ← Disque (copie)Backup d’une VM arrêtée
Section intitulée « Backup d’une VM arrêtée »C’est la méthode la plus fiable : pas de risque d’incohérence.
-
Arrêter la VM
Fenêtre de terminal virsh shutdown ma-vm# Attendre l'arrêt completvirsh domstate ma-vm -
Exporter la configuration XML
Fenêtre de terminal virsh dumpxml ma-vm > /backup/ma-vm.xml -
Identifier le(s) disque(s)
Fenêtre de terminal virsh domblklist ma-vmSortie exemple :
Target Source--------------------------vda /var/lib/libvirt/images/ma-vm.qcow2vdb /var/lib/libvirt/images/ma-vm-data.qcow2 -
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/ -
Vérifier l’intégrité
Fenêtre de terminal qemu-img check /backup/ma-vm.qcow2Sortie attendue :
No errors were found on the image. -
Redémarrer la VM
Fenêtre de terminal virsh start ma-vm
Backup d’une VM en cours d’exécution
Section intitulée « Backup d’une VM en cours d’exécution »Parfois, arrêter la VM n’est pas possible. Deux options :
Option A : Snapshot + copie (recommandé)
Section intitulée « Option A : Snapshot + copie (recommandé) »-
Créer un snapshot externe
Fenêtre de terminal virsh snapshot-create-as ma-vm \--name backup-snap \--disk-only \--atomic \--quiesceL’option
--quiescedemande à l’agent QEMU de geler le système de fichiers (si installé). Cela garantit un état cohérent. -
Copier le disque original (maintenant en lecture seule)
Fenêtre de terminal cp /var/lib/libvirt/images/ma-vm.qcow2 /backup/ -
Fusionner le snapshot (pivot vers le disque original)
Fenêtre de terminal virsh blockcommit ma-vm vda --active --pivot -
Supprimer le snapshot
Fenêtre de terminal virsh snapshot-delete ma-vm --snapshotname backup-snap --metadata
Option B : qemu-img convert (copie à chaud)
Section intitulée « Option B : qemu-img convert (copie à chaud) »Moins fiable mais plus simple :
qemu-img convert -f qcow2 -O qcow2 \ /var/lib/libvirt/images/ma-vm.qcow2 \ /backup/ma-vm.qcow2Restaurer un backup
Section intitulée « Restaurer un backup »-
Copier les disques vers leur emplacement
Fenêtre de terminal cp /backup/ma-vm.qcow2 /var/lib/libvirt/images/ -
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
-
Importer la VM
Fenêtre de terminal virsh define /backup/ma-vm.xmlSortie attendue :
Domain 'ma-vm' defined from /backup/ma-vm.xml -
Démarrer la VM
Fenêtre de terminal virsh start ma-vm -
Vérifier
Fenêtre de terminal virsh console ma-vm# ou SSH si le réseau fonctionne
Script de backup automatisé
Section intitulée « Script de backup automatisé »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 backupmkdir -p "${BACKUP_DIR}/${VM_NAME}/${DATE}"DEST="${BACKUP_DIR}/${VM_NAME}/${DATE}"
echo "=== Backup de ${VM_NAME} vers ${DEST} ==="
# Exporter la config XMLecho "[1/3] Export de la configuration..."virsh dumpxml "${VM_NAME}" > "${DEST}/${VM_NAME}.xml"
# Identifier et copier les disquesecho "[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érificationecho "[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 :
chmod +x backup-vm.sh./backup-vm.sh ma-vm /mnt/backupTableau récapitulatif
Section intitulée « Tableau récapitulatif »| Besoin | Technique | Commande clé |
|---|---|---|
| Tester une mise à jour | Snapshot | virsh snapshot-create-as |
| Revenir en arrière | Revert | virsh snapshot-revert |
| Dupliquer une VM | Clone | virt-clone --auto-clone |
| Protéger contre les pannes | Backup | dumpxml + copie disque |
| Restaurer une VM | Import | virsh define |
Erreurs fréquentes
Section intitulée « Erreurs fréquentes »| Erreur | Cause | Solution |
|---|---|---|
error: domain is not running | Snapshot avec --quiesce sur VM arrêtée | Retirer --quiesce |
Snapshot not found | Mauvais nom ou snapshot déjà supprimé | virsh snapshot-list |
| Clone très lent | Copie complète de gros disques | Utiliser --reflink si Btrfs/XFS |
| VM clone avec même IP | Identifiants non nettoyés | virt-sysprep |
| Backup corrompu | Copie de VM en cours sans snapshot | Utiliser la méthode snapshot + copie |
À retenir
Section intitulée « À retenir »- Snapshot ≠ Backup — le snapshot dépend du disque original
- Snapshot = test temporaire — créez, testez, supprimez
- Clone = copie indépendante — pensez à nettoyer les identifiants
- Backup = XML + disque(s) — testez la restauration régulièrement
- Pas plus de 2-3 snapshots — au-delà, les performances se dégradent
- Quiesce améliore la cohérence mais nécessite l’agent QEMU