Hyper-V 2.0仮想マシンのスナップショットをPowerShellから復元する

 
2月も半ばになりましたね。
1月に2010年の目標を 立てよう!と意気込んでから、はや1ヶ月。
何の目標もないままに、時間だけがただ経過しています。。
 
 
Windows Server 2008 R2で提供されるHyper-Vは、
2.0というバージョンが割り当てられ、いくつかの変更がなされていますね。
大きな変更点は色々なところで紹介されているでしょうから、そちらを参照していただくこととして、
ここでは、スクリプト処理でHyper-Vの管理する場合の変更点について紹介したいと思います。
 
Hyper-Vには、rootVirtualizationというWMIの名前空間をあり、
スクリプトでHyper-Vの管理を行うときにはWMIを使います。
WMIとくれば、、そう、PowerShellを使わないわけにはいかないですね!
 
Hyper-V2.0で新しくサポートされるWMIクラス等については
■What’s new in Hyper-V
で紹介されています。
 
今日は、この中から
「仮想マシンのスナップショットをPowerShellから復元する方法」を紹介します。
基本は次の3ステップを実行していただくだけで結構です。
全部まとめてスクリプト処理したい方はステップ1からステップ3までのスクリプトを
1つのファイルにしてしまえば、一度に処理ができます。
では、見てみましょう。 
 
■ステップ1:スナップショットの復元を行う仮想マシンの情報を取得する
仮想マシンの情報は、Msvm_ComputerSystemクラスから取得することができます。
クラスの情報をそのまま取得しようとすると、すべての仮想マシンの情報を取得してしまうので、
Where-Objectコマンドレットを使って、該当する仮想マシンの情報だけを取得します。
(赤字部分に仮想マシンの名前が入ります)
 


PS C:>$VMName = "dc01"
PS C:> $VM = Get-WmiObject -Namespace rootVirtualization -Class Msvm_ComputerSystem | Where-Object {$_.ElementName -eq $VMName}

 
これで、仮想マシンの情報が$VM変数に入りました。
 
■ステップ2:スナップショットの名前を取得する
スナップショットの情報は、Msvm_VirtualSystemSettingDataクラスから取得することができます。
Msvm_VirtualSystemSettingDataクラスから取得できるのは、すべての仮想マシンの、すべてのスナップショットと
すべての現在のマシンの情報になるので、特定の仮想マシンの、特定のスナップショットだけが取得できるよう、
Where-Objectコマンドレットで絞り込みましょう。
(赤字部分に復元するスナップショットの名前が入ります)
 


PS C:>$SnapshotName = "dc01 – (2010/01/01 – 00:00:00)"
PS C:> $Snapshot = Get-WmiObject -Namespace rootVirtualization -Class Msvm_VirtualSystemSettingData | Where-Object {$_.SystemName -eq $VM.Name -and $_.SettingType -eq 5 -and $_.ElementName -eq $SnapshotName}

 
上のスクリプトでは、Msvm_VirtualSystemSettingDataクラスから取得できる情報から、
SystemName属性がスナップショットを復元したい仮想マシンのID($VM変数のName属性から取得できます)、
SettingType属性がスナップショットを表すもの(SettingTypeの値が5のものがスナップショットです) 
ElementName属性が復元したいスナップショットのもの($SnapshotNameにセットした名前です)
の条件にあう情報を取り出し、$Snapshot変数にセットしました。
 
 
■ステップ3:スナップショットを復元する
スナップショットの復元は、Msvm_VirtualSystemManagementServiceクラスの
ApplyVirtualSystemSnapshotExメソッドを使います。
(このメソッドがWindows Server 2008 R2で新しくサポートされた機能です)
 
ApplyVirtualSystemSnapshotExメソッドのパラメータにはステップ1、ステップ2で取得した情報を使います。
 


PS C:> $VSMS = Get-WmiObject -Namespace rootVirtualization -Class Msvm_VirtualSystemManagementService
PS C:> $VSMS.ApplyVirtualSystemSnapshotEx($VM,$Snapshot)

 
復元できたことは、Msvm_ConcreteJobクラスのErrorCodeプロパティで確認できます。
 


PS C:> (Get-WmiObject -Namespace rootVirtualization -Class Msvm_ConcreteJob).ErrorCode
0

 
値が0なら、復元は成功です。
その他の値の場合は、MSDNのサイトでエラーの内容を確認してください。
 
■ApplyVirtualSystemSnapshotEx Method of the Msvm_VirtualSystemManagementService Class
 
 
ここまで、仮想マシンのスナップショットをPowerShellから復元する方法を紹介しましたが、
スナップショットの一覧の参照や、スナップショットの取得、
さらに、Hyper-Vでよく使うWMIクラスについては、 
ソフトバンククリエイティブさんから発売されている書籍
PowerShellによるWindowsサーバ管理術」の中で
スナップショットの一覧表示・作成方法から、仮想マシンの起動/停止、CPUリソースの変更まで
色々と書かせていただきました。
 
SCVMMに頼らずに、スクリプトでHyper-Vの管理を行いたい!という方は
ご覧になってみてください。