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 niveau 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

Le script virt-backup est maintenant inclus dans le paquet virt-stack

Il est recommandé (mais pas obligatoire) de monter un système de fichier indépendant dans le répertoire de sauvegarde (/var/lib/libvirt/backup). 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 --vm=machine_virtuelle --debug

Pour nettoyer les fichiers générés:

virt-backup --cleanup --vm=machine_virtuelle --debug

Pour obtenir une liste d'options disponibles:

virt-backup

Configurer la sauvegarde

Le serveur de sauvegarde doit pouvoir accéder au répertoire de sauvegarde (tar+ssh est recommandé). L'utilisateur local sur le machine hôte doit avoir les droits d'exécuter le script virt-backup en tant que root:

Cmnd_Alias BACKUPPC /usr/bin/virt-backup, /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 (dans cet exemple, la VM que l'on sauvegarde se nomme smetest)

$Conf{BackupFilesOnly} = {};
$Conf{ClientNameAlias} = 'localhost';
$Conf{DumpPostUserCmd} = '/usr/bin/sudo /usr/bin/virt-backup --cleanup --vm smetest';
$Conf{DumpPreUserCmd} = '/usr/bin/sudo /usr/bin/virt-backup --keep-lock --compress=pbzip2 --vm smetest --state';
$Conf{EMailNotifyMinDays} = '1.5';
$Conf{EMailNotifyOldBackupDays} = '2';
$Conf{FullKeepCnt} = [
'4'
];
$Conf{FullKeepCntMin} = '1';
$Conf{IncrAgeMax} = '7';
$Conf{IncrKeepCnt} = '7';
$Conf{IncrKeepCntMin} = '2';
$Conf{UserCmdCheckStatus} = '1';
$Conf{IncrLevels} = [
'1'
];
$Conf{CompressLevel} = '0';
$Conf{TarClientCmd} = 'env LC_ALL=C /usr/bin/sudo $tarPath -c -v -f - -C $shareName+ --totals';
$Conf{TarClientRestoreCmd} = 'env LC_ALL=C /usr/bin/sudo $tarPath -x -p --numeric-owner --same-owner -v -f - -C $shareName+';
$Conf{TarShareName} = [
'/var/lib/libvirt/backup/smetest/'
];
$Conf{XferMethod} = 'tar';
$Conf{TarIncrArgs} = '--newer=$incrDate $fileList+';