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