Hyper-V dodanie skopiowanej maszyny

Dziś przedstawię rozwiązanie, które może i nie jest oficjalnie wspierane ani nawet zalecane przez Microsoft, ale mimo wszystko w sytuacji krytycznej awarii może pozwolić na szybkie przywrócenie środowiska zwirtualizowanego. Poprzednie dwa artykuły były tak naprawdę wstępem pozwalającym na wykonanie niniejszych operacji.

Wracając jednak do problemu wyobraźmy sobie sytuację awarii maszyny pracującej jako host roli Hyper-V. W przypadku odtworzenia systemu z kopii zapasowej nie ma większych problemów. Rodzą się one w momencie awaryjnej migracji maszyn wirtualnych na innego hosta, gdy nie mamy już możliwości wykorzystania wbudowanych narzędzi eksportowania maszyn czy migracji poprzez SCVMM.

Samo skopiowanie plików maszyny wirtualnej nie wystarczy. W takiej sytuacji zalecane było by tylko utworzenie nowej maszyny wirtualnej wraz z podmontowaniem obecnego dysku vhd. Wiąże się to jednak ze zmianą infrastruktury sprzętowej takiej maszyny wirtualnej, co może powodować problemy, gdyż niektóre systemy nierzadko są ściśle powiązane z konfiguracją sprzętową.

Tutaj na ratunek przychodzi nam pewne obejście pozwalające na bezpośrednie dołączenie skopiowanych maszyn bez konieczności ich eksportowania. Nie jest to metoda w żaden sposób wspierana dlatego zalecałbym ją tylko i wyłączenie w krytycznych sytuacjach gdy nie mamy już innego wyjścia.

Struktura katalogu maszyny wirtualnej zwykle zawiera pliki vhd stanowiące dyski wirtualne, katalog Virtual Machines zawierający konfigurację sprzętową maszyny oraz ewentualny katalog Snapshots z zapisanymi zrzutami systemu.

Z kilku ważniejszych informacji należy zapamiętać, iż każda maszyna posiada swój własny unikalny VM GUID. Można go znaleźć jako nazwa pliku XML w katalogu Virtual Machines.

W naszym testowym przypadku jest to: 23F541D5-B0EA-490E-8FFB-A1C6AC233262. Analogicznie każdy ze zrzutów stanu systemu (SnapShot) jest identyfikowany swoim własnym unikalnym identyfikatorem:

41F99946-CB67-4C7B-9F32-D97A3D85693F
77788539-0DEF-4302-BA32-F4280276D166

Pierwszym krokiem w celu ręcznego dodania skopiowanej maszyny (np. do lokalizacji E:\CopyTestMachine) jest utworzenie symbolicznego dowiązania pliku konfiguracji maszyny wirtualnej, czyli „Virtual Machines\VM-GUID.XML” do katalogu „%SystemDrive%\ProgramData\Microsoft\Windows\Hyper-V\Virtual Machines”

Możemy się tutaj posłużyć dwoma narzędziami:

mklink

mklink "C:\ProgramData\Microsoft\Windows\Hyper-V\Virtual Machines\23F541D5-B0EA-490E-8FFB-A1C6AC233262.xml" "E:\CopyTestMachine\Virtual Machines\23F541D5-B0EA-490E-8FFB-A1C6AC233262.xml"

lub skryptem PowerShell’owym:

Function New-Symlink
{
	Param(
		[parameter(Mandatory=$true)]
		[String]$Source,
		[parameter(Mandatory=$true)]
		[String]$Destination
	)

	$Definition = @'
	[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
		public static extern int CreateSymbolicLink(
		string lpSymlinkFileName,
		string lpTargetFileName,
		uint dwFlags);
'@

	$type = Add-Type -MemberDefinition $Definition -Name WindowsAPI -PassThru
	$type::CreateSymbolicLink($Destination,$Source,0)
}

New-Symlink –Destination "C:\programdata\Microsoft\Windows\Hyper-V\Virtual Machines\23F541D5-B0EA-490E-8FFB-A1C6AC233262.xml" –Source "E:\CopyTestMachine\Virtual Machines\23F541D5-B0EA-490E-8FFB-A1C6AC233262.xml"

W przypadku gdy maszyna wirtualna posiada zrzuty stanu postępujemy z nimi analogicznie, z tym wyjątkiem iż pliki XML z katalogu SnapShots dowiązujemy symbolicznie do lokalizacji „%SystemDrive%\ProgramData\Microsoft\Windows\Hyper-V\Snapshots”

mklink "C:\ProgramData\Microsoft\Windows\Hyper-V\Snapshots\41F99946-CB67-4C7B-9F32-D97A3D85693F.xml" "E:\CopyTestMachine\Snapshots\41F99946-CB67-4C7B-9F32-D97A3D85693F.xml"
mklink "C:\ProgramData\Microsoft\Windows\Hyper-V\Snapshots\77788539-0DEF-4302-BA32-F4280276D166.xml" "E:\CopyTestMachine\Snapshots\77788539-0DEF-4302-BA32-F4280276D166.xml"

lub z poziomu Powershella:

New-Symlink –Destination "C:\ProgramData\Microsoft\Windows\Hyper-V\Snapshots\41F99946-CB67-4C7B-9F32-D97A3D85693F.xml" –Source "E:\CopyTestMachine\Snapshots\41F99946-CB67-4C7B-9F32-D97A3D85693F.xml"
New-Symlink –Destination "C:\ProgramData\Microsoft\Windows\Hyper-V\Snapshots\77788539-0DEF-4302-BA32-F4280276D166.xml" –Source "E:\CopyTestMachine\Snapshots\77788539-0DEF-4302-BA32-F4280276D166.xml"

Teoretycznie dodaliśmy konfigurację maszyny wirtualnej oraz pliki SnapShots do konfiguracji usługi Hyper-V. Jednakże by można było skorzystać z tak dołączonych maszyn konieczne jest jeszcze nadanie odpowiednich uprawnień tzw. Service SID access permissions w formie „NT VIRTUAL MACHINE\VM-GUID”. Uprawnienia te muszą się tyczyć zarówno dla dowiązań jak i wszystkich plików z katalogu maszyny wirtualnej. Tak naprawdę dotyczą one specyficznych elementów systemu dlatego dla uproszczenia najlepiej zastosować uprawnienia pełnego dostępu – musimy przyjąć, iż jest to awaryjna sytuacja i chcemy tylko przywrócić działanie newralgicznych systemów, a nie dokonać migracji poszczególnych maszyn w normalnym środowisku.

Zarówno jak wyżej możemy tego dokonać przy użyciu wbudowanego narzędzia icalcs:

icacls "C:\ProgramData\Microsoft\Windows\Hyper-V\Virtual Machines\23F541D5-B0EA-490E-8FFB-A1C6AC233262.xml" /grant "NT VIRTUAL MACHINE\23F541D5-B0EA-490E-8FFB-A1C6AC233262":(F) /L
icacls "C:\ProgramData\Microsoft\Windows\Hyper-V\Snapshots\41F99946-CB67-4C7B-9F32-D97A3D85693F.xml" /grant "NT VIRTUAL MACHINE\23F541D5-B0EA-490E-8FFB-A1C6AC233262":(F) /L
icacls "C:\ProgramData\Microsoft\Windows\Hyper-V\Snapshots\77788539-0DEF-4302-BA32-F4280276D166.xml" /grant "NT VIRTUAL MACHINE\23F541D5-B0EA-490E-8FFB-A1C6AC233262":(F) /L
icacls E:\CopyTestMachine\ /T /grant "NT VIRTUAL MACHINE\23F541D5-B0EA-490E-8FFB-A1C6AC233262":(F)

jak i z poziomu PowerShella:

$ACE = New-Object System.Security.AccessControl.FileSystemAccessRule `
("NT VIRTUAL MACHINE\23F541D5-B0EA-490E-8FFB-A1C6AC233262","FullControl","Allow")

$ACL = Get-Acl "C:\ProgramData\Microsoft\Windows\Hyper-V\Virtual Machines\23F541D5-B0EA-490E-8FFB-A1C6AC233262.xml"
$ACL.SetAccessRule($ACE)
$ACL | Set-Acl

$ACL = Get-Acl "C:\ProgramData\Microsoft\Windows\Hyper-V\Snapshots\41F99946-CB67-4C7B-9F32-D97A3D85693F.xml"
$ACL.SetAccessRule($ACE)
$ACL | Set-Acl

$ACL = Get-Acl "C:\ProgramData\Microsoft\Windows\Hyper-V\Snapshots\77788539-0DEF-4302-BA32-F4280276D166.xml"
$ACL.SetAccessRule($ACE)
$ACL | Set-Acl

$ACE = New-Object System.Security.AccessControl.FileSystemAccessRule `
("NT VIRTUAL MACHINE\23F541D5-B0EA-490E-8FFB-A1C6AC233262","FullControl","ContainerInherit,ObjectInherit","None","Allow")

$ACL = Get-Acl "E:\CopyTestMachine"
$ACL.SetAccessRule($ACE)
$ACL | Set-Acl

W ten oto sposób maszyna wirtualna została ręcznie dołączona do usługi Hyper-V. W przypadku gdy następuje zmiana ścieżek dostępu do plików maszyny wirtualnej konieczne jest jeszcze prze edytowanie konfiguracji takiej maszyny tak aby wszystkie ścieżki dostępu były zgodne z nową lokalizacją.

Nie jest to metoda zalecana, a tym bardziej nie jest wspierana przez Microsoft, ale w sytuacjach kryzysowych gdy mamy jeszcze możliwość awaryjnego skopiowania samych plików maszyn wirtualnych pozwala na uratowanie sytuacji.

Źródła:
http://blogs.msdn.com/b/robertvi/archive/2008/12/19/howto-manually-add-a-vm-configuration-to-hyper-v.aspx
http://blogs.technet.com/b/carlh/archive/2010/12/15/script-to-recover-a-hyper-v-guest.aspx

Advertisements

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s