TechReport

技術者情報

ソリューション

2012年5月30日(水)公開

第85回

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

Hyper-V Provisioning DVDドライブの追加とISOイメージのマウント方法

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

記事INDEX

追加装備の一つDVDドライブのプロビジョニング方法

これまで連載でご紹介してきた、「Hyper-Vを使ったクラウドサービスの作り方」ですが、今回でひとまず一 区切りということになります。 今回は追加装備の一つDVDドライブのプロビジョニング方法をご紹介します。 DVDドライブが追加された後は、そこにISOイメージをマウントしたり、アンマウントしたり、というところまでご紹介したいと思います。

DVDドライブの追加方法

すでにIDEコントローラーは仮想マシンに実装されていますので、DVDドライブの追加はこれまでのIDEやSCSIハードディスクを追加するときほど複雑ではありませんのでご安心ください。


手順としては、DVDドライブを作成して、IDEコントローラーに接続するだけ。そこにISOイメージをマウ


ントしたり、アンマウントしたりといった操作を行なうことになります。



   1:  Function SetDVD(ByVal objManagementScope As ManagementScope, ByVal strVMName 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 objDVD As ManagementObject = Nothing
   8:  For Each objResourcePool As ManagementObject In New  ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_ResourcePool WHERE ResourceType=16 and  ResourceSubType='Microsoft Synthetic DVD 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_SettingsDefine Capabilities")
  12:  For Each  objSettingsDefineCapabilities As ManagementObject In  objSettingsDefineCapabilitiesCollection
  13:  If objSettingsDefineCapabilities("ValueRole") = 0 Then
  14:  objDVD = New ManagementObject(objSettingsDefineCapabilities("PartComponent"). ToString())
  15:  objDVD.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 =
 '1'")).Get
  23:  objIDEController = objManagementObject
  24:  objDVD("Parent") = objIDEController.Path.Path
  25:  objDVD("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("AddVirtualSystem
 Resources")
  30:  Dim strResourceSettingData As String() = New String(0) {}
  31:  strResourceSettingData(0) = objDVD.GetText(TextFormat.CimDtd20)
  32:  objParams("ResourceSettingData") = strResourceSettingData
  33:  objParams("TargetSystem") = objComputerSystem.Path.Path
  34:  Dim objManagementBaseObject As ManagementBaseObject = objVirtualSystemManagementService.InvokeMethod("AddVirtualSystem Resources", objParams, Nothing)
  35:  Return JobComplete(objManagementBaseObject, objManagementScope)
  36:  Next
  37:  End Function
]

1行目:


引数として、ManagementScope オブジェクト、仮想マシン名を渡します。



2~5行目:


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



6行目:


DVDドライブのオブジェクトは


Msvm_ResourceAllocationSettingDataの中に格納されていますので、ResourceType =16(DVD drive)、ResourceSubType = Microsoft Synthetic DVD Driveといった内容でSQL文でフィルタします。



7行目:


DVDドライブオブジェクトを作成します。



8~19行目:


Msvm_AllocationCapabilities オブジェクト(Msvm_AllocationCapabilities)、Msvm_SettingsDefineCapabilitiesオブジェクトを利用してディスクドライブオブジェクトを取得していきます。


ほぼ決まり文句といった感じでこのまま利用することになります。



21~26行目:


DVDドライブはIDEコントローラーに接続するので、すでに実装されているIDEコントローラーを取得します。ここではIDEコントローラー1の0番に接続します。



28行目:


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



29行目:


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



30~32行目:


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



33行目:


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



34行目:


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



35行目:


JobCompleteを実行してエラーがなければ、Hyper-V上の仮想マシンにIDEコントローラー1の0番に接続されたDVDドライブが追加されています。




ISOイメージのマウント方法

次に追加したDVDドライブにISOイメージをマウント、アンマウントしてみたいと思います。


まずはISOイメージのマウントから。

   1:  Function MountISO(ByVal objManagementScope As ManagementScope,  ByVal strVMName As String, ByVal strIsoPath 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 objISO As ManagementObject = Nothing
   8:  For Each objResourcePool As ManagementObject In New ManagementObjectSearcher(objManagementScope, New 
 ObjectQuery("SELECT * FROM Msvm_ResourcePool WHERE ResourceType =  21 AND ResourceSubType = 'Microsoft Virtual CD/DVD Disk' 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_SettingsDefine Capabilities")
  12:  For Each objSettingsDefineCapabilities As ManagementObject In  objSettingsDefineCapabilitiesCollection
  13:  If objSettingsDefineCapabilities("ValueRole") = 0 Then
  14:  objISO = New  ManagementObject(objSettingsDefineCapabilities("PartComponent").ToSt ring())
  15:  objISO.Scope = objManagementScope
  16:  End If
  17:  Next
  18:  Next
  19:  Next
  20:   
  21:  Dim objIDEController As ManagementObject = Nothing
  22:  Dim objDvdDrive As ManagementObject = Nothing
  23:  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 = '1'")).Get
  24:  objIDEController = objManagementObject
  25:  For Each objManagementObject2 As ManagementObject In New  ManagementObjectSearcher(objManagementScope, New  ObjectQuery("SELECT * FROM Msvm_ResourceAllocationSettingData WHERE  ResourceType = 16  AND ResourceSubType='Microsoft Synthetic DVD  Drive' AND Address = '0'")).Get
  26:  objDvdDrive = objManagementObject2
  27:  If objDvdDrive("Parent") = objIDEController.Path.Path Then
  28:  objISO("Parent") = objDvdDrive.Path.Path
  29:  objISO("Connection") = New String(0) {strIsoPath}
  30:  End If
  31:  Next
  32:  Next
  33:       
  34:  For Each objVirtualSystemManagementService As ManagementObject InNew  ManagementObjectSearcher(objManagementScope, New ObjectQuery ("SELECT * FROM Msvm_VirtualSystemManagementService")).Get
  35:  Dim objParams As ManagementBaseObject =  objVirtualSystemManagementService.GetMethodParameters("AddVirtual System Resources")
  36:  Dim strResourceSettingData As String() = New String(0) {}
  37:  strResourceSettingData(0) = objISO.GetText(TextFormat.CimDtd20)
  38:  objParams("ResourceSettingData") = strResourceSettingData
  39:  objParams("TargetSystem") = objComputerSystem.Path.Path
  40:  Dim objManagementBaseObject As ManagementBaseObject = objVirtualSystemManagementService.InvokeMethod("AddVirtualSystem Resources", objParams, Nothing)
  41:  Return JobComplete(objManagementBaseObject, objManagementScope)
  42:  Next
  43:  End Function


1行目:


引数として、ManagementScope オブジェクト、仮想マシン名、ISOイメージのファイルパスを渡します。



2~5行目:


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



7行目:


マウントするISOオブジェクトを取得します。



8行目:


すでに実装されているDVDドライブはMsvm_ResourcePoolに格納されています。Msvm_ResourcePoolクラスから、ResourceType =21(Storage Extent)、ResourceSubType = Microsoft Virtual CD/DVD Disk、OtherResourceType = null といった内容でSQL文でフィルタします。ResourceTypeについては、こちらに一覧があります。



9~19行目:


Msvm_AllocationCapabilities オブジェクト(Msvm_AllocationCapabilities)、Msvm_SettingsDefineCapabilitiesオブジェクト を利用してDVDドライブオブジェクトを取得していきます。ほぼ決まり文句といった感じでこのまま利用 することになります。



21~22行目:


IDEコントローラーオブジェクトとDVDドライブオブジェクトを取得します。ISOイメージをマウントするにはDVDドライブと、そのDVDドライブが接続されているIDEコントローラーを取得する必要があります。



23~24行目:


まず大元のIDEコントローラーのオブジェクトはMsvm_ResourceAllocationSettingData の中に格納されていますので、ResourceType =5(IDE Controller)、ResourceSubType = Microsoft Emulated IDE Controller、Address = 1といった内容でSQL文でフィルタして取得します。



25~26行目:


次にDVDドライブを取得します。IDEコントローラーと同様に、Msvm_ResourceAllocationSettingDataから、ResourceType = 16(DVD drive)、ResourceSubType = Microsoft Synthetic DVD Drive、Address = 0といった内容でSQL文でフィルタして取得します。



27行目:


DVDドライブの接続されているIDEコントローラーが一致した場合、これがISOイメージをマウントするDVDドライブとなります。



28行目:


ISOイメージをマウントするDVDドライブを指定します。



29行目:


マウントするISOイメージのファイルパスを指定します。



34行目:


ほぼ決まり文句といった具合ですが、Msvm_VirtualSystemManagementService クラス を使用して、ISOイメージをマウント(追加)していきます。



Msvm_VirtualSystemManagementServiceクラスのオブジェクトの中の一つをFor~Next文で取り出します。


35~40行目:


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



41行目:


お約束のJobCompleteを実行してエラーがなければ、Hyper-V上の仮想マシンのDVDドライブにISOイメージがマウントされています。


ISOイメージのアンマウント方法

   1:  Function UnMountISO(ByVal objManagementScope As ManagementScope,  ByVal strVMName 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 objIDEController As ManagementObject = Nothing
   8:  Dim objDvdDrive As ManagementObject = Nothing
   9:  Dim objISO As ManagementObject = Nothing
  10:  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 = '1'")).Get
  11:  objIDEController = objManagementObject
  12:  ForEach objManagementObject2 AsManagementObject In New  ManagementObjectSearcher(objManagementScope, New ObjectQuery( "SELECT * FROM Msvm_ResourceAllocationSettingData WHERE Resource Type = 16  AND ResourceSubType='Microsoft Synthetic DVD Drive'  AND Address = '0'")).Get
  13:                  objDvdDrive = objManagementObject2
  14:  If objDvdDrive("Parent") = objIDEController.Path.Path Then
  15:  For Each objManagementObject3 As ManagementObject In New  ManagementObjectSearcher(objManagementScope, New  ObjectQuery("SELECT * FROM Msvm_ResourceAllocationSettingData")).Get
  16:  objISO = objManagementObject3
  17:  If objISO("Parent") = objDvdDrive.Path.Path Then
  18:  Exit For
  19:  End If
  20:  Next
  21:  End If
  22:  Next
  23:  Next
  24:   
  25:  For Each objVirtualSystemManagementService As ManagementObject In  NewManagementObjectSearcher(objManagementScope, New  ObjectQuery("SELECT * FROM  Msvm_VirtualSystemManagementService")).Get
  26:  Dim objParams As ManagementBaseObject =  objVirtualSystemManagementService.GetMethodParameters("RemoveVirtual SystemResources")
  27:  Dim strResourceSettingData(0) As String
  28:  strResourceSettingData(0) = objISO.Path.Path
  29:  objParams("ResourceSettingData") = strResourceSettingData
  30:  objParams("TargetSystem") = objComputerSystem.Path.Path
  31:  Dim objManagementBaseObject As ManagementBaseObject = objVirtualSystemManagementService.InvokeMethod("RemoveVirtualSystem Resources", objParams, Nothing)
  32:  Return JobComplete(objManagementBaseObject, objManagementScope)
  33:  Next
  34:  End Function

ポイントだけ説明しますと、IDEコントローラー1の0番に接続されたDVDドライブにマウントされているISOイメージをオブジェクトとして取得して、Msvm_VirtualSystemManagementService クラスのRemoveVirtualSystemResourcesメソッドを使用して取り外します。



10行目:


IDEコントローラーをResourceType =5(IDE Controller)、ResourceSubType = Microsoft Emulated IDE Controller、Address = 1といった内容でSQL文でフィルタして取得します。



12行目:


DVDドライブをResourceType = 16(DVD drive)、ResourceSubType = Microsoft Synthetic DVD Drive、Address = 0といった内容でSQL文でフィルタして取得します。



14行目:


IDEコントローラー1に接続されたDVDドライブを特定します。



15行目:


Msvm_ResourceAllocationSettingDataの中に格納されているISOイメージオブジェクトを取り出します。



17行目:


14行目:


で取得したDVDドライブにマウントされているISOイメージを特定します。



26行目:


RemoveVirtualSystemResourcesメソッドを使用してISOイメージのオブジェクトを削除します。



32行目:


お約束のJobCompleteを実行してエラーがなければ、Hyper-V上の仮想マシンのDVDドライブからISOイメージがアンマウントされています。


今回は、DVDドライブの追加とISOイメージのマウント・アンマウントをご紹介しました。 これまでご紹介してきたように、Hyper-Vに対してはWMI経由のアプローチで様々なことができるようになっています。


このほかにもスナップショットの取得や、仮想マシンの状況をサムネイル画像で取得といったことも可能です。 今後も折を見て、いくつかご紹介していきたいと思います。







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

樋口 勝一

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の公式ガイドブックです。