TechReport

技術者情報

ソリューション

2012年4月4日(水)公開

第80回

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

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

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

記事INDEX

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

前回までのプロビジョニングで、とりあえずの仮想マシンができあがりました。基本的なCPU、メモリ、ハードディスク、ネットワークアダプタが実装されています。Hyper-Vの仮想マシンはこの他にも、SCSIハードディスクや、DVDドライブなどの追加装備が実装可能です。今回は、この追加装備の一つであるSCSIハードディスクのプロビジョニング方法をご紹介します。


SCSIコントローラーの追加方法

SCSIハードディスクを追加するには、手順としてSCSIコントローラーを追加して、vhdハードディスクを接続するといった手順になります。まずはSCSIコントローラーの追加から。


[ コード01 ]
   1:  Function SetScsiController(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 objSCSIController As ManagementObject = Nothing
   8:  For Each objManagementObject As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT *
 FROM Msvm_ResourceAllocationSettingData WHERE ResourceType = 6 AND
 ResourceSubType = 'Microsoft Synthetic SCSI Controller' AND
 OtherResourceType = null")).Get
   9:  objSCSIController = objManagementObject
  10:  objSCSIController("ElementName") = "SCSI コントローラー"
  11:  Next
  12:   
  13:  For Each objVirtualSystemManagementService As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT *
 FROM Msvm_VirtualSystemManagementService")).Get
  14:  Dim objParams As ManagementBaseObject =
 objVirtualSystemManagementService. GetMethodParameters
 ("AddVirtualSystemResources")
  15:  Dim strResourceSettingData As String() = New String(0) {}
  16:  strResourceSettingData(0) = objSCSIController.
 GetText(TextFormat.CimDtd20)
  17:  objParams("ResourceSettingData") = strResourceSettingData
  18:  objParams("TargetSystem") = objComputerSystem.Path.Path
  19:  Dim objManagementBaseObject As ManagementBaseObject =
 objVirtualSystemManagementService.InvokeMethod
 ("AddVirtualSystemResources", objParams, Nothing)
  20:  Return JobComplete(objManagementBaseObject, objManagementScope)
  21:  Next
  22:  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ハードディスクを接続します。

[ コード02 ]
   1:  Function SetScsiHardDisk(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 ManagementObject(objSettingsDefineCapabilities
 ("PartComponent").ToString())
  15:  objDiskDrive.Scope = objManagementScope
  16:  End If
  17:  Next
  18:  Next
  19:  Next
  20:   
  21:  Dim objSCSIController As ManagementObject = Nothing
  22:  For Each objManagementObject As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery
 ("SELECT * FROM Msvm_ResourceAllocationSettingData WHERE ResourceType
 = 6 AND ResourceSubType = 'Microsoft Synthetic SCSI Controller' AND
 OtherResourceType = null")).Get
  23:  objDiskDrive("Parent") = objManagementObject.Path.Path
  24:  objDiskDrive("Address") = 0
  25:   
  26:  For Each objVirtualSystemManagementService As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery
 ("SELECT * FROM Msvm_VirtualSystemManagementService")). Get
  27:  Dim objParams As ManagementBaseObject =
 objVirtualSystemManagementService.GetMethodParameters
 ("AddVirtualSystemResources")
  28:  Dim strResourceSettingData As String() = New String(0) {}
  29:  strResourceSettingData(0) = objDiskDrive.GetText(TextFormat.CimDtd20)
  30:  objParams("ResourceSettingData") = strResourceSettingData
  31:  objParams("TargetSystem") = objComputerSystem.Path.Path
  32:  Dim objManagementBaseObject As ManagementBaseObject =
 objVirtualSystemManagementService.InvokeMethod
 ("AddVirtualSystemResources", objParams, Nothing)
  33:  If objManagementBaseObject("ReturnValue") = 0 Then
  34:  objSCSIController = objManagementObject
  35:  End If
  36:  Next
  37:  Next
  38:   
  39:  Dim objHardDisk As ManagementObject = Nothing
  40:  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
  41:  Dim objAllocationCapabilitiesCollection As ManagementObjectCollection
 = objResourcePool.GetRelated("Msvm_AllocationCapabilities")
  42:  For Each objAllocationCapabilities As ManagementObject In objAllocationCapabilitiesCollection
  43:  Dim objSettingsDefineCapabilitiesCollection As ManagementObjectCollection = objAllocationCapabilities.
 GetRelationships("Msvm_SettingsDefineCapabilities")
  44:  For Each objSettingsDefineCapabilities As ManagementObject In objSettingsDefineCapabilitiesCollection
  45:  If objSettingsDefineCapabilities("ValueRole") = 0 Then
  46:  objHardDisk = New ManagementObject(objSettingsDefineCapabilities
 ("PartComponent").ToString())
  47:  objHardDisk.Scope = objManagementScope
  48:  End If
  49:  Next
  50:  Next
  51:  Next
  52:   
  53:  Dim objSCSIDrive As ManagementObject = Nothing
  54:  For Each objManagementObject As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery
 ("SELECT * FROM Msvm_ResourceAllocationSettingData WHERE Parent = '" & objSCSIController.Path.Path.Replace("\", "\\") & "' AND Address =
 '0'")).Get
  55:  objSCSIDrive = objManagementObject
  56:  objHardDisk("Parent") = objSCSIDrive.Path.Path
  57:  objHardDisk("Connection") = New String(0) {strDiskPath}
  58:  Next
  59:   
  60:  For Each objVirtualSystemManagementService As ManagementObject In  New ManagementObjectSearcher(objManagementScope, New ObjectQuery
 ("SELECT * FROM Msvm_VirtualSystemManagementService")).Get
  61:  Dim objParams As ManagementBaseObject =
 objVirtualSystemManagementService. GetMethodParameters
 ("AddVirtualSystemResources")
  62:  Dim strResourceSettingData As String() = New String(0) {}
  63:  strResourceSettingData(0) = objHardDisk.GetText(TextFormat.CimDtd20)
  64:  objParams("ResourceSettingData") = strResourceSettingData
  65:  objParams("TargetSystem") = objComputerSystem.Path.Path
  66:  Dim objManagementBaseObject As ManagementBaseObject =
 objVirtualSystemManagementService.InvokeMethod
 ("AddVirtualSystemResources", objParams, Nothing)
  67:  Return JobComplete(objManagementBaseObject, objManagementScope)
  68:  Next
  69:  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イメージファイルをマウントする方法をご紹介します。





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

樋口 勝一

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