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')