Sauvegarde de machines virtuelles Hyper-V
Voici une sauvegarde facile à mettre en oeuvre et fonctionnant aussi bien pour des machines sur un clustered shared volume (CSV) hyper-v que sur des volumes autonomes.
Je souhaitais pour ma part sauvegarder des machines virtuelles puis ensuite les envoyer sur un filer.
J'utilise les tâches planifiées du serveur hyperviseur afin de déclencher le script de sauvegarde.
Voici donc comment procéder :
1 - Créez un fichier en .cmd que vous appellerez VmBackup.
2 - éditez le fichier et ajoutez :
REM Hyper-V Virtual Machine Backup
REM Extinction des MV
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe c:\scripts\vmbackup\StartStopVms.ps1 c:\scripts\vmbackup\VmNamesStop.txt 1
REM Copies des MV, /Y reecrit le fichier si existe deja
copy /Y "d:\hyper-v\virtual hard disks\xp.vhd" "e:\backup\xp\xp.vhd"
copy /Y "d:\hyper-v\virtual hard disks\vista.vhd" "e:\backup\vista\vista.vhd"
copy /Y "d:\hyper-v\virtual hard disks\server2003.vhd" "e:\backup\server2003\server2003.vhd"
copy /Y "d:\hyper-v\virtual hard disks\server2008.vhd" "e:\backup\server2005\server2005.vhd"
copy /Y "d:\hyper-v\virtual hard disks\dc.vhd" "e:\backup\dc\dc.vhd"
REM Demarrage des Machines virtuelles
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe c:\scripts\vmbackup\StartStopVms.ps1 c:\scripts\vmbackup\VmNamesStart.txt 0
REM Finished!
Le format est du type :
lance la commande d'extinction de la MV (commande 1)
copie le fichier du disque virtuel de la machine (source) vers destination (disque local ou filer).
lance la commande de rallumage de la MV une fois la copie terminée (commande 0).
3 - Créez un fichier nommé StartStopVMs et changez l'extension en .ps1
Ajoutez le contenu suivant :
# ---------- SCRIPT STARTS HERE--------------
$waitstart = 200
$waitshutdown = 120
if ($args[1] -match "0") {
$inputfile=get-content $args[0]
foreach ($guest in $inputfile) {
write-host "Starting $guest"
$vm = gwmi -namespace root\virtualization -query "select * from msvm_computersystem where elementname='$guest'"
$result = $vm.requeststatechange(2)
if ($result.returnvalue -match "0") {
start-sleep -s $waitstart
write-host ""
write-host "$guest is started" -foregroundcolor green
write-host ""
}
else {
write-host ""
write-host "unable to start $guest" -foregroundcolor red
write-host ""
}}}
if ($args[1] -match "1") {
$inputfile=get-content $args[0]
foreach ($guest in $inputfile) {
write-host "shutting down $guest"
$vm = gwmi -namespace root\virtualization -query "select * from msvm_computersystem where elementname='$guest'"
$vmname = $vm.name
$vmshut = gwmi -namespace root\virtualization -query "SELECT * FROM Msvm_ShutdownComponent WHERE SystemName='$vmname'"
$result = $vmshut.InitiateShutdown("$true","no comment")
if ($result.returnvalue -match "0") {
start-sleep -s $waitshutdown
write-host ""
write-host "no error while shutting down $guest"
write-host "shutdown of $guest completed" -foregroundcolor green
write-host ""}
else {
write-host ""
write-host "unable to shutdown $guest" -foregroundcolor red
write-host ""
}}}
else {
write-host "USAGE: to shutdown VMs," -nonewline; write-host ".\managehyperV.ps1 c:\hosts.txt 1" -foregroundcolor yellow
write-host "USAGE: to start VMs," -nonewline; write-host ".\managehyperV.ps1 c:\hosts.txt 0" -foregroundcolor yellow
}
# ---------- SCRIPT ENDS HERE--------------
4 - Créez ensuite les deux fichiers textes suivants :
VmNamesStop.txt
VmNamesStart.txt
Dans chacun des fichiers, vous noterez les noms des machines virtuelles que vous voulez copier. Attention : ce ne sont pas les noms AD ou netbios de la machines mais le nom de la machine dans la console hyper-v.
5 - Programmez ensuite une tache planifiée si vous souhaitez que la sauvegarde soit récurrente. Votre tâche lancera le fichier Vmbackup.
Les machines sauvegardées seront celles spécifiées dans les fichiers
VmNamesStop.txt
VmNamesStart.txt
Le processus est simple : le fichier Vm backup lance le script powershell StartStopVms.ps1 avec l'option 1 qui correspond à l'arrêt de la MV, effectue un simple copie puis relance le script ps avec l'option 0 qui correspond à l'allumage de la MV.
Pour ma part, ne voulant pas sauvegarder en même temps certaines machines, j'ai créé plusieurs dossiers sur l'hyperviseur : chaque dossier contenant Vmbackup, startstopvm et les fichiers VmNamesStop.txt VmNamesStart.txt .
Plusieurs tâches planifiées sont donc paramétrées et pointent sur le fichier vmbackup souhaité selon la récurrence convenue.
Quand on a pas sous la main Data protection manager pour sauvegarder nos VM sur un CSV, c'est une solution fiable à moindre coût, si ce n'est le peu de temps que vous passerez à modifier les noms et chemins de vos MV sur les scripts ci dessus :)
Bonnes sauvegardes !