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

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

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コントローラーの追加から。

  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イメージファイルをマウントする方法をご紹介します。

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

著書の紹介欄

Hyper-Vで本格的なサーバー仮想環境を構築。仮想環境を設定・操作できる!

できるPRO Windows Server 2016 Hyper-V

◇Hyper-Vのさまざまな機能がわかる ◇インストールからの操作手順を解説 ◇チェックポイントやレプリカも活用できる Windows Server 2016 Hyper-Vは、仮想化ソフトウェア基盤を提供する機能であり、クラウドの実現に不可欠のものです。 本書では、仮想化の基礎知識から、Hyper-Vでの仮想マシンや仮想スイッチの設定・操作、プライベートクラウドの構築、Azureとの連携などを解説します。

初めてのWindows Azure Pack本が発売

Windows Azure Pack プライベートクラウド構築ガイド

本書は、Windows Azure PackとHyper-Vを利用し、企業内IaaS(仮想マシン提供サービス)を構成するための、IT管理者に向けた手引書です。試用したサーバーは、最小限度の物理サーバーと仮想マシンで構成しています。Windows Azure Packに必要なコンポーネントのダウンロード、実際にプライベートクラウド構築する過程を、手順を追って解説しています。これからプライベートクラウドの構築を検討するうえで、作業負担の軽減に役立つ一冊です。

ブログの著者欄

樋口 勝一

GMOインターネット株式会社

1999年6月GMOインターネットに入社。Windows Serverをプラットフォームとしたサービス開発から運用・保守まで幅広く担当。講演登壇や出版、ネット記事連載などでマイクロソフト社と強い信頼関係を構築。2007年より「マイクロソフトMVPアワード」を受賞し、インターネットソリューションのスペシャリストとして活躍。

採用情報

関連記事