Sauvegarde de machines virtuelles Hyper-V par script

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 !

View my MCP Certifications