Citrix XenServer 6.5 : Script de sauvegarde automatique

Par défaut, XenServer ne fournit pas d’outil pour exporter ou prendre des snapshots des machines virtuelles de manière automatique. Voici un script « maison » de sauvegarde des machines virtuelles sur un répertoire NFS.

Citrix XenServer est devenu Open Source il y a deux ans. Aujourd’hui dans sa version 6.5, c’est l’occasion pour moi de le mettre en oeuvre. La communauté encore faible à l’heure actuelle va se développer malgré le fait que le support ne soit disponible qu’auprès de Citrix pour les professionnels.

L’interface de XenCenter est assez complète mais il manque encore quelques fonctionnalités, telles que l’automatisation des snapshots et des exports des machines virtuelles.

XenCenter

Fonctionnement du script

Avant toute chose, il faut faire la différence entre un snapshot et un export :

  • Snapshot : se fait lorsque la VM est allumée, c’est une capture instantanée et relativement rapide de la VM : disque dur et contenu de la RAM. Un snapshot dépend du précédent snapshot. Voyez cela comme une sauvegarde incrémentielle d’un répertoire. Il est possible à tout moment de revenir à un snapshot précédent avec XenCenter.
  • Export : se fait lorsque la VM est éteinte, c’est un fichier XVA qui contient l’intégralité du disque dur de la machine ainsi que ses paramètres de configuration. Un fichier XVA peut être importé au sein de Citrix XenServer depuis l’interface XenCenter. Il est également possible de convertir un fichier XVA afin de l’importer dans d’autres systèmes, tels que Virtualbox.

Afin de ne pas à avoir à éteindre la machine virtuelle avant de l’exporter en XVA, il est possible de convertir un snapshot en template : format exportable en XVA.

Les exports des VM se font sur un répertoire réseau (NFS de préférence) car il ne faut pas stocker les exports directement sur l’hyperviseur. Tout d’abord la raison d’être d’une sauvegarde est d’être déportée. De plus la partition système racine ne fait que 5Go ! Les VM sont stockées sur des volumes logiques LVM. C’est une conception très propre de la part de Citrix au passage ! N’allez pas créer un volume dédié aux exports des VM !

Au final le script fonctionne ainsi :

  • Création d’un snapshot
  • Conversion du snapshot en template
  • Export du snapshot converti : fichier XVA sur un répertoire NFS
  • Suppression éventuelle du snapshot

Le choix de la suppression du snapshot vous appartient. Si vous le supprimez, vous ne pourrez pas très rapidement faire revenir la VM à l’état du snapshot. Il faudra importer le fichier XVA.

Si vous ne le supprimez pas, l’espace disque de l’hyperviseur va se réduire au rythme de vos sauvegardes. Sachez que si vous décidez plus tard de supprimer vos snapshots à la main, vous pourrez supprimer un snapshot même si ce n’est pas le dernier de la VM ! En effet, l’hyperviseur est capable de fusionner des snapshots si besoin :

snapshots merge citrix xenserver

 

Oui, c’est puissant … !

En pratique

Les outils utilisés

Une connexion SSH au serveur est requise, elle est par défaut activée, le mot de passe du compte root est renseigné lors de l’installation.

Si vous n’avez pas encore monté le répertoire en NFS, c’est par ici. Faites le dans le fichier /etc/fstab afin que le montage soit automatique au démarrage de l’hyperviseur.

La commande xe sera utilisée. Voyez cette commande comme le XenCenter de la ligne de commande :

[root@XENSERVER ~]# xe help
Usage: xe <command> [-s server] [-pw passwd] [-p port] [-u user] [-pwf password-file]
 [command specific arguments]

To get help on a specific command: xe help <command>
To get a full listing of commands: xe help --all

Common command list
-------------------
 cd-list, diagnostic-vm-status, network-list, snapshot-clone
 snapshot-copy, snapshot-disk-list, snapshot-export-to-template
 snapshot-reset-powerstate, snapshot-revert, snapshot-uninstall, sr-list
 template-export, template-uninstall, vm-cd-add, vm-cd-eject
 vm-cd-insert, vm-cd-list, vm-cd-remove, vm-checkpoint, vm-clone
 vm-compute-maximum-memory, vm-copy, vm-disk-add, vm-disk-list
 vm-disk-remove, vm-export, vm-import, vm-install, vm-list, vm-migrate
 vm-pause, vm-reboot, vm-reset-powerstate, vm-resume, vm-shutdown
 vm-snapshot, vm-snapshot-with-quiesce, vm-start, vm-suspend
 vm-uninstall, vm-unpause, vm-vif-list

Au sein de XenServer, toutes les VM, tous les snapshots et plus globalement tous les objets sont identifiés par un identifiant unique (UUID : Universal Unique Indentifier) du type :

685651bf-ee49-937e-70c9-4a380309c54c

Par exemple, lors de la création d’un snapshot d’une VM avec la commande ci-dessous, l’interpréteur nous retournera un nouvel UUID : celui du snapshot.

[root@XENSERVER ~]# xe vm-snapshot uuid=685651bf-ee49-937e-70c9-4a380309c54c new-name-label="$(date)"
868b7879-96ec-4ee5-890f-339db18adde6

Au final, notre script sera exécuté régulièrement avec les crontab.

Vous pouvez créer un script bash en .sh ou vous rabattre sur un autre langage, tel que python ou PHP. Je vous propose personnellement un script en PHP, exécuté en mode php-cli avec la commande suivante :

php /chemin/vers/le/script.php

Installation de nouveaux paquets

Warning_iconAttention, si vous souhaitez installer de nouveaux paquets sur le serveur, XenServer ne le permet pas par défaut ! Avec une partition système de 5Go, c’est compréhensible !

L’utilitaire yum est par défaut configuré sur les dépôts de Citrix qui sont relativement vides. Afin d’installer un nouveau paquet disponible sur les dépôts officiels de Red Hat, utilisez la commande suivante (exemple avec php-cli) :

[root@XENSERVER ~]# yum --enablerepo=base --disablerepo=citrix install php-cli

Le script

La configuration utilisée pour mon script est la suivante :

  • Répertoire NFS monté sur /var/nfs_sauvegarde/
  • Script de sauvegarde dans le répertoire /var/nfs_sauvegarde/
  • Deux VM
    • « serveur1 » : 685651bf-ee49-937e-70c9-4a380309c54c
    • « serveur2 » : 1124b0d6-628e-4ff9-a3ce-bded2a21060f

Le script PHP :

<?php
// liste des VM
// $vms['NOM_VM'] = "UUID_VM";
$vms['serveur1'] = "685651bf-ee49-937e-70c9-4a380309c54c";
$vms['serveur2'] = "1124b0d6-628e-4ff9-a3ce-bded2a21060f";

// répertoire de travail : dossier de sauvegarde NFS
chdir('/var/nfs_sauvegarde/');

// pour chaque VM
foreach ($vms as $vm => $uuid)
{
 // création snapshot horodaté, récupération de l'UUID du snapshot
 $name_snapshot = "Save_".$vm."_".date('Y-m-d');
 $uuid_snapshot = system("xe vm-snapshot uuid=".$uuid." new-name-label=".$name_snapshot);
 
 // conversion du snapshot en VM exportable
 system("xe template-param-set is-a-template=false ha-always-run=false uuid=".$uuid_snapshot);
 
 // export de la VM
 $name_export = "Export_".$vm."_".date('Y-m-d').".xva";
 system("xe vm-export vm=".$uuid_snapshot." filename=".$name_export);
 
 // suppression du snapshot
 system("xe vm-uninstall uuid=".$uuid_snapshot." force=true");
}
?>

Sources

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Êtes-vous humain ? *