GMOインターネット株式会社 システム本部 樋口 勝一が担当するGMO最新ネット業界レポート-ソリューション編。今回はWindows Server 2012のリリースに合わせて新しくなった、Hyper-Vの新機能「root\virtualization\v2」名前空間について紹介します。
Hyper-Vの新機能
Windows Server 2012のリリースと合わせて、Hyper-Vも新機能を搭載して新しくなりました。 これに伴い、これまで利用してきたWMI の「root\virtualization」という名前空間とは別に、「root\virtualization\v2」というものが追加され、機能強化や設定変更が行われています。
> Hyper-V WMI Provider
> Hyper-V WMI provider (V2)
新しいHyper-Vでもroot\virtualization名前空間は利用できますが、マイクロソフトとして推奨しないということになり、今後はroot\virtualization\v2を利用するようにとのことです。
>削除された機能または推奨されなくなった機能
こういった事情もあり、今回からは新しく追加されたroot\virtualization\v2の詳細をいくつか解説してみたいと思います。
Power Shellはネットでもいくつかサンプルが出ていると思いますが、せっかくのGMO最新ネット業界レポートなので、「.Net」でいってみたいと思います。
root\virtualization名前空間とroot \virtualization\v2名前空間の比較
root\virtualization名前空間と、root\virtualization\v2名前空間を簡単に比較してみましょう。
Hyper-Vに対してVMを作成したり、変更、削除などするには、VirtualSystemManagementServiceクラス内のメソッドを利用します。root\virtualization名前空間のメソッド一覧と、root\virtualization\v2名前空間のメソッド一覧を見比べてみても、その内容がかなり変更されていることがわかると思います。
> root\virtualization名前空間のメソッド一覧
> root\virtualization\v2名前空間のメソッド一覧
root\virtualization\v2名前空間のメソッドは、一見しただけではどんな機能を提供するのか分からないようなものも結構ありますね。
まずは基本的なところから。以前ご紹介したのはroot\virtualization名前空間を利用したVMの作成方法です。
> Hyper-Vを使ったクラウドサービスの作り方 Vol.3
こちらをroot\virtualization\v2を利用したバージョンにアップグレードしてみましょう。 今回はわかりやすいように、root\virtualizationとroot\virtualization\v2それぞれの名前空間での利用方法を比べながら説明していきます。
root\virtualizationでは「DefineVirtualSystem」というメソッドが、root\virtualization\v2では「DefineSystem」というメソッド名に変更されています。
> DefineVirtualSystem
> DefineSystem
DefineVirtualSystemメソッドとDefineSystemメソッドの違い
DefineVirtualSystemメソッド
uint32 DefineVirtualSystem(( [in] string SystemSettingData, [in] string ResourceSettingData[], [in] CIM_VirtualSystemSettingData REF SourceSetting, [out] CIM_ComputerSystem REF DefinedSystem, [out] CIM_ConcreteJob REF Job);
DefineSystemメソッド
uint32 DefineSystem( [in] string SystemSettings, [in] string ResourceSettings[], [in] CIM_VirtualSystemSettingData REF ReferenceConfiguration, [out] CIM_ComputerSystem REF ResultingSystem, [in, out] CIM_ConcreteJob REF Job);
DefineSystemメソッドでVMの骨組みだけを作るのであれば、「SystemSettings」の引数に、VMの名前とVMのフォルダパスを与えるだけで、VMを作ることができます。
root\virtualization のDefineVirtualSystemメソッドでは、「System Setting Data」引数に該当しますが、この引数の型が「Msvm_VirtualSystemGlobal Setting Dataクラス」だったのに対して、「DefineSystem」メソッドの「SystemSettings」引数の型は、「Msvm_VirtualSystemSettingDataクラス」と、それぞれの引数の型も内容も大きく変わっているので注意が必要です。
> Msvm_VirtualSystemGlobal Setting Dataクラス
> Msvm_VirtualSystemSettingDataクラス
では実際のコードの紹介です。
root\virtualization名前空間を利用したサンプルコードは以前紹介したものと同じものとなります。比較のために今回掲載しておきます。
> Hyper-Vを使ったクラウドサービスの作り方 Vol.3
サンプルコードをこちらからダウンロードいただけます。 → GMOReport.zip(23KB)
root\virtualization名前空間 DefineVirtualSystem メソッドサンプル
1: Imports System.Management
2:
3: Module Module1
4: Sub Main()
5: Dim strUser As String = ""
6: Dim strPass As String = ""
7: Dim objManagementScope As ManagementScope = ConnectManagementScope("win2008r2.local", strUser, strPass)
8: Call DefineVM(objManagementScope, "VM01", "D:\Hyper-V\VM01")
9: End Sub
10:
11: Function ConnectManagementScope(ByVal strServer As String, ByVal strAccount As String, ByVal strPassword As String) As ManagementScope
12: Dim objConnectionOptions As New ConnectionOptions()
13: objConnectionOptions.Impersonation = ImpersonationLevel.Impersonate 'WMI への接続に使用される偽装レベルを設定
14: objConnectionOptions.EnablePrivileges = True 'WNI経由の操作のためにユーザー特権を有効にする
15: objConnectionOptions.Username = strAccount
16: objConnectionOptions.Password = strPassword
17: Dim objManagementScope As New ManagementScope("\\" + strServer + "\root\virtualization", objConnectionOptions)
18: objManagementScope.Connect()
19: Return (objManagementScope)
20: End Function
21:
22: Function DefineVM(ByVal objManagementScope As ManagementScope, ByVal strVMName As String, ByVal strFolderPath As String) As Boolean
23: Dim objVirtualSystemGlobalsettingData As New ManagementClass(objManagementScope, New ManagementPath("Msvm_VirtualSystemGlobalsettingData"), Nothing)
24: Dim objVirtualSystemGlobalsettingDataInstance As ManagementObject = objVirtualSystemGlobalsettingData.CreateInstance
25: objVirtualSystemGlobalsettingDataInstance("ElementName") = strVMName
26: objVirtualSystemGlobalsettingDataInstance("ExternalDataRoot") = strFolderPath
27: Dim strSystemsettingData As String = objVirtualSystemGlobalsettingDataInstance.GetText(TextFormat.CimDtd20)
28:
29: For Each objVirtualSystemManagementService As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_VirtualSystemManagementService")).Get
30: Dim objParams As ManagementBaseObject = objVirtualSystemManagementService.GetMethodParameters("DefineVirtualSystem")
31: objParams("SystemsettingData") = strSystemsettingData
32: objParams("ResourceSettingData") = Nothing
33: objParams("SourceSetting") = Nothing
34: Dim objManagementBaseObject As ManagementBaseObject = objVirtualSystemManagementService.InvokeMethod("DefineVirtualSystem", objParams, Nothing)
35: Return JobComplete(objManagementBaseObject, objManagementScope)
36: Next
37: End Function
38:
39: Function JobComplete(ByVal objManagementBaseObject As ManagementBaseObject, ByVal objManagementScope As ManagementScope) As Boolean
40: 'JobState New = 2 Starting = 3 Running = 4 Suspended = 5 ShuttingDown = 6 Completed = 7 Terminated = 8 Killed = 9 Exception = 10 Service = 11
41: If objManagementBaseObject("ReturnValue") <> 0 Then
42: Dim strJobPath As String = objManagementBaseObject("Job")
43: Dim objJob As New ManagementObject(objManagementScope, New ManagementPath(strJobPath), Nothing)
44: objJob.Get()
45: Do While objJob("JobState") = 3 Or objJob("JobState") = 4
46: System.Threading.Thread.Sleep(1000)
47: objJob.Get()
48: Loop
49: If objJob("JobState") <> 7 Then
50: Console.WriteLine("ErrorCode=" & objJob("ErrorCode") & " JobState=" & objJob("JobState"))
51: Return False
52: Else
53: Return True
54: End If
55: Else
56: Return True
57: End If
58: End Function
59: End Module
root\virtualization\v2名前空間 DefineSystemメソッドサンプル
1: Imports System.Management
2:
3: Module Module1
4: Sub Main()
5: Dim strUser As String = ""
6: Dim strPass As String = ""
7: Dim objManagementScope As ManagementScope = ConnectManagementScope("winsvr2012.local", strUser, strPass)
8: Call DefineVM(objManagementScope, "VM01", "D:\Hyper-V\VM01")
9: End Sub
10:
11: Function ConnectManagementScope(ByVal strServer As String, ByVal strAccount As String, ByVal strPassword As String) As ManagementScope
12: Dim objConnectionOptions As New ConnectionOptions()
13: objConnectionOptions.Impersonation = ImpersonationLevel.Impersonate 'WMI への接続に使用される偽装レベルを設定
14: objConnectionOptions.EnablePrivileges = True 'WNI経由の操作のためにユーザー特権を有効にする
15: objConnectionOptions.Username = strAccount
16: objConnectionOptions.Password = strPassword
17: Dim objManagementScope As New ManagementScope("\\" + strServer + "\root\virtualization\v2", objConnectionOptions)
18: objManagementScope.Connect()
19: Return (objManagementScope)
20: End Function
21:
22: Function DefineVM(ByVal objManagementScope As ManagementScope, ByVal strVMName As String, ByVal strFolderPath As String) As Boolean
23: Dim objVirtualSystemSettingData As New ManagementClass(objManagementScope, New ManagementPath("Msvm_VirtualSystemSettingData"), Nothing)
24: Dim objVirtualSystemSettingDataInstance As ManagementObject = objVirtualSystemSettingData.CreateInstance
25: objVirtualSystemSettingDataInstance("ElementName") = strVMName
26: objVirtualSystemSettingDataInstance("ConfigurationDataRoot") = strFolderPath
27: Dim strSystemsettingData As String = objVirtualSystemSettingDataInstance.GetText(TextFormat.CimDtd20)
28:
29: For Each objVirtualSystemManagementService As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_VirtualSystemManagementService")).Get
30: Dim objParams As ManagementBaseObject = objVirtualSystemManagementService.GetMethodParameters("DefineSystem")
31: objParams("SystemSettings") = strSystemsettingData
32: objParams("ResourceSettings") = Nothing
33: objParams("ReferenceConfiguration") = Nothing
34: Dim objManagementBaseObject As ManagementBaseObject = objVirtualSystemManagementService.InvokeMethod("DefineSystem", objParams, Nothing)
35: Return JobComplete(objManagementBaseObject, objManagementScope)
36: Next
37: End Function
38:
39: Function JobComplete(ByVal objManagementBaseObject As ManagementBaseObject, ByVal objManagementScope As ManagementScope) As Boolean
40: 'JobState New = 2 Starting = 3 Running = 4 Suspended = 5 ShuttingDown = 6 Completed = 7 Terminated = 8 Killed = 9 Exception = 10 Service = 11
41: If objManagementBaseObject("ReturnValue") <> 0 Then
42: Dim strJobPath As String = objManagementBaseObject("Job")
43: Dim objJob As New ManagementObject(objManagementScope, New ManagementPath(strJobPath), Nothing)
44: objJob.Get()
45: Do While objJob("JobState") = 3 Or objJob("JobState") = 4
46: System.Threading.Thread.Sleep(1000)
47: objJob.Get()
48: Loop
49: If objJob("JobState") <> 7 Then
50: Console.WriteLine("ErrorCode=" & objJob("ErrorCode") & " JobState=" & objJob("JobState"))
51: Return False
52: Else
53: Return True
54: End If
55: Else
56: Return True
57: End If
58: End Function
59: End Module
コードの構成自体はほぼ似たようなものとなっています。具体的なコードの解説はこちらを参考にしてもらい、変更された箇所のポイントに絞って解説します。
17行目:肝心の名前空間です。root\virtualization\v2 を指定します。23行目:31行目に指定する引数「SystemSettings」の型が「Msvm_VirtualSystemSettingDataクラス」に変更されているので注意を。25-26行目:VM作成のために最低限の情報、VM名と保存先フォルダを指定します。30-34行目:メソッド名が「DefineSystem」となり、引数名もそれぞれ変更されています。35行目:JobCompleteに関してはこれまでと同じものが利用できます。
以上、簡単ですがポイントとなる部分だけ解説させていただきました。
コード自体の構文はあまり変わらないものの、メソッドの名前や、同じようなメソッドでも引数となるオブジェクト自体が変更されているなど、様々です。今後もできるだけサンプルを交えて解説してゆきたいと思います。
*本文中に記載されている会社名および商品名・サービス名は、各社の商標 または登録商標です。