Hyper-V backup maken met zo min mogelijk downtime
In deze blogpost leg ik uit hoe het mogelijk is om een backup van alle Hyper-V images te maken met zo min mogelijk downtime. Hyper-V is de virtualisatie laag van Windows 2008 server. Op het Internet was hier weinig over te vinden en na een lange zoektoch had ik besloten uiteindelijk alles zelf te bouwen. Het eertse begin is om een batch file te maken met de volgende regel. Via diskshadow gaan we een snapshot maken van de schijven en regel we een aantal zaken zoals het pauzeren van de images:
diskshadow -s shadowcreate.txt
Vervolgens maken we een shadowcreate.txt bestand aan op dezelfde locatie. De inhoud van het bestand moet als volgt zijn:
#DiskShadow script file
delete shadows all
list providers
set context persistent
set metadata D:\MetaData.cab
set verbose on
#Create network share
EXEC vmnetwork.cmd
#Write save state files to harddisk before start backup
EXEC vmsavestate.cmd
begin backup
add volume d: alias DataVolumeShadow
#verify the "Microsoft Hyper-V VSS Writer" writer will be included in the snapshot
#writer verify {66841cd4-6ded-4f4b-8f17-fd23f8ddc3de}
create
expose %DataVolumeShadow% q:
#Start Virtual Machine
EXEC vmstart.cmd
#copy all files to d:\backup
EXEC vmcopy.cmd
unexpose q:
end backup
delete shadows all
#End of script
Even wat uitleg; In het eerste stuk van het script verwijderen we alle oude snapshots, geven we een overzicht weer en dumpen we een meta bestand voor het geval dat we ooit in de problemen raken en we willen de snapshot terugzetten.
Daarna maken we de share aan waarnaar we de bestanden gaan kopieren.
Vervolgens gaan we met de regel EXEC vmsavestate.cmd (inhoud: “cscript vmsavestate.vbs VMname“) de virtual machines één voor één even pauzeren; Dit doen we met het volgende stuk code:
Option Explicit
Dim WMIService
Dim VMList
Dim VMName
Dim ArgObj
Set ArgObj = WScript.Arguments
'Specify the name of the virtual machine that I want to start
VMName = ArgObj(0)
'Get instance of 'virtualization' WMI service on the local computer
Set WMIService = GetObject("winmgmts:\\.\root\virtualization")
'Get all the MSVM_ComputerSystem object
Set VMList = WMIService.ExecQuery("SELECT * FROM Msvm_ComputerSystem WHERE ElementName='" & VMName & "'")
WScript.Echo "============================================="
WScript.Echo "VM Name: " & VMList.ItemIndex(0).ElementName
WScript.Echo "VM GUID: " & VMList.ItemIndex(0).Name
WScript.Echo "VM State: " & VMList.ItemIndex(0).EnabledState
WScript.Echo "============================================="
If VMList.ItemIndex(0).EnabledState = 3 Then
WScript.Echo "Virtual Machine is turned off, no need for saving"
Else
'Request a state change on the first VM that is returned
'2 = start, 3 = stop and 32769 = save state
VMList.ItemIndex(0).RequestStateChange(32769)
'Wait till save state is done
while not VMList.ItemIndex(0).EnabledState = 32769
Set VMList = WMIService.ExecQuery("SELECT * FROM Msvm_ComputerSystem WHERE ElementName='" & VMName & "'")
WScript.Echo "VM State: " & VMList.ItemIndex(0).EnabledState
WScript.Sleep 1500
wend
WScript.Echo "============================================="
Wscript.Echo "Save State-Succeeded!"
WScript.Echo "============================================="
End If
De waarde 32769 is voor het save staten, het zelfde script kunnen we gebruiken voor het starten van de virtual machine (even verderop in het shadowcreate bestand).
Tussen het saven en starten door zien we dat de snapshot wordt gemount als een q: drive. Dit is dus een kopie van hoe het systeem was. Alle wijzigingen aan de virtual machine vinden hierop niet meer plaats. De kopieerslag maken we dus vanuit de q: drive. Ik doe dit met het vmcopy script, maar je zou dit ook in het shadowcreate bestand kunnen verwerken. Het script is dus zo opgebouwd dat we eerst de virtual machines saven en direct daarna weer starten. Tussendoor maken we de snapshot aan. De mogelijke downtime is dus enkele tientallen secondes.
Aan het einde van het shadowcreate bestand halen we de q: weg en gooien we alle snapshots weg.
Piethein zou je het erg vinden om de inhoud van je verschillende scripts te tonen?
Ik ben nl niet helemaal mee met wat je als network share mount, en waar je oorspronkelijke data zich bevindt.
Dank je,
Herman