Ceci est une ancienne révision du document !
Sauvegardes de machines virtuelles
Les machines virtuelles offrent des possibilités inédites de sauvegardes. Il est d'une part possible de les sauvegarder au niveau du système de fichier, comme un vrai serveur (cela permet de conserver un historique fichier par fichier), mais il est aussi possible de les sauvegarder au niveau des périphériques blocs. Cette technique permet une restauration complète, et très rapide. Nous appellerons ce type de sauvegarde une sauvegarde de “bas niveau”. Vous trouverez les instructions pour la mise en place d'une sauvegarde bas niveau avec BackupPC (une sauvegarde au nveau FS se fait comme pour une machine physique, et n'est donc pas abordée ici)
Dans cet exemple, nous utiliserons BackupPC pour la sauvegarde (mais il est possible de le faire avec d'autres outils)
Il n'y a rien à configurer au niveau de la machine virtuelle pour une sauvegarde bas niveau, tout se passe sur la machine hôte.
Mise en place du script de pre-backup
Télécharger ce script et le placer dans /usr/local/bin, puis lui donner les droits d'exécutions:
wget http://repo.firewall-services.com/misc/virt-backup.pl -O /usr/local/bin/ chmod +x /usr/local/bin/virt-backup.pl
Créer le répertoire de sauvegarde
mkdir -p /var/lib/libvirt/backup chmod 750 /var/lib/libvirt/backup
Il est recommandé (mais pas obligatoire) de monter un système de fichier indépendant dans ce répertoire. Ce système de fichier doit être le plus rapide possible (RAID0, RAID10).
Vérifier le fonctionnement du script
Vérifier en local que le script fonctionne, en sauvegardant une machine virtuelle
virt-backup.pl --pre --vm=machine_virtuelle --debug
Pour nettoyer les fichiers générés:
virt-backup.pl --post --vm=machine_virtuelle --debug
Pour obtenir une liste d'options disponibles:
virt-backup.pl
Configurer la sauvegarde
Le serveur de sauvegarde doit pouvoir accéder au répertoire de sauvegarde (rsync+ssh est recommandé). L'utilisateur local sur le machine hôte doit avoir les droits d'éxécuter le script virt-backup.pl en tant que root (si il est différent de root):
Cmnd_Alias BACKUPPC /usr/local/bin/virt-backup.pl, /usr/bin/rsync [...] backup ALL=(root) NOPASSWD: BACKUPPC
Ensuite, il faut configurer un nouvel hôte à sauvegarder dans BackupPC (peu importe le nom), puis modifier la configuration comme suit:
$Conf{BackupFilesOnly} = { '/var/lib/libvirt/backup' => [ '/cos5*' ] }; $Conf{ClientNameAlias} = 'virt.domain.tld'; $Conf{DumpPostUserCmd} = '$sshPath -l backup $host /usr/bin/sudo /usr/local/bin/virt-backup.pl --post --vm cos5'; $Conf{DumpPreUserCmd} = '$sshPath -l backup $host /usr/bin/sudo /usr/local/bin/virt-backup.pl --pre --compress=pbzip2 --vm cos5 --state'; $Conf{EMailNotifyMinDays} = '1.5'; $Conf{EMailNotifyOldBackupDays} = '2'; $Conf{FullKeepCnt} = [ '4' ]; $Conf{FullKeepCntMin} = '1'; $Conf{IncrAgeMax} = '7'; $Conf{IncrKeepCnt} = '7'; $Conf{IncrKeepCntMin} = '2'; $Conf{RsyncClientCmd} = '$sshPath -q -x -l backup $host ionice -c2 -n7 nice -n 10 /usr/bin/sudo $rsyncPath $argList+'; $Conf{RsyncClientRestoreCmd} = '$sshPath -q -x -l backup $host /usr/bin/sudo $rsyncPath $argList+'; $Conf{RsyncShareName} = [ '/var/lib/libvirt/backup' ]; $Conf{UserCmdCheckStatus} = '1'; $Conf{IncrLevels} = [ '1' ]; $Conf{CompressLevel} = '0';
Dans cet exemple:
- virt.domain.tld est la machine hôte
- backup est l'utilisateur local (sur virt.domain.tld) responsable des sauvegardes
- cos5 est le nom de la machine virtuelle à sauvegarder
- le script pre-backup.pl compresse les copies des disques virtuels à la volé, en utilisant pbzip2 (–compress=pbzip2)
- l'état complet de la machine virtuelle est sauvegarder (dump de la mémoire), permettant de la restaurer dans l'état exacte où elle était au moment de la sauvegarde (!! Attention, provoque parfois des instabilités pour le système invité, à tester avant !!) (–state)
- Les sorties des commandes pre et post sont vérifié, et la sauvegarde est considérée comme mauvaise si une erreur est détecté ($Conf{UserCmdCheckStatus} = '1')
- On désactive les sauvegardes incrémentielles multi-niveau ($Conf{IncrLevels} = ['1'])
- La compression de BackupPC est désactivée (puisque les images des disques sont déjà compressées) ($Conf{CompressLevel} = '0')