Hyper-V Provisioning ネットワークアダプタの追加

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

GMOインターネット株式会社 システム本部 樋口 勝一が解説する『Hyper-Vを使ったクラウドサービスの作り方』。前回までに、仮想マシン一覧の取得、メモリとプロセッサーの設定と解説してきましたが、Vol.5となる今回は『Hyper-V Provisioning ネットワークアダプタの追加』について。

Hyper-V Provisioning ネットワークアダプタの追加

前回までのレポートで解説した骨組みまで出来上がっている仮想マシンに、今回はネットワークアダプタの設定を追加していきます。今回はかなり難易度の高いコードとなりますが、ある程度パターンがあると思ってもらえると良いと思います。  (参照:コード01)

サンプルコードをこちらからダウンロードいただけます。
 → GMOReport.zip(16KB)

Function SetNetworkAdapter(ByVal objManagementScope As ManagementScope, 
 ByVal strVMName As String, ByVal strNetworkName As String) As Boolean
Dim objComputerSystem As ManagementObject = Nothing
For Each objManagementObject AsManagementObject In New 
 ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * 
 FROM Msvm_ComputerSystem WHERE ElementName = '" & strVMName & "'")).Get
objComputerSystem = objManagementObject
Next
  
Dim objVirtualSwitchManagementService As ManagementObject = Nothing
For Each objManagementObject As ManagementObject In New
 ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * 
 FROM Msvm_VirtualSwitchManagementService")).Get
objVirtualSwitchManagementService = objManagementObject
Next
 
Dim objVirtualSwitch As ManagementObject = Nothing
Dim objSwitchPort As ManagementObject = Nothing
For Each objManagementObject As ManagementObject In New
 ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * 
 FROM Msvm_VirtualSwitch WHERE ElementName = '" & strNetworkName &
 "'")).Get
objVirtualSwitch = objManagementObject
Dim objParams As ManagementBaseObject =
 objVirtualSwitchManagementService.GetMethodParameters("CreateSwitchPort")
objParams("Name") = DateTime.Now.ToString("yyymmddhhmmss")
objParams("FriendlyName") = objParams("Name").ToString
objParams("VirtualSwitch") = objVirtualSwitch.Path.Path
Dim objManagementBaseObject As ManagementBaseObject = 
 objVirtualSwitchManagementService.InvokeMethod("CreateSwitchPort",
 objParams, Nothing)
objSwitchPort = New ManagementObject(objManagementScope, New
 ManagementPath(objManagementBaseObject("CreatedSwitchPort").ToString), 
 Nothing)
Next

Dim objDefaultNic As ManagementObject = Nothing
For Each objResourcePool As ManagementObject In New
 ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * 
 FROM Msvm_ResourcePool WHERE ResourceType = 10 AND ResourceSubType =
 'Microsoft Synthetic Ethernet Port' 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_SettingsDefineCapabilities")

For Each objSettingsDefineCapabilities As ManagementObject In
 objSettingsDefineCapabilitiesCollection
If objSettingsDefineCapabilities("ValueRole") = 0 Then
objDefaultNic = New ManagementObject(objSettingsDefineCapabilities
 ("PartComponent").ToString())
objDefaultNic.Scope = objManagementScope
End If
Next
Next
Next

For Each objVirtualSystemManagementService As ManagementObject In New
 ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * 
 FROM Msvm_VirtualSystemManagementService")).Get
Dim objParams As ManagementBaseObject =
 objVirtualSystemManagementService.GetMethodParameters
 ("AddVirtualSystemResources")
objDefaultNic("Connection") = New String() {objSwitchPort.Path.Path}
objDefaultNic("StaticMacAddress") = False
objDefaultNic("ElementName") = "ネットワーク アダプター"
Dim strVirtualSystemIdentifiers As String() = New String(0) {}
strVirtualSystemIdentifiers(0) = String.Format("{{{0}}}", Guid.NewGuid())
objDefaultNic("VirtualSystemIdentifiers") = strVirtualSystemIdentifiers
 
Dim strResourceSettingData As String() = New String(0) {}
strResourceSettingData(0) = objDefaultNic.GetText(TextFormat.CimDtd20)
objParams("ResourceSettingData") = strResourceSettingData
objParams("TargetSystem") = objComputerSystem.Path.Path

Dim objManagementBaseObject As ManagementBaseObject =
 objVirtualSystemManagementService.InvokeMethod
 ("AddVirtualSystemResources", objParams, Nothing)
Return JobComplete(objManagementBaseObject, objManagementScope)
Next
End Function

1行目:

引数として、ManagementScope オブジェクト、仮想マシン名、仮想ネットワーク名を渡します。仮想ネットワーク名とは、事前にHyper-Vマネージャーの仮想ネットワークマネージャーで、作成した仮想ネットワークです。今回は仮に「LAN」という名前で作成しました。

2~5行目:

仮想マシン名をキーにして、WMIクエリにてメモリ設定を行なう仮想マシンオブジェクトを取得します。ここまでは前回の『メモリとプロセッサーの設定』と同様のパターンになります。

さて、ここから本題のネットワーク関連のオブジェクトの取り扱いとなります。

7~10行目:

仮想マシンに対して、ネットワーク関連の様々な設定を行なうには、仮想マシンごとにある、Msvm_VirtualSwitchManagementServiceクラスを介して設定してゆくことになります。

手順としては、まず事前に「LAN」という名前で作成した仮想スイッチアダプタ(仮想ネットワーク)に、ネットワークアダプタを接続するためのスイッチポートを作成します。次に仮想マシンにネットワークアダプタを作成し、追加して先ほど作成したスイッチポートに接続する手順になります。

12行目:

仮想スイッチアダプタ(仮想ネットワーク)を格納するためのオブジェクトを作成しておきます。

13行目:

以下で作成するスイッチポートを格納するためのオブジェクトを作成しておきます。

14~15行目:

仮想スイッチアダプタの一覧から、事前に作成した「LAN」という名前をSQLで選択して、取得します。

16行目:

Msvm_VirtualSwitchManagementService クラスからGetMethodParametersメソッドを利用して、スイッチポートを作成するためのCreateSwitchPortメソッドに必要なパラメーターを取得し、パラメーターに入力してゆきます。

17行目:

Nameには他のポート名とは重複しない名前が必要となるので、今回は作成時間を数値で指定しています。

18行目:

FriendlyNameは、Nameと同様の名前を使用しています。

19行目:

VirtualSwitchには、仮想スイッチアダプタ「LAN」オブジェクトを指定します

20行目:

CreateSwitchPortメソッドを使用して、スイッチポートを作成します。

21行目:

作成したスイッチポートをオブジェクトとして取得し、格納します。

24行目:

次に、仮想マシンに追加するネットワークアダプタオブジェクトを作成します。作成したネットワークアダプタオブジェクトを格納するためのオブジェクトを用意しておきます。

25行目:

仮想マシンにネットワークアダプタを追加する場合は、Hyper-Vのリソース一覧にあるオブジェクトを呼び出し、各パラメーターを設定して作成してゆきます。Msvm_ResourcePoolクラスには仮想マシンに追加することができるリソースが格納されています。Msvm_ResourcePoolクラスから、ResourceType = 10(Ethernet Adapter)、ResourceSubType = Microsoft Synthetic Ethernet Port、OtherResourceType = null という内容のSQL文でフィルタします。 ResourceTypeについては、こちらに一覧があります

26~37行目:

Msvm_AllocationCapabilities オブジェクト(Msvm_AllocationCapabilities)、Msvm_SettingsDefineCapabilitiesオブジェクトを利用してネットワークアダプタを実際に追加していきますが、この部分のコードは解説自体が非常に困難なものとなりますので、ほぼ決まり文句といった感じでこのまま利用することになります。

39行目:

仮想マシン作成時同様に、Msvm_VirtualSystemManagementService クラスを使用して、ネットワークアダプタを追加してゆきます。Msvm_VirtualSystemManagementServiceクラスのオブジェクトの一つをFor~Next文で取り出します。

40行目:

仮想マシン作成時とはちがい、ネットワークアダプタの追加にはAddVirtualSystemResourcesメソッドを使用します。各パラメータは以下のようになります。

41行目:

先ほど作成したネットワークアダプタを仮想ネットワークアダプタに接続します。

42行目:

MACアドレスは動的に割り当てます。

43行目:

ElementNameはネットワーク アダプターとなります。

44~46行目:

仮想ネットワークアダプタを特定するために、一意のIDをGUIDより作成し割りあてます。

49~50行目:

仮想ネットワークアダプタをXML化した設定情報を、ResourceSettingDataパラメーターに入力します。

51行目:

ComputerSystemパラメーターには、仮想ネットワークアダプタを追加する仮想マシンを格納したMsvm_ComputerSystemオブジェクトを指定します。

53行目:

AddVirtualSystemResourcesメソッドを、入力したパラメーターの内容で実行します。

54行目:

今回もJobCompleteを使用してメソッドの実行を完了します。

以上で、エラーが出ること無くコードが走れば、Hyper-V上の仮想マシンに仮想スイッチアダプタ「LAN」に接続されたネットワークアダプタが追加されたことになります。

以上、今回はネットワークアダプタの追加方法についてご紹介しました。

次回は、仮想マシンに対して各パーツの設定方法をご紹介していきます。

サンプルコードをこちらからダウンロードいただけます。
 → GMOReport.zip(16KB)

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

著書の紹介欄

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アワード」を受賞し、インターネットソリューションのスペシャリストとして活躍。

採用情報

関連記事