Hyper-Vの新機能WMI provider (V2)

Hyper-Vの新機能について紹介

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に関してはこれまでと同じものが利用できます。

以上、簡単ですがポイントとなる部分だけ解説させていただきました。

コード自体の構文はあまり変わらないものの、メソッドの名前や、同じようなメソッドでも引数となるオブジェクト自体が変更されているなど、様々です。今後もできるだけサンプルを交えて解説してゆきたいと思います。

*本文中に記載されている会社名および商品名・サービス名は、各社の商標 または登録商標です。

著書の紹介欄

Hyper-Vで本格的なサーバー仮想環境を構築。仮想環境を設定・操作できる!

できるPRO Windows Server 2016 Hyper-V

◇Hyper-Vのさまざまな機能がわかる ◇インストールからの操作手順を解説 ◇チェックポイントやレプリカも活用できる Windows Server 2016 Hyper-Vは、仮想化ソフトウェア基盤を提供する機能であり、クラウドの実現に不可欠のものです。 本書では、仮想化の基礎知識から、Hyper-Vでの仮想マシンや仮想スイッチの設定・操作、プライベートクラウドの構築、Azureとの連携などを解説します。

初めてのWindows Azure Pack本が発売

Windows Azure Pack プライベートクラウド構築ガイド

本書は、Windows Azure PackとHyper-Vを利用し、企業内IaaS(仮想マシン提供サービス)を構成するための、IT管理者に向けた手引書です。試用したサーバーは、最小限度の物理サーバーと仮想マシンで構成しています。Windows Azure Packに必要なコンポーネントのダウンロード、実際にプライベートクラウド構築する過程を、手順を追って解説しています。これからプライベートクラウドの構築を検討するうえで、作業負担の軽減に役立つ一冊です。

ブログの著者欄

樋口 勝一

GMOインターネット株式会社

1999年6月GMOインターネットに入社。Windows Serverをプラットフォームとしたサービス開発から運用・保守まで幅広く担当。講演登壇や出版、ネット記事連載などでマイクロソフト社と強い信頼関係を構築。2007年より「マイクロソフトMVPアワード」を受賞し、インターネットソリューションのスペシャリストとして活躍。

関連記事