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)
*本文中に記載されている会社名および商品名・サービス名は、各社の商標 または登録商標です。
著書の紹介欄
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に必要なコンポーネントのダウンロード、実際にプライベートクラウド構築する過程を、手順を追って解説しています。これからプライベートクラウドの構築を検討するうえで、作業負担の軽減に役立つ一冊です。
ブログの著者欄
採用情報
関連記事
KEYWORD
CATEGORY
-
技術情報(418)
-
イベント(155)
-
カルチャー(35)
-
デザイン(15)
TAG
- 5G
- Adam byGMO
- AI
- AWX
- BIT VALLEY
- blockchain
- ChatGPT
- cloudnative
- CloudStack
- CM
- CNDO
- CNDT
- CODEGYM Academy
- ConoHa
- CS
- CSS
- CTF
- DC
- Designship
- DevSecOpsThon
- Docker
- DTF
- GitLab
- GMO Developers Day
- GMO Developers Night
- GMO GPUクラウド
- GMO Hacking Night
- GMO kitaQ
- GMO SONIC
- GMOアドパートナーズ
- GMOアドマーケティング
- GMOイエラエ
- GMOグローバルサイン
- GMOデジキッズ
- GMOペイメントゲートウェイ
- GMOペパボ
- GMOリサーチ
- Go
- GTB
- Hardning
- Harvester
- HCI
- iOS
- IoT
- ISUCON
- JapanDrone
- Java
- JJUG
- K8s
- Kids VALLEY
- LLM
- MetaMask
- MySQL
- NFT
- NVIDIA
- OpenStack
- Perl
- PHP
- PHPcon
- PHPerKaigi
- QUIC
- Rancher
- RPA
- Ruby
- Selenium
- splunk
- SRE
- SSL
- Terraform
- TLS
- TypeScript
- UI/UX
- VLAN
- VS Code
- インターンシップ
- オブジェクト指向
- オンボーディング
- お名前.com
- カルチャー
- コンテナ
- スクラム
- スペシャリスト
- ソフトウェアテスト
- チームビルディング
- ドローン
- ネットワーク
- プログラミング教育
- ブロックチェーン
- ゆめみらいワーク
- リモートワーク
- 基礎
- 多拠点開発
- 大学授業
- 宮崎オフィス
- 応用
- 技育プロジェクト
- 新卒
- 暗号
- 機械学習
- 決済
PICKUP