Sauvegarde automatisée de VM sous HyperV !!!
Un sujet plutôt obscur …
La solution de virtualisation de Microsoft, HyperV (aujourd’hui en v1) est très puissante et rivalise avec les ténors comme la solution ESXi de VMWare.
Ici pas de débat sur les produits, mais des astuces.
Pour ceux qui s’y sont essayé … HyperV n’offre pas de solutions de sauvegarde automatisée des Machines Virtuelles qui tournent (je mens un peu … car il possible d’utiliser WSB (Windows Server Backup) en modifiant le registre, cependant les possibilités sont restreintes et contraignantes ! (je ne citerai que la réservation d’un disque pour que la solution fonctionne…))
La seul solution officielle est bien sur DPM 2007 SP1 (+ RollUP) : très puissant mais surdimensionné pour la PME PMI.
Nous allons donc voir ici comment remédier à cela en utilisant tous les outils fournis par Microsoft en standard dans Windows Serveur 2008 (notamment DiskShadow et le VSS Writer d’Hyper-V …)
Allé c’est parti !
Tout d’abord les pré-requis :
Au menu un certain nombre de KB …
1 - KB967902 (elle n’a pas l’air comme ca mais en faite si elle n’est pas appliqué 1 an après l’installation d’HyperV on ne peut plus lancer les VM … le certificat SSL devient périmé !) http://support.microsoft.com/?scid=kb;en-us;967902&x=17&y=15
2 - KB958316 (règle les problèmes lors de la manipulation des GUID des VM) http://support.microsoft.com/?scid=kb;en-us;958316&x=18&y=9
3 - KB960038 (pour ceux qui auraient un plantage pendant les sauvegardes ou des erreurs avec vds.exe (à appliquer au cas ou …))
http://support.microsoft.com/?scid=kb;en-us;960038&x=11&y=8
4 - KB959962 (LA PLUS IMPORTANTE … celle que l’ont attendait depuis l’année dernière (et qui est arrivée le 16 Janvier))
http://support.microsoft.com/?scid=kb;en-us;959962&x=12&y=13
Note 1
Juste pour information sans cette KB d’appliquée même DPM 2007 SP1 n’est pas capable de sauvegarder les VM à chaud … (et oui DPM 2007 SP1 était disponible depuis le 19 Décembre 2008 mais n’a été complètement opérationnel qu’à partir du 16 Janvier …)
Cette KB met à jour Vmms.exe (ainsi que les dll associées) mais surtout met à jour le VMGuest.iso (Les services d’intégration pour les VM (Integration Services))
Note 2
Si jamais ces KB ne sont pas installées vous aurez ce type d’erreurs dans les journaux d’événements (erreurs avec lesquelles je me suis battu pendant 1 an …)
ID 1000
Application défaillante vmms.exe, version 6.0.6001.18016, horodatage 0x484fc22e, module défaillant unknown, version 0.0.0.0, horodatage 0x00000000, code d’exception 0x00000000, décalage d’erreur 0x0000000000000000, ID du processus 0x6c4, heure de début de l’application 0x01c9773af7d5cdc4.
ID 4354
Le système d'événements de COM+ n'a pas pu déclencher la méthode PostSnapshot de l'abonnement {82294CA2-FD15-4A52-A8BB-1C071A653B31}-{00000000-0000-0000-0000- 000000000000}-{00000000-0000-0000-0000-000000000000}. L'abonné a renvoyé HRESULT 80010105.
Ou
Le système d'événements de COM+ n'a pas pu déclencher la méthode RequestWriterInfo de l'abonnement {E8F22499-7157-4AE9-B40B-4946B6A158C5}-{00000000-0000-0000-0000- 000000000000}-{00000000-0000-0000-0000-000000000000}. L'abonné a renvoyé HRESULT 80042318.
ID 12366
Une exception non gérée a été rencontrée lors du traitement du rappel d’événement d’un enregistreur VSS. L’infrastructure de l’enregistreur VSS est dans un état instable. Le processus d’hébergement de l’enregistreur doit être redémarré en vue de récupérer la fonctionnalité VSS.
Maintenant passons à l’installation :
On install dans cet ordre, une fois les 4 KB d’installées on redémarre le serveur.
Coté Windows Serveur 2008 HyperV on est à jour.
Il faut maintenant réinstaller les services d’intégration (vmguest.iso) dans chaque VM hébergées sur le serveur concerné, puis redémarrer chaque VM.
Nous sommes à jour ! Nous allons pouvoir mettre en place nos sauvegardes.
Du coté des VM, rien à faire, il faut juste que les composants d’intégration soient à jour, tout va se faire sur le Windows Serveur 2008 avec le rôle Hyper-V.
Notre procédure de sauvegarde repose sur DiskShadow.exe (l’équivalent de vshadow.exe présent dans SDK de VSS pour ceux qui faisaient déjà des sauvegardes scriptées avec Virtual Serveur 2005 R2) Alors regardons un peu comment ca se passe, nous allons lancer un cmd en tant qu’administrateur et taper diskshadow
LIST WRITERS : listes tous les Writers VSS disponibles (équivalent de la commande VSSAdmin List Writers) mais ici c’est la version ultra détaillée !!
Ci-dessous la liste des Writers que vous devriez avoir par default de disponibles (sans applications tierces d’installées)
Vous l’aurez compris, celui qui nous intéresse c’est Microsoft Hyper-V VSS Writer ! Les autres commandes vont nous permettre de gérer nos sauvegardes.
La procédure de sauvegarde
Elle se compose de 4 batch et d’1 script diskshadow.
Le tout se trouve dans le répertoire C:\HyperV (ce répertoire sera pris pour base dans l’explication des batch suivant)
Nous allons avoir :
1) Un batch pour l’exécution générale qui fera appel aux autres batch (et au script diskshadow)
2) Un batch pour la gestion de la maintenance a. Suppression d’anciennes sauvegardes
b. Gestion d’un jeu de roulement de sauvegardes c. Etc
3) Un batch pour la gestion des exports des sauvegardes des VMvers une destination choisie
4) Un batch pour la l’export de la partition système hyperV à l’aide d’imagex Détail des batch :
1 - HyperV.cmd
FOR /F "TOKENS=1* DELIMS= " %%A IN ('echo %date%') DO SET CDATE=%%B FOR /F "TOKENS=1,2 eol=/ DELIMS=/ " %%A IN ('echo %date%') DO SET mm=%%B FOR /F "TOKENS=1,2 DELIMS=/ eol=/" %%A IN ('echo %CDATE%') DO SET dd=%%B FOR /F "TOKENS=2,3 DELIMS=/ eol= " %%A IN ('echo %CDATE%') DO SET yyyy=%%B SET dateStamp=%mm%%dd%%yyyy%
c:
cd HyperV
Echo %date% %time% >>c:\HyperV\logs\%dateStamp%_%computername%_HyperV.log diskshadow /s c:\HyperV\HyperV_step.dsh
>>c:\HyperV\logs\%dateStamp%_%computername%_HyperV.log
Echo %date% %time% >>c:\HyperV\logs\%dateStamp%_%computername%_HyperV.log
Explications :
La première partie reformate la date pour pouvoir être exploité dans le nom des fichiers de logs générés pendant la sauvegarde.
La deuxième nous positionne dans le répertoire correct ou se trouve nos batch.
La troisième et cinquième partie injecte dans les logs l’heure de début et de fin de notre sauvegarde et tag correctement nos fichiers de logs.
La quatrième partie appel le script diskshadow et envoi les étapes effectuées par le script dans les logs.
2 - HyperV_STEP.DSH
DELETE SHADOWS ALL SET CONTEXT PERSISTENT
SET METADATA c:\HyperV\cab\Backup.cab SET VERBOSE ON
BEGIN BACKUP
ADD VOLUME C: ALIAS Shadow1 ADD VOLUME D: ALIAS Shadow2 ADD VOLUME E: ALIAS Shadow3 ADD VOLUME F: ALIAS Shadow4
WRITER VERIFY {66841cd4-6ded-4f4b-8f17-fd23f8ddc3de}
CREATE
EXEC C:\HyperV\backup_maintenance.cmd EXPOSE %Shadow1% X:
EXEC C:\HyperV\ backup_imagex.cmd UNEXPOSE X:
EXPOSE %Shadow2% X:
EXEC C:\HyperV\ backup_export.cmd UNEXPOSE X:
EXPOSE %Shadow3% X:
EXEC C:\HyperV\ backup_export.cmd UNEXPOSE X:
EXPOSE %Shadow4% X:
EXEC C:\HyperV\ backup_export.cmd UNEXPOSE X:
END BACKUP
Explications :
DELETE SHADOWS ALL : on supprime toutes les shadows copy précédentes (on ne le fait pas à la fin, comme ca on garde les shadows copy jusqu’à la prochaine sauvegarde (si jamais on doit manipuler les shadows copy au moins elles seront déjà sur le système))
Note : votre serveur Hyper-V ne gère que des VM, attention s’il est serveur de fichiers et que vous utilisez les clichés instantanés sur vos partages réseaux (pour le vertioning) (tous les clichés seront supprimés à l’exécution de cette commande)
SET CONTEXT PERSISTENT
SET METADATA c:\HyperV\cab\Backup.cab SET VERBOSE ON
BEGIN BACKUP
Ces commandes préparent l’environnement de sauvegarde
ADD VOLUME C: ALIAS Shadow1 ADD VOLUME D: ALIAS Shadow2 ADD VOLUME E: ALIAS Shadow3 ADD VOLUME F: ALIAS Shadow4
Ici nous ajoutons les volumes que nous voulons sauvegarder (mon système est sur le C et j’ai une VM sur chaque partition D E et F)
WRITER VERIFY {66841cd4-6ded-4f4b-8f17-fd23f8ddc3de}
Nous vérifions que le VSS Writer d’Hyper-V est bien disponible (vous vous souvenez il était dans la list VSSAdmin list writers) s’il n’est pas disponible la sauvegarde sera annulée.
CREATE : c’est parti, on lance la création de tous les volumes ajoutés précédemment.
EXEC c:\HyperV\backup_maintenance.cmd : on fait appel au batch de maintenance pour la suppression des anciennes sauvegardes etc etc
EXPOSE %Shadow1% X:
EXEC c:\HyperV\backup_imagex.cmd UNEXPOSE X:
On expose la shadow copy du système C : et on fait appel au batch d’export au format wim vers la destination choisie.
EXPOSE %Shadow2% X:
EXEC c:\HyperV\backup_export.cmd UNEXPOSE X:
Et maintenant on expose la shadow copy sur un lecteur disponible (dans l’exemple X:\ ), puis on fait appel au batch d’export vers la destination choisie et enfin on retire l’exposition de la shadow copy pour passer à la VM suivante.
Vous l’avez compris ces 3 lignes sont exécutées autant de fois qu’il y a de VM à sauvegarder (si vos VM sont bien cloisonnées sur une partition indépendante à chaque fois) (si vos VM sont sur une seule partition (déjà renvoyé votre implémentation) mais tout sera sauvegardé en une fois).
END BACKUP : pour terminer la sauvegarde et libérer les divers locks lancés par diskshadow 3 - BACKUP_MAINTENANCE.cmd
FOR /F "TOKENS=1* DELIMS= " %%A IN ('echo %date%') DO SET CDATE=%%B FOR /F "TOKENS=1,2 eol=/ DELIMS=/ " %%A IN ('echo %date%') DO SET mm=%%B
FOR /F "TOKENS=1,2 DELIMS=/ eol=/" %%A IN ('echo %CDATE%') DO SET dd=%%B FOR /F "TOKENS=2,3 DELIMS=/ eol= " %%A IN ('echo %CDATE%') DO SET yyyy=%%B SET dateStamp=%mm%%dd%%yyyy%
Echo %date% %time% >> c:\HyperV\logs\%dateStamp%_%computername%_maint.log rd /s /q s:\%computername%-OLD
ren s:\%computername% %computername%-OLD
Echo %date% %time% >> c:\HyperV\logs\%dateStamp%_%computername%_maint.log
La première partie formate la date comme vu tout à l’heure.
La deuxième et quatrième partie gèrent les fichiers de logs comme vu tout à l’heure.
La troisième partie gère ici un roulement sur 2 jours, la sauvegarde d’il y a 2 jours est supprimée, celle de la veille est renommée en –OLD et nous sommes prêt à ajouter la sauvegarde du jour.
Ici vous pouvez créer votre roulement sur le nombre de jours que vous désirez.
4 - BACKUP_EXPORT.cmd
FOR /F "TOKENS=1* DELIMS= " %%A IN ('echo %date%') DO SET CDATE=%%B FOR /F "TOKENS=1,2 eol=/ DELIMS=/ " %%A IN ('echo %date%') DO SET mm=%%B FOR /F "TOKENS=1,2 DELIMS=/ eol=/" %%A IN ('echo %CDATE%') DO SET dd=%%B FOR /F "TOKENS=2,3 DELIMS=/ eol= " %%A IN ('echo %CDATE%') DO SET yyyy=%%B SET dateStamp=%mm%%dd%%yyyy%
Echo %date% %time% >> c:\HyperV\logs\%dateStamp%_%computername%_xcopy.log if not exist s:\%computername% md s:\%computername%
robocopy X:\ s:\%computername%\ /E /V /NP
/LOG+:"C:\HyperV\logs\%dateStamp%_%computername%_xcopy.log" /ZB /R:2 /W:30 /XJD /XJF /XD
$RECYCLE.BIN SYSTEM* MP* /XA:SHO attrib -R -A -S -H -I s:\%computername%
Echo %date% %time% >> c:\HyperV\logs\%dateStamp%_%computername%_xcopy.log
La première partie formate la date comme vu tout à l’heure.
La deuxième et quatrième partie gèrent les fichiers de logs comme vu tout à l’heure.
La troisième partie gère ici un export à l’aide de l’utilitaire RoboCopy, nous vérifions tout d’abord si le répertoire de destination existe si non nous le créons ensuite on exécute la commande robocopy (la source est X:\ (La lettre sur laquelle est exposé notre shadow copy) et la destination est notre répertoire de sauvegarde (ici sur le lecteur S:\ (Dans le répertoire qui porte le nom de notre serveur)))
Les paramètres de robocopy sont : /E -> Copie tous les sous dossiers
/V -> passe en mode verbose pour les logs /NP -> pas d’affichage de l’état de progression
/LOG+:"c:\HyperV\logs\%dateStamp%_%computername%_xcopy.log" -> envoi le résultat dans le fichier de log desiré
/ZB -> utilisation du mode restartable (si un accès refuse passage en mode backup) /R:2 -> nombre de tentatives si échec
/W:30 -> temps d’attente entre les tentatives
/XJD -> exclusion des points de jonctions pour les répertoires /XJF -> exclusion des points de jonctions pour les fichiers
/XD $RECYCLE.BIN SYSTEM* MP* -> exclusion des répertoires désirés
/XA:SHO -> exclusion des fichiers avec les attributs désirés (S : fichier système, H : fichier caché et O : fichier offline)
On fini avec l’exécution de attrib -R -A -S -H -I s:\%computername% si non notre répertoire de destination passe en répertoire caché (ça par contre je n’ai pas encore compris pourquoi …)
5 - BACKUP_IMAGEX.cmd
FOR /F "TOKENS=1* DELIMS= " %%A IN ('echo %date%') DO SET CDATE=%%B FOR /F "TOKENS=1,2 eol=/ DELIMS=/ " %%A IN ('echo %date%') DO SET mm=%%B FOR /F "TOKENS=1,2 DELIMS=/ eol=/" %%A IN ('echo %CDATE%') DO SET dd=%%B FOR /F "TOKENS=2,3 DELIMS=/ eol= " %%A IN ('echo %CDATE%') DO SET yyyy=%%B SET dateStamp=%mm%%dd%%yyyy%
Echo %date% %time% >> C:\HyperV\logs\%dateStamp%_%computername%_imagex.log C:\HyperV\ImageX\imagex /capture X: S:\%computername%\SystemeHyperV.wim "SVG Disque Systeme Serveur HyperV" /compress fast /check
Echo %date% %time% >> C:\HyperV\logs\%dateStamp%_%computername%_imagex.log
La première partie formate la date comme vu tout à l’heure.
La deuxième et quatrième partie gèrent les fichiers de logs comme vu tout à l’heure.
La troisième partie gère ici un export à l’aide de l’utilitaire ImageX (de la suite Windows AIK (Automated Installation Kit))
Note : Pour pouvoir utiliser ImageX il vous faudra récupérer le répertoire ou il est installer par défaut avec le Windows AIK (Automated Installation Kit) (par défaut il se trouve dans program
files\Windows AIK\Tools\amd64 (bien prendre la version d’imagex pour 64 bits)
Récapitulons :
Un petit schéma de l’exécution globale de la sauvegarde
Début
On appel HyperV.cmd
Diskshadow /s HyperV_STEP.DSH
BACKUP_MAINTENANCE.cmd BACKUP_IMAGEX.cmd BACKUP_EXPORT.cmd Fin
Au final j’aurai au niveau des fichiers générés
• Le répertoire des batch contient C:\HyperV
Cab (répertoire) ImageX (répertoire) Logs (répertoire) BACKUP_IMAGEX.CMD BACKUP_EXPORT.CMD BACKUP_MAINTENANCE.CMD HyperV.CMD
HyperV_STEP.DSH
• Logs (3 fichiers) dans le répertoire C:\HyperV\logs 01_SRV-HYPERV01_HyperV.txt
01_SRV-HYPERV01_imagex.txt 01_SRV-HYPERV01_maint.txt
01_SRV-HYPERV01_xcopy.txt
01 pour le mois de janvier (change en fonction du mois concernée) SRV-HYPERV01 (ici mon serveur s’appel comme ca)
HyperV la partie concernée par le log
• Fichiers de sauvegardes S:\SRV-HYPERV01
VM1
Snapshots
Virtual Hard Disks Virtual Machines VM2
VM3
SystemeHyperV.wim S:\SRV-HYPERV01-OLD
Mise en place de l’automatisation du lancement de la sauvegarde avec le gestionnaire des taches planifiées de Windows :
Dans la console de gestion du serveur
Configuration > Planificateur de taches > bibliothèque du planificateur de taches
Nous allons crées une nouvelle tache
Ici j’utilise le compte admin pour l’exécution (il est recommandé d’utiliser un compte dédié aux sauvegardes)
On valide les modifications.
Et voilà votre sauvegarde est maintenant opérationnelle !!
Bonne continuation à tous et bon scripting :)