GMOインターネット株式会社 システム本部 樋口 勝一が担当するGMO最新ネット業界レポート-ソリューション編。6回に渡って特集してきた『Hyper-Vを使ったクラウドサービスの作り方』、Vol.7となる今回は『Hyper-V Provisioning SCSIハードディスクの追加』について。
Hyper-V Provisioning SCSIハードディスクの追加
前回までのプロビジョニングで、とりあえずの仮想マシンができあがりました。基本的なCPU、メモリ、ハードディスク、ネットワークアダプタが実装されています。Hyper-Vの仮想マシンはこの他にも、SCSIハードディスクや、DVDドライブなどの追加装備が実装可能です。今回は、この追加装備の一つであるSCSIハードディスクのプロビジョニング方法をご紹介します。
SCSIコントローラーの追加方法
SCSIハードディスクを追加するには、手順としてSCSIコントローラーを追加して、vhdハードディスクを接続するといった手順になります。まずはSCSIコントローラーの追加から。
サンプルコードをこちらからダウンロードいただけます。 → GMOReport.zip(17KB)
Function SetScsiController(ByVal objManagementScope As ManagementScope,
Dim objComputerSystem As ManagementObject = Nothing
For Each objManagementObject As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT *
objComputerSystem = objManagementObject
Next
Dim objSCSIController As ManagementObject = Nothing
For Each objManagementObject As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT *
objSCSIController = objManagementObject
objSCSIController("ElementName") = "SCSI コントローラー"
Next
For Each objVirtualSystemManagementService As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT *
Dim objParams As ManagementBaseObject =
Dim strResourceSettingData As String() = New String(0) {}
strResourceSettingData(0) = objSCSIController.
objParams("ResourceSettingData") = strResourceSettingData
objParams("TargetSystem") = objComputerSystem.Path.Path
Dim objManagementBaseObject As ManagementBaseObject =
Return JobComplete(objManagementBaseObject, objManagementScope)
Next
End Function
1行目:
引数として、ManagementScope オブジェクト、仮想マシン名を渡します。
2~5行目:
仮想マシン名をキーにして、WMIクエリにてメモリ設定を行なう仮想マシンオブジェクトを取得します。
ここまではいつもどおり同様のパターンとなります。
7~11行目:
SCSIコントローラーのオブジェクトはMsvm_ResourceAllocationSettingDataの中に格納されていますので、ResourceType =6(Parallel SCSI HBA)、 ResourceSubType = Microsoft Synthetic SCSI Controllerといった内容でSQL文でフィルタします。
13行目:
抽出したSCSIコントローラーオブジェクトを仮想マシン作成時と同様に、
Msvm_VirtualSystemManagementService クラスを使用して追加していきます。Msvm_VirtualSystemManagementServiceクラスのオブジェクトの中の一つをFor~Nextの文で取り出します。
14行目:
AddVirtualSystemResourcesメソッドを使用して各パラメーターを設定しています。
15~17行目:
ディスクドライブオブジェクトのXML化した設定情報を、ResourceSettingDataパラメーターに入力します。
18行目:
objComputerSystemパラメーターには、4行目で取得した、SCSIコントローラーを追加する仮想マシンを格納したMsvm_ComputerSystemオブジェクトを指定します。
19行目:
AddVirtualSystemResourcesメソッドを、入力したパラメーターの内容で実行します。
20行目:
いつものようにJobCompleteを実行してエラーがなければ、SCSIコントローラーが追加されます。
SCSIハードディスクの追加方法次に、SCSIハードディスクを追加していきましょう。SCSIハードディスクの追加は、IDEハードディスクの追加方法とほぼ同様の方法です。ディスクドライブオブジェクトを作成し、SCSIコントローラーに追加して、vhdハードディスクを接続します。
Function SetScsiHardDisk(ByVal objManagementScope As ManagementScope,
Dim objComputerSystem As ManagementObject = Nothing
For Each objManagementObject As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery
objComputerSystem = objManagementObject
Next
Dim objDiskDrive As ManagementObject = Nothing
For Each objResourcePool As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery
Dim objAllocationCapabilitiesCollection As ManagementObjectCollection
For Each objAllocationCapabilities As ManagementObject In objAllocationCapabilitiesCollection
Dim objSettingsDefineCapabilitiesCollection As ManagementObjectCollection = objAllocationCapabilities.
For Each objSettingsDefineCapabilities As ManagementObject In objSettingsDefineCapabilitiesCollection
If objSettingsDefineCapabilities("ValueRole") = 0 Then
objDiskDrive = New ManagementObject(objSettingsDefineCapabilities
objDiskDrive.Scope = objManagementScope
End If
Next
Next
Next
Dim objSCSIController As ManagementObject = Nothing
For Each objManagementObject As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery
objDiskDrive("Parent") = objManagementObject.Path.Path
objDiskDrive("Address") = 0
For Each objVirtualSystemManagementService As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery
Dim objParams As ManagementBaseObject =
Dim strResourceSettingData As String() = New String(0) {}
strResourceSettingData(0) = objDiskDrive.GetText(TextFormat.CimDtd20)
objParams("ResourceSettingData") = strResourceSettingData
objParams("TargetSystem") = objComputerSystem.Path.Path
Dim objManagementBaseObject As ManagementBaseObject =
If objManagementBaseObject("ReturnValue") = 0 Then
objSCSIController = objManagementObject
End If
Next
Next
Dim objHardDisk As ManagementObject = Nothing
For Each objResourcePool As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery
Dim objAllocationCapabilitiesCollection As ManagementObjectCollection
For Each objAllocationCapabilities As ManagementObject In objAllocationCapabilitiesCollection
Dim objSettingsDefineCapabilitiesCollection As ManagementObjectCollection = objAllocationCapabilities.
For Each objSettingsDefineCapabilities As ManagementObject In objSettingsDefineCapabilitiesCollection
If objSettingsDefineCapabilities("ValueRole") = 0 Then
objHardDisk = New ManagementObject(objSettingsDefineCapabilities
objHardDisk.Scope = objManagementScope
End If
Next
Next
Next
Dim objSCSIDrive As ManagementObject = Nothing
For Each objManagementObject As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery
objSCSIDrive = objManagementObject
objHardDisk("Parent") = objSCSIDrive.Path.Path
objHardDisk("Connection") = New String(0) {strDiskPath}
Next
For Each objVirtualSystemManagementService As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery
Dim objParams As ManagementBaseObject =
Dim strResourceSettingData As String() = New String(0) {}
strResourceSettingData(0) = objHardDisk.GetText(TextFormat.CimDtd20)
objParams("ResourceSettingData") = strResourceSettingData
objParams("TargetSystem") = objComputerSystem.Path.Path
Dim objManagementBaseObject As ManagementBaseObject =
Return JobComplete(objManagementBaseObject, objManagementScope)
Next
End Function
1行目:
引数として、ManagementScope オブジェクト、仮想マシン名、ハードディスクとして接続するvhdのファイルパスを渡します。
2~5行目:
仮想マシン名をキーにして、WMIクエリにてメモリ設定を行なう仮想マシンオブジェクトを取得します。
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~23行目:
ディスクドライブオブジェクトを接続するSCSIコントローラーを取得します。先ほど作成したすでに接続済みのSCSIコントローラーがありあますので、これを取得します。
24行目:
SCSIコントローラーの0番に接続します。
26行目:
IDEディスクと同様に、Msvm_VirtualSystemManagementService クラスを使用して、ディスクドライブを追加していきます。Msvm_VirtualSystemManagementServiceクラスのオブジェクトの中の一つをFor~Next文で取り出します。
27行目:
AddVirtualSystemResourcesメソッドを使用して各パラメーターを設定しています。
28~30行目:
ディスクドライブオブジェクトのXML化した設定情報を、ResourceSettingDataパラメーターに入力します。
31行目:
objComputerSystemパラメーターには、ディスクドライブオブジェクトを追加する仮想マシンを格納したMsvm_ComputerSystemオブジェクトを指定します。
32行目:
AddVirtualSystemResourcesメソッドを、入力したパラメーターの内容で実行します。
33~34行目:
ディスクドライブの追加に成功したSCSIコントローラーをオブジェクトに格納します。これは、次にvhdのハードディスクを接続するときに使用します。
39行目:
次に、ハードディスクオブジェクトを作成します。作成方法としては、前出のディスクドライブオブジェクトの作成方法と同じです。
40行目:
ハードディスクオブジェクトを作成する場合は、Hyper-Vのリソース一覧にあるオブジェクトを呼び出し、各パラメーターを設定して作成していきます。Msvm_ResourcePoolクラスには仮想マシンに追加することができるリソースが格納されています。Msvm_ResourcePoolクラスから、ResourceType = 21(Storage Extent)、ResourceSubType = Microsoft Virtual Hard Disk、OtherResourceType = null といった内容でSQL文でフィルタします。
ResourceTypeについては、こちらに一覧があります。
41~51行目:
Msvm_AllocationCapabilities オブジェクト(Msvm_AllocationCapabilities)、Msvm_SettingsDefineCapabilitiesオブジェクトを利用してディスクドライブオブジェクトを取得していきます。ディスクドライブの作成のときと同様、この部分のコードは解説自体が非常に困難なものとなりますので、ほぼ決まり文句といった感じでこのまま利用することになります。
53行目:
ディスクドライブオブジェクトを格納する変数を定義します。
54行目:
前述のMsvm_ResourceAllocationSettingDataを利用して、SCSIコントローラーの0番に接続されたディスクドライブオブジェクトを抽出します。
56行目:
追加するハードディスクは、先ほど作成したディスクドライブオブジェクトに接続します。
57行目:
追加するハードディスクで使用するvhdファイルのパスを指定します。
60行目:
ディスクドライブオブジェクトを作成したときと同様に、MMsvm_VirtualSystemManagementService クラスを使用して、ディスクドライブを追加していきます。Msvm_VirtualSystemManagementServiceクラスのオブジェクトの中の一つをFor~Nextの文で取り出します。
61~66行目:
AddVirtualSystemResourcesメソッドを使用して追加します。ここからもほぼ定型文のようになっていますので、同様にパラメーターを設定していきます。
67行目:
お約束のJobCompleteを実行してエラーがなければ、Hyper-V上の仮想マシンにSCSIコントローラー0番に接続されたハードディスクが追加されています。
IDEハードディスクに比べ、SCSIコントローラーを追加しなければならない分、ちょっとコードが長くなってしまいますが、基本的にはIDEハードディスクの追加と方法は同じです。
次回は、DVDドライブの追加と、そのドライブにISOイメージファイルをマウントする方法をご紹介します。
サンプルコードをこちらからダウンロードいただけます。 → GMOReport.zip(17KB)
*本文中に記載されている会社名および商品名・サービス名は、各社の商標 または登録商標です。