GMOインターネット株式会社 システム本部 樋口 勝一が担当するGMO最新ネット業界レポート-ソリューション編。7回に渡って特集してきた『Hyper-Vを使ったクラウドサービスの作り方』、Vol.8となる今回は『Hyper-V Provisioning  DVDドライブの追加とISOイメージのマウント方法』について。
追加装備の一つDVDドライブのプロビジョニング方法
これまで連載でご紹介してきた、「Hyper-Vを使ったクラウドサービスの作り方」ですが、今回でひとまず一 区切りということになります。 今回は追加装備の一つDVDドライブのプロビジョニング方法をご紹介します。 DVDドライブが追加された後は、そこにISOイメージをマウントしたり、アンマウントしたり、というところまでご紹介したいと思います。
DVDドライブの追加方法
すでにIDEコントローラーは仮想マシンに実装されていますので、DVDドライブの追加はこれまでのIDEやSCSIハードディスクを追加するときほど複雑ではありませんのでご安心ください。
手順としては、DVDドライブを作成して、IDEコントローラーに接続するだけ。そこにISOイメージをマウ
ントしたり、アンマウントしたりといった操作を行なうことになります。
サンプルコードをこちらからダウンロードいただけます。 → GMOReport.zip(18KB)
  Function SetDVD(ByVal objManagementScope As ManagementScope, ByVal strVMName As String) As Boolean
  Dim objComputerSystem As ManagementObject = Nothing
  For Each objManagementObject As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT *  FROM Msvm_ComputerSystem WHERE ElementName = '" & strVMName & "'")).Get
  objComputerSystem = objManagementObject
  Next
 
  Dim objDVD As ManagementObject = Nothing
  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
  Dim objAllocationCapabilitiesCollection As ManagementObjectCollection =  objResourcePool.GetRelated("Msvm_AllocationCapabilities")
  For Each  objAllocationCapabilities As ManagementObject In  objAllocationCapabilitiesCollection
  Dim objSettingsDefineCapabilitiesCollection As  ManagementObjectCollection =  objAllocationCapabilities.GetRelationships("Msvm_SettingsDefine Capabilities")
  For Each  objSettingsDefineCapabilities As ManagementObject In  objSettingsDefineCapabilitiesCollection
  If objSettingsDefineCapabilities("ValueRole") = 0 Then
  objDVD = New ManagementObject(objSettingsDefineCapabilities("PartComponent"). ToString())
  objDVD.Scope = objManagementScope
  End If
  Next
  Next
  Next
   
  Dim objIDEController As ManagementObject = Nothing
  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 =
  objIDEController = objManagementObject
  objDVD("Parent") = objIDEController.Path.Path
  objDVD("Address") = 0
  Next
   
  For Each objVirtualSystemManagementService As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT *  FROM Msvm_VirtualSystemManagementService")).Get
  Dim objParams As ManagementBaseObject = objVirtualSystemManagementService.GetMethodParameters("AddVirtualSystem
  Dim strResourceSettingData As String() = New String(0) {}
  strResourceSettingData(0) = objDVD.GetText(TextFormat.CimDtd20)
  objParams("ResourceSettingData") = strResourceSettingData
  objParams("TargetSystem") = objComputerSystem.Path.Path
  Dim objManagementBaseObject As ManagementBaseObject = objVirtualSystemManagementService.InvokeMethod("AddVirtualSystem Resources", objParams, Nothing)
  Return JobComplete(objManagementBaseObject, objManagementScope)
  Next
  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イメージのマウントから。
  Function MountISO(ByVal objManagementScope As ManagementScope,  ByVal strVMName As String, ByVal strIsoPath As String) As Boolean
  Dim objComputerSystem As ManagementObject = Nothing
  For Each objManagementObject As ManagementObject In New  ManagementObjectSearcher(objManagementScope, New  ObjectQuery("SELECT * FROM Msvm_ComputerSystem WHERE ElementName = '" & strVMName & "'")).Get
  objComputerSystem = objManagementObject
  Next
   
  Dim objISO As ManagementObject = Nothing
  For Each objResourcePool As ManagementObject In New ManagementObjectSearcher(objManagementScope, New 
  Dim objAllocationCapabilitiesCollection As  ManagementObjectCollection =  objResourcePool.GetRelated("Msvm_AllocationCapabilities")
  For Each objAllocationCapabilities As ManagementObject In  objAllocationCapabilitiesCollection
  Dim objSettingsDefineCapabilitiesCollection As ManagementObjectCollection = objAllocationCapabilities.GetRelationships("Msvm_SettingsDefine Capabilities")
  For Each objSettingsDefineCapabilities As ManagementObject In  objSettingsDefineCapabilitiesCollection
  If objSettingsDefineCapabilities("ValueRole") = 0 Then
  objISO = New  ManagementObject(objSettingsDefineCapabilities("PartComponent").ToSt ring())
  objISO.Scope = objManagementScope
  End If
  Next
  Next
  Next
   
  Dim objIDEController As ManagementObject = Nothing
  Dim objDvdDrive As ManagementObject = Nothing
  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
  objIDEController = objManagementObject
  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
  objDvdDrive = objManagementObject2
  If objDvdDrive("Parent") = objIDEController.Path.Path Then
  objISO("Parent") = objDvdDrive.Path.Path
  objISO("Connection") = New String(0) {strIsoPath}
  End If
  Next
  Next
       
  For Each objVirtualSystemManagementService As ManagementObject InNew  ManagementObjectSearcher(objManagementScope, New ObjectQuery ("SELECT * FROM Msvm_VirtualSystemManagementService")).Get
  Dim objParams As ManagementBaseObject =  objVirtualSystemManagementService.GetMethodParameters("AddVirtual System Resources")
  Dim strResourceSettingData As String() = New String(0) {}
  strResourceSettingData(0) = objISO.GetText(TextFormat.CimDtd20)
  objParams("ResourceSettingData") = strResourceSettingData
  objParams("TargetSystem") = objComputerSystem.Path.Path
  Dim objManagementBaseObject As ManagementBaseObject = objVirtualSystemManagementService.InvokeMethod("AddVirtualSystem Resources", objParams, Nothing)
  Return JobComplete(objManagementBaseObject, objManagementScope)
  Next
  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イメージのアンマウント方法
  Function UnMountISO(ByVal objManagementScope As ManagementScope,  ByVal strVMName As String) As Boolean
  Dim objComputerSystem As ManagementObject = Nothing
  For Each objManagementObject As  ManagementObject In New ManagementObjectSearcher(objManagementScope,  New ObjectQuery("SELECT * FROM Msvm_ComputerSystem  WHERE ElementName = '" & strVMName & "'")).Get
  objComputerSystem = objManagementObject
  Next
   
  Dim objIDEController As ManagementObject = Nothing
  Dim objDvdDrive As ManagementObject = Nothing
  Dim objISO As ManagementObject = Nothing
  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
  objIDEController = objManagementObject
  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
                  objDvdDrive = objManagementObject2
  If objDvdDrive("Parent") = objIDEController.Path.Path Then
  For Each objManagementObject3 As ManagementObject In New  ManagementObjectSearcher(objManagementScope, New  ObjectQuery("SELECT * FROM Msvm_ResourceAllocationSettingData")).Get
  objISO = objManagementObject3
  If objISO("Parent") = objDvdDrive.Path.Path Then
  Exit For
  End If
  Next
  End If
  Next
  Next
   
  For Each objVirtualSystemManagementService As ManagementObject In  NewManagementObjectSearcher(objManagementScope, New  ObjectQuery("SELECT * FROM  Msvm_VirtualSystemManagementService")).Get
  Dim objParams As ManagementBaseObject =  objVirtualSystemManagementService.GetMethodParameters("RemoveVirtual SystemResources")
  Dim strResourceSettingData(0) As String
  strResourceSettingData(0) = objISO.Path.Path
  objParams("ResourceSettingData") = strResourceSettingData
  objParams("TargetSystem") = objComputerSystem.Path.Path
  Dim objManagementBaseObject As ManagementBaseObject = objVirtualSystemManagementService.InvokeMethod("RemoveVirtualSystem Resources", objParams, Nothing)
  Return JobComplete(objManagementBaseObject, objManagementScope)
  Next
  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経由のアプローチで様々なことができるようになっています。
このほかにもスナップショットの取得や、仮想マシンの状況をサムネイル画像で取得といったことも可能です。 今後も折を見て、いくつかご紹介していきたいと思います。
サンプルコードをこちらからダウンロードいただけます。 → GMOReport.zip(18KB)
*本文中に記載されている会社名および商品名・サービス名は、各社の商標 または登録商標です。