TechReport

技術者情報

ソリューション

2012年2月22日(水)公開

第76回

Hyper-Vを使ったクラウドサービスの作り方 Vol.6

Hyper-V Provisioning IDEハードディスクの追加

GMOインターネット株式会社 システム本部 樋口 勝一が担当するGMO最新ネット業界レポート-ソリューション編。5回に渡って特集してきた『Hyper-Vを使ったクラウドサービスの作り方』、Vol.6となる今回は『Hyper-V Provisioning IDEハードディスクの追加』について。

記事INDEX

Hyper-V Provisioning IDEハードディスクの追加

『Hyper-Vを使ったクラウドサービスの作り方』完成までもう一息となりました。


今回はハードディスクの追加について解説します。


前回のネットワークアダプタの追加同様、若干難易度の高いコードとなりますが、こちらもある程度パターンに副っていると思ってもらえればよいと思います。 (参照:コード01)


[ コード01 ]
   1:  Function SetIDEHardDisk(ByVal objManagementScope As ManagementScope, 
 ByVal strVMName As String, ByVal strDiskPath As String) As Boolean
   2:  Dim objComputerSystem As ManagementObject = Nothing
   3:  For Each objManagementObject As ManagementObject In New
 ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * 
 FROM Msvm_ComputerSystem WHERE ElementName = '" & strVMName & "'")).Get
   4:  objComputerSystem = objManagementObject
   5:  Next
   6:   
   7:  Dim objDiskDrive As ManagementObject = Nothing
   8:  For Each objResourcePool As ManagementObject In New 
 ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * 
 FROM Msvm_ResourcePool WHERE ResourceType = 22 AND ResourceSubType = 
 'Microsoft Synthetic Disk Drive' AND OtherResourceType = null")).Get
   9:  Dim 
 objAllocationCapabilitiesCollection As ManagementObjectCollection =
 objResourcePool.GetRelated("Msvm_AllocationCapabilities")
  10:  For Each objAllocationCapabilities As ManagementObject In
 objAllocationCapabilitiesCollection
  11:  Dim objSettingsDefineCapabilitiesCollection As ManagementObjectCollection 
 = objAllocationCapabilities.GetRelationships
 ("Msvm_SettingsDefineCapabilities")
  12:  For Each objSettingsDefineCapabilities As ManagementObject In
 objSettingsDefineCapabilitiesCollection
  13:  If objSettingsDefineCapabilities("ValueRole") = 0 Then
  14:  objDiskDrive = New"PartComponent").ToString())
  15:  objDiskDrive.Scope = objManagementScope
  16:  End If
  17:  Next
  18:  Next
  19:  Next
  20:   
  21:  Dim objIDEController As ManagementObject = Nothing
  22:  For Each objManagementObject As ManagementObject In New
 ManagementObjectSearcher(objManagementScope, New ObjectQuery
 ("SELECT * FROM Msvm_ResourceAllocationSettingData WHERE ResourceType =
 5 AND ResourceSubType = 'Microsoft Emulated IDE Controller' AND
 Address = '0'")).Get
  23:  objIDEController = objManagementObject
  24:  objDiskDrive("Parent") = objIDEController.Path.Path
  25:  objDiskDrive("Address") = 0
  26:  Next
  27:   
  28:  For Each objVirtualSystemManagementService As ManagementObject In New
 ManagementObjectSearcher(objManagementScope, New ObjectQuery
 ("SELECT * FROM Msvm_VirtualSystemManagementService")).Get
  29:  Dim objParams As ManagementBaseObject =
 objVirtualSystemManagementService.GetMethodParameters
 ("AddVirtualSystemResources")
  30:  Dim strResourceSettingData As String() = New String(0) {}
  31:  strResourceSettingData(0) = objDiskDrive.GetText(TextFormat.CimDtd20)
  32:  objParams("ResourceSettingData") = strResourceSettingData
  33:  objParams("TargetSystem") = objComputerSystem.Path.Path
  34:  Dim objManagementBaseObject As ManagementBaseObject =
 objVirtualSystemManagementService.InvokeMethod
 ("AddVirtualSystemResources", objParams, Nothing)
  35:  Next
  36:   
  37:  Dim objHardDisk As ManagementObject = Nothing
  38:  For Each objResourcePool As ManagementObject In New
 ManagementObjectSearcher(objManagementScope, New ObjectQuery
 ("SELECT * FROM Msvm_ResourcePool WHERE ResourceType = 21 
 AND ResourceSubType = 'Microsoft Virtual Hard Disk' AND OtherResourceType 
 = null")).Get
  39:  Dim objAllocationCapabilitiesCollection As ManagementObjectCollection
 = objResourcePool.GetRelated("Msvm_AllocationCapabilities")
  40:  For Each objAllocationCapabilities As ManagementObject In
 objAllocationCapabilitiesCollection
  41:  Dim objSettingsDefineCapabilitiesCollection As
 ManagementObjectCollection = objAllocationCapabilities.GetRelationships
 ("Msvm_SettingsDefineCapabilities")
  42:  For Each objSettingsDefineCapabilities As ManagementObject In
 objSettingsDefineCapabilitiesCollection
  43:  If objSettingsDefineCapabilities("ValueRole") = 0 Then
  44:  objHardDisk = New ManagementObject(objSettingsDefineCapabilities
 ("PartComponent").ToString())
  45:  objHardDisk.Scope = objManagementScope
  46:  End If
  47:  Next
  48:  Next
  49:  Next
  50:   
  51:  Dim objIDEDrive As ManagementObject = Nothing
  52:  For Each objManagementObject As ManagementObject In New
 ManagementObjectSearcher(objManagementScope, New ObjectQuery
 ("SELECT * FROM Msvm_ResourceAllocationSettingData WHERE Parent = '"
 & objIDEController.Path.Path.Replace
 ("\", "\\") & "' AND Address = '0'")).Get
  53:  objIDEDrive = objManagementObject
  54:  objHardDisk("Parent") = objIDEDrive.Path.Path
  55:  objHardDisk("Connection") = New String(0) {strDiskPath}
  56:  Next
  57:   
  58:  For Each objVirtualSystemManagementService As ManagementObject In New
 ManagementObjectSearcher(objManagementScope, New ObjectQuery
 ("SELECT * FROM Msvm_VirtualSystemManagementService")).Get
  59:  Dim objParams As ManagementBaseObject =

 objVirtualSystemManagementService.GetMethodParameters

 ("AddVirtualSystemResources")
  60:  Dim strResourceSettingData As String() = New String(0) {}
  61:  strResourceSettingData(0) = objHardDisk.GetText(TextFormat.CimDtd20)
  62:  objParams("ResourceSettingData") = strResourceSettingData
  63:  objParams("TargetSystem") = objComputerSystem.Path.Path
  64:  Dim objManagementBaseObject As ManagementBaseObject =

 objVirtualSystemManagementService.InvokeMethod

 ("AddVirtualSystemResources", objParams, Nothing)
  65:  Return JobComplete(objManagementBaseObject, objManagementScope)
  66:  Next
  67:  End Function


1行目:


引数として、ManagementScope オブジェクト、仮想マシン名、ハードディスクとして接続するvhdのファイルパスを渡します。

2~5行目:


仮想マシン名をキーにして、WMIクエリにてメモリ設定を行なう仮想マシンオブジェクトを取得します。


ここまでは前回までと同様のパターンとなります。



さて、ここからはハードディスク関連のオブジェクトの取り扱いになります。 IDEハードディスクの追加の手順としては、ディスクドライブオブジェトを作成し、IDEコントローラーに接続、次にvhdファイルパスを指定してハードディスクオブジェクトを作成します。最後に、ハードディスクオブジェクトを、ディスクドライブオブジェクトに接続する、という手順になります。

7行目:


まずはディスクドライブオブジェクトを作成します。

8行目:


ディスクドライブオブジェクトを作成する場合は、Hyper-Vのリソース一覧にあるオブジェクトを呼び出し、各パラメーターを設定して作成していきます。



Msvm_ResourcePoolクラスには仮想マシンに追加することができるリソースが格納されています。


Msvm_ResourcePoolクラスから、ResourceType = 22(Disk)、


ResourceSubType = Microsoft Synthetic Disk Drive、


OtherResourceType = null という内容でSQL文でフィルタします。


ResourceTypeについては、こちらに一覧があります。

9~19行目


Msvm_AllocationCapabilities オブジェクト(Msvm_AllocationCapabilities)、Msvm_SettingsDefineCapabilitiesオブジェクトを利用してディスクドライブオブジェクトを取得していきますが、ネットワークアダプタの追加のときと同様、この部分のコードは解説自体が非常に困難なものとなりますので、ほぼ決まり文句といった感じでこのまま利用することになります。

21行目:


ディスクドライブオブジェクトを接続するIDEコントローラーを取得します。IDEコントローラーは仮想マシンの骨組みが作成された時点で自動的に追加されていますので、改めて作成、追加する必要はありません。

22行目:


すでに作成、追加されている仮想マシンのオブジェクトはMsvm_ResourceAllocationSettingDataオブジェクトの中に格納されていますので、ResourceType = 5(IDE Controller)、ResourceSubType = Microsoft Emulated IDE Controller、


Address = 0という内容のSQL文でフィルタします。


Address = 0というのは、IDEコントローラーの番号となります。


今回はIDEコントローラーの0番にディスクドライブオブジェクトを接続します。

23~26行目:


先ほど作成したディスクドライブオブジェクトをIDEコントローラーに接続するように指定します。

28行目:


仮想マシン作成時同様に、Msvm_VirtualSystemManagementService クラスを使用して、ディスクドライブを追加していきます。Msvm_VirtualSystemManagementServiceクラスのオブジェクトの中の一つをFor~Next文で取り出します。

29行目:


AddVirtualSystemResourcesメソッドを使用して、各パラメータを設定します。

30~32行目:


ディスクドライブオブジェクトのXML化した設定情報を、ResourceSettingDataパラメーターに入力します。

33行目:


ComputerSystemパラメーターには、ディスクドライブオブジェクトを追加する仮想マシンを格納したMsvm_ComputerSystemオブジェクトを指定します。

34行目:


AddVirtualSystemResourcesメソッドを、入力したパラメーターの内容で実行します。

38行目:


ハードディスクオブジェクトを作成する場合は、Hyper-Vのリソース一覧にあるオブジェクトを呼び出し、各パラメーターを設定して作成していきます。


Msvm_ResourcePoolクラスには仮想マシンに追加することができるリソースが格納されています。


Msvm_ResourcePoolクラスから、ResourceType = 21(Storage Extent)、


ResourceSubType = Microsoft Virtual Hard Disk、OtherResourceType = null という内容のSQL文でフィルタします。


ResourceTypeについては、こちらに一覧があります。

39~49行目:


Msvm_AllocationCapabilities オブジェクト(Msvm_AllocationCapabilities)、Msvm_SettingsDefineCapabilitiesオブジェクトを利用してディスクドライブオブジェクトを取得していきます。ディスクドライブの作成のときと同様、この部分のコードは解説自体が非常に困難なものとなりますので、ほぼ決まり文句といった感じでこのまま利用することになります。 先ほど作成して、追加したディスクドライブオブジェクトを呼び出して、作成したハードディスクオブジェクトを接続します。

51行目:


ディスクドライブオブジェクトを格納する変数を定義します。

52行目:


前述のMsvm_ResourceAllocationSettingDataを利用して、IDEコントローラーの0番に接続されたディスクドライブオブジェクトを抽出します。

54行目:


追加するハードディスクは、先ほど作成したディスクドライブオブジェクトに接続します。

55行目:


追加するハードディスクで使用するvhdファイルのパスを指定します。

58行目:


ディスクドライブオブジェクトを作成したときと同様に、Msvm_VirtualSystemManagementService クラスを使用して、ディスクドライブを追加していきます。Msvm_VirtualSystemManagementServiceクラスのオブジェクトの中の一つをFor~Next文で取り出します。

59~66行目:


AddVirtualSystemResourcesメソッドを使用して追加します。ここからもほぼ定型文のようになっていますので、同様にパラメータを設定していきます。



以上で、エラーが出ること無くコードが走れば、Hyper-V上の仮想マシンにIDEコントローラー0番に接続されたハードディスクが追加されています。





今回でひととおり、仮想マシンのブロビジョニングが完了したことになります。


このほかにもWMI経由では、DVDドライブの追加や、ISOイメージファイルのマウント、VLANIDの設定など、仮想マシンに対して様々なことが設定可能となっています。その他細かい設定も順次ご紹介していく予定ですので、ご期待ください。




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

樋口 勝一

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

1999年6月GMOインターネットに入社。Windowsを用いたホスティング事業の立ち上げの際、サービス開発からその後の保守・運用まで1人で担当。2010年には「お名前.comWindowsデスクトップ」をリリースし、マイクロソフト社と強い信頼関係を構築。2007年から連続で「マイクロソフトMVPアワード」を受賞し、Windowsのスペシャリストとして活躍。

執筆者一覧

 マイクロソフト社の導入事例でご紹介いただきました

 当レポートを担当している樋口 勝一のインタビューをマイクロソフト社のウェブサイトでご紹介いただきました。
Dynamic Memory   Hyper-V を活用したクラウド環境を活用して、
システム停止が許されない仮想デスクトップ サービスを提供。
FX ユーザーなどから「安定稼働」に高い評価を獲得


FX ユーザーをメイン ターゲットとしたリモート デスクトップ サービス「お名前.com Windows デスクトップ」クラウド環境構築のために採用した仮想化技術が、Windows Server 2008 R2 SP1 Hyper-V



 執筆協力した本が出版されました

 樋口 勝一が執筆協力をした書籍が出版されました。

Dynamic Memory   最新!Android徹底活用読本

出版社:宝島社
価格:880円(税込) ※価格は店舗によって異なります。

次々に発売されるAndroidケータイを「コミュニケーションしたい」「情報をブラウジングしたい」「ビジネス手帳の代わりにしたい」「音楽や動画を120%楽しみたい」など、やりたいこと別に章立てした活用書。


Dynamic Memory   GALAXY Sユーザーのためのアプリ245

出版社:三才ブックス
価格:1,260円(税込) ※価格は店舗によって異なります。

25万本以上あるといわれるAndroidアプリの中から、目的別・状況別に本当に使えるアプリだけを厳選。

Dynamic Memory
 
ソニー・エリクソン公式 Xperia arc ガイドブック


出版社:日経BP社
価格:1,260円(税込) ※価格は店舗によって異なります。

こだわりのデザインと薄さを追求しながら、Androidスマートフォンのフラッグシップモデルとして世界に先駆けて日本で発売されるXperia arcの公式ガイドブックです。