Windows仮想マシンをソフトウェアで制御する
~その実践と対策~

14-D-2
#devsumiD
株式会社インターネットイニシアティブ
プラットフォーム本部プラットフォームサービス部
プラットフォーム開発課
山内 徹

1
本日のアジェンダ

• 本セッションの骨子
• 自己紹介
• Windowsで構築する仮想環境
• IIJ GIOのハイパーバイザーとしてWin2008R2を導入する
• IIJ GIOのハイパーバイザーを2008R2から2012へ移行する
• まとめ
• 参考

2
本セッションの骨子

弊社がWindowsベースの仮想環境の管理システム
を開発する中で、仮想マシンを制御する過程で発生し
た問題と解決策について解説するものです

3
自己紹介

プロフィール
• 1997年日本電気ソフトウェア(現NECソフト)入社
• 開発やったりSIやったり色々
• 2002年以降、.NET関連の仕事が主業務になる
• 2007年アイアイジェイテクノロジ-(現IIJ)入社
• やはり.NETに関係する仕事が多い
• 2009年以降、IIJが提供するクラウドサービス“IIJ GIO”の立ち上げ
にあたり、“IIJ GIOコンポーネントサービスVシリーズ(Windows)”の
開発等に従事

テクノロジーフィールド
• サーバ/クライアントなど.NET Frameworkによる開発全般
• OS/ミドルウェアのコントロール
4
Windowsを使った標準的な仮想環境

5
Windowsを使った標準的な仮想環境

クラスター
VM VM VM VM

VM VM VM VM

VM VM VM VM

Hyper-V

Hyper-V

Hyper-V

Windows Server

Windows Server

Windows Server

VMM
Windows Server

• Windows Server上で仮想マシン(VM)を実行するハイパーバ
イザーが“Hyper-V”
• 複数のHyper-Vを集中管理する管理ツールが
“System Center Virtual Machine Manager”(以後、VMM)
6
IIJ GIOのハイパーバイザーとして
Win2008R2を導入する

7
DDTKを使う

2010年5月、弊社のIIJ GIOでWindowsOSの
ベースサーバを提供するにあたり、そのハイ
パ ー バ イ ザ ー と し て Windows Server
2008R2を採用した
短期間で高品質な管理システムを開発するに
あたり、DDTKを使うことで実現できると期待
された

8
DDTKの構成

クラスター
VM VM VM VM

VM VM VM VM

VM VM VM VM

Hyper-V

Hyper-V

Hyper-V

Windows Server

Windows Server

Windows Server

PowerShellで
コントロール

WMI
WMI

VMM

WMI

VMM HyperV
制御用 制御用

WCF

IIS
Windows Server

DDTK
(Dynamic Datacenter
Toolkit for Hosters)

クライアント

9
DDTKを使う

DDTK
(Dynamic Datacenter Toolkit for Hosters)とは
Hyper-VやSystem Centerを制御し、仮想環境を構築するた
めのベースとなるサンプルコード
C#ベースのソースコードが提供されており、

自由に改変可能
Webサービス(WCFで実装)で外部とのやり取りを行う
弊社の利用開始時点では

Hyper-V制御用とVMM制御用で分かれていた
10
Windowsを使った標準的な仮想環境

クラスター
VM VM VM VM

VM VM VM VM

VM VM VM VM

Hyper-V

Hyper-V

Hyper-V

Windows Server

Windows Server

Windows Server

VMM
Windows Server

11
DDTKの構成

クラスター
VM VM VM VM

VM VM VM VM

VM VM VM VM

Hyper-V

Hyper-V

Hyper-V

Windows Server

Windows Server

Windows Server

PowerShellで
コントロール

VMM

WMI
WMI

WMI

VMM HyperV
制御用 制御用

WCF

IIS
Windows Server

DDTK

クライアント

12
WCFとは
• Windows Communication Foundationの略
• .NETの通信テクノロジーの一つ
• 構成ファイル(*.config)を使ってプロトコルや細かいパラメータ
等を定義できる
• DDTKのインタフェースの実装に使用されている
DDTKは
WCFに対応した
サーバアプリケーション
として実装されている

WCF
アプリケーション

WCF
IIS

WCFクライアント
プログラムコード
.NET

Windows Server

13
DDTKの構成

クラスター
VM VM VM VM

VM VM VM VM

VM VM VM VM

Hyper-V

Hyper-V

Hyper-V

Windows Server

Windows Server

Windows Server

PowerShellで
コントロール

VMM

WMI
WMI

WMI

VMM HyperV
制御用 制御用

WCF

IIS
Windows Server

DDTK

クライアント

14
WMIとは
• Windows Management Instrumentationの略でWindowsをプロ
グラムコードで管理する機能
• 本セッションではHyper-Vをプログラムから制御するのに使用

VM VM VM VM

Hyper-V
Windows Server

WMI

プログラムコード
.NET,VBScript,
PowerShell

15
WMIのサンプルコード
• コンポーネントごとに分類された名前空間の中にいくつかのク
ラスが定義されており、そのクラスのインスタンスに対してプロ
パティを読み取ったり、メソッドを実行したりして制御する
• インスタンスの検索にSQLに似た言語が使える
virtualization名前空間
を使用

1:ManagementScope ms = new
ManagementScope(@"server¥root¥virtualization", co);
2:ManagementObjectSearcher mos = new
ManagementObjectSearcher(ms,
3:
new ObjectQuery(
4:
"select * from Msvm_ComputerSystem where "+
5:
"Caption='仮想マシン' and ElementName='VM'"));
6:ManagementObjectCollection moc = mos.Get();
vitualization名前空間の
Msvm_ComputerSystem
クラスからインスタンスを検索
16
WMIの名前空間
• WMIの名前空間は、WMIクラスのフォルダのようなもので、
管理対象のコンポーネントごとに分かれている

例
名前空間:CIMV2
CIM_Action
MSFT_WmiEssEvent
Win32_DiskPartition
・
・
・
WindowsOSを管理

名前空間:virtualization

名前空間:MSCluster

Msvm_ComputerSystem
Msvm_ConcreteJob
Msvm_StorageJob
・
・
・
Hyper-V
(Windows2008R2以前)を管理

MSCluster_Cluster
MSCluster_AvailableDisk
MSCluster_Event
・
・
・
Failover Clusterを管理

17
DDTKの構成

クラスター
VM VM VM VM

VM VM VM VM

VM VM VM VM

Hyper-V

Hyper-V

Hyper-V

Windows Server

Windows Server

Windows Server

PowerShellで
コントロール

WMI WMI WMI

VMM

VMM HyperV
制御用 制御用

WCF

IIS
Windows Server

DDTK

クライアント

18
DDTKの調査
DDTKのマニュアルには、前提とするシステム構成と

インストール方法しか書かれていない
DDTKのソースコードにはほとんどコメントがない
何ができて何ができないのか調査を実施
結果、以下のことが判明

多くの機能が不足している
ISOファイルのDVDマウント
VMからVHDファイルへのマウント
VMMの強制更新
など
19
不足機能を作りこみ
DDTKに不足している機能を作りこまなければならない
不足機能の作りこみで以下のポリシーとした

どちらでも実装可能な機能は
「VMM制御用」のDDTKに実装する

VMM

Hyper
V

Power
Shell

WMI

VMM
制御用

PowerShellの方が
WMIに比べて
実装しやすいため

HyperV
制御用

動作が安定しない

DDTK こちらを採用したら
不安定
20
DDTKの構成

クラスター
VM VM VM VM

VM VM VM VM

VM VM VM VM

Hyper-V

Hyper-V

Hyper-V

Windows Server

Windows Server

Windows Server

PowerShellで
コントロール

VMM

WMI
WMI

WMI

VMM HyperV
制御用 制御用

WCF

IIS
Windows Server

こちらを使用したら不安定

クライアント
21
VMMの更新遅延

原因
Hyper-Vの情報がVMMへ反映するのにかなり(数分~数十分)の
タイムラグがある
大きなタイムラグがあると、例えば、VMが停止している前提の操作を起動
中に行ってしまうことなどの問題が発生する
Refresh-VMという強制的に更新するコマンドで更新することは可
能だが、無闇に使うとVMが壊れることがある

VMM

Hyper
V

Power
Shell

WMI

VMM
制御用

HyperV
制御用

DDTK

どちらでも実装可能な機能は
Hyper-V対応に実装する
こちらに
実装

に方針を変更
22
Hyper-V制御用での実装の問題

Hyper-V制御用での実装で以下の問題が発生
VMが壊れたとVMMに誤認識されることがある
強制的に更新することで解消することもあるが、Hyper-Vのジョブが実行
中の場合、VMが本当に壊れることがある

処理が非同期の場合がある

Hyper-Vの
処理の単位

前の処理が完了しないうちに次の処理のリクエストを受け付け、前の処理
を中断して後の処理を実行することがある
VMM

Hyper-Vのジョブの
状態を確認しながら
VMを制御する

壊れたと
判断される

Hyper
V

Power
Shell

WMI

VMM
制御用

HyperV
制御用

非同期で
処理される

DDTK
23
DDTKの構成

クラスター
VM VM VM VM

VM VM VM VM

VM VM VM VM

Hyper-V

Hyper-V

Hyper-V

Windows Server

Windows Server

Windows Server

PowerShellで
コントロール

VMM

WMI
WMI

WMI

VMM HyperV
制御用 制御用

WCF

IIS
Windows Server

こちらを使用する

クライアント

ただし、ジョブの状態は確認
24
その他の注意点

①英語版のサンプルコードの利用の
注意点
②VMMから取れる情報の注意点

25
その他の注意点

①英語版のサンプルコードの利用の
注意点
②VMMから取れる情報の注意点

26
①英語版のサンプルコードの利用の注意点
• DDTK自身を始め、サンプルコードを検索すると、海外製で
あることが多いが、動かしても日本語環境では動かな
いことがある
• WMIやPowerShellなどで取れる キーワードが日本語
化されている(“VirtualMachine”→“仮想マシン”など)こと
があり、これキーワードとして検索しているコードは検索に
引っかからずに正常に処理されないことがある
• サンプルコードが動かない場合、まずは中で検索している
キーワードが日本語化されていないかを確認し、必要に応
じて置換する
ソースコードで
キーワードを検索している
箇所に注意!
27
その他の注意点

①英語版のサンプルコードの利用の
注意点
②VMMから取れる情報の注意点

28
②VMMから取れる情報の注意点
• VMMからは欲しいタイミングで欲しい情報が取得できない
ことがある
• 一見、欲しい情報が取得できたかに見えても、古い情報
だったり、期待したものと異なる場合がある

• 基本的にはHyper-Vから情報を取得 するようにし、
VMMから情報を取得する際にはVMM独自の情報に
限るなど、十分注意して使用するようにする 数分~数十分に
(特に順番系は注意!)
NICのアタッチの
順番など

DDTK
古い情報
順番が異なる

一回更新

VMM

Hyper-V
データベースに
情報を保持
29
IIJ GIOのハイパーバイザーを
2008R2から2012へ移行する

30
DDTKからSPFへ移行
2014年1月、パフォーマンスの向上や最大メモリサイズの増
加といった新機能を利用すべく、IIJ GIOのWindowsのハイ
パ ー バ イ ザ ー を Windows Server 2008R2 か ら Windows
Server 2012ベースへ移行した
最新の機能を取り入れ、且つ、短期間で高品質なシステムを
開発するため、SPFを使うことにした

Hyper-V 2.0

Hyper-V 3.0

WS2008R2

WS2012

VMM 2008R2

2012 VMM

WS2008R2

WS2012
31
SPFの構成

クラスター
VM VM VM VM

VM VM VM VM

VM VM VM VM

Hyper-V

Hyper-V

Hyper-V

Windows Server

Windows Server

Windows Server

System Center
VirtualMachineManager

PowerShell
スクリプト
SPF

OData

IIS
Windows Server
Windows Server
DDTKと異なり
独立したサーバ

クライアント
32
DDTKからSPFへ移行

SPF(Service Provider Foundation)とは
System Centerを制御し、仮想環境を構築するためのアプリ
ケーションでDDTKの後継とされる(が、サンプルコードでは
なく、実行可能なアプリケーション)
インタフェースはOData(Open Data Protocol)を使用
処理がPowerShellで記述されており、追加/変更が可能

33
ODataとは
• Open Data Protocol の 略 で 、 マ イ ク ロ ソ フ ト が 提 唱 す る
HTTP/RESTベースのプロトコル
• データの取得/更新などの操作を行うことができる
• デ ー タ の 操 作 に は Get ( 値 の 取 得 ) ,Post ( リ ソ ー ス の 作
成),Put(値の更新),Delete(リソースの削除)の4つのHTTPメ
ソッドを実行することにより制御
OData(SPF)でVMを操作する例
Getメソッド
Postメソッド

VM

VM

VMの情報

VMを作成
Deleteメソッド

Putメソッド

VM
VMの設定を変更

VM
VMを削除
34
SPFの構成

クラスター
VM VM VM VM

VM VM VM VM

VM VM VM VM

Hyper-V

Hyper-V

Hyper-V

Windows Server

Windows Server

Windows Server

System Center
VirtualMachineManager

PowerShell
スクリプト
SPF

OData

IIS
Windows Server

Windows Server

クライアント
35
SPFを使ったVM操作サンプル( VMのプロパティを更新)
1:Uri uri = new
Uri("http://server:8091/SC2012/VMM/microsoft.management.odat
a.svc/");
2:VMM vmm = new SPF.VMM(uri);
3:
4:// 対象のVMを取得する
5:var vm = (from v in vmm.VirtualMachines where v.ID == vmId
&& v.StampId == stampId select v).Single();
6:
7:// 値を更新する
8:vm.Description = "This is test VM.";
9:vmm.UpdateObject(vm);
10:vmm.SaveChanges();

36
SPFの大きな問題

①実装済みの機能が不足している

②Hyper-Vを直接制御できない

③fabricが管理する情報が取得できない

37
SPFの大きな問題

①実装済みの機能が不足している
エンドユーザ向けポータルの開発を主眼にした機能体系
クラウド管理者向けの機能がかなり不足している
(VMをキーにしたリソース検索など)

②Hyper-Vを直接制御できない

③fabricが管理する情報が取得できない

38
実装済みの機能が不足している問題

不足した機能はPowerShellのスクリプトを
改修/追加することで実装
既存の機能を改修する場合はSPFを構成するPowerShellスクリプトを
ここでは
改修
オブジェクトクラスのこと

パラメータの追加や、新しいエンティティを定義する場合にはODataの仕
様に従って2つのファイルSubsystem.mofおよびSubsystem.xmlを修
正
エンティティの定義

Subsystem.mof

エンティティの振る舞いの定義

Subsystem.xml

具体的な処理

SPFを構成
するファイル

PowerShellスクリプト
39
実装済みの機能が不足している問題

エンティティの定義

Subsystem.mof

エンティティの振る舞いの定義

Subsystem.xml

具体的な処理

SPFを構成
するファイル

PowerShellスクリプト
40
エンティティの定義(Subsystem.mof)(抜粋)
以下のようにエンティティを定義する
新しいエンティティやプロパティを追加する場合、変更する
class VMM_VirtualHardDisk
{
String Accessibility;
DateTime AddedTime;
String Description;
String Directory;
Boolean Enabled;
[Key, Required, EmbeddedInstance("EDM_GUID")] string ID;
[EmbeddedInstance("EDM_GUID")] string JobGroupId;
SInt64 MaximumSize;
DateTime ModifiedTime;
String Name;
[EmbeddedInstance("VMM_UserAndRole")] String Owner;
String OwnerSid;
[EmbeddedInstance("EDM_GUID")] string ParentDiskId;

41
実装済みの機能が少ない問題に対して

エンティティの定義

Subsystem.mof

エンティティの振る舞いの定義

Subsystem.xml

具体的な処理

SPFを構成
するファイル

PowerShellスクリプト
42
エンティティの振る舞いの定義(Subsystem.xml)(抜粋)
以下のようにXML形式でエンティティごとに呼び出す
PowerShellスクリプトとパラメータを定義
仮想ハードディスクのリソースのエンティティの振る舞いの定義
定義するエンティティ
<Class>
<Name>VMM_VirtualHardDisk</Name>
<CmdletImplementation>
Getを定義する
<Query>
ことを宣言
<Cmdlet>Get-GIOVirtualHardDisk2</Cmdlet>
<FieldParameterMap>
<Field>
呼び出すPowerShell
<FieldName>ID</FieldName>
スクリプト
<ParameterName>ID</ParameterName>
この例ではVirtualHardDisk
</Field>
に対して
<Field>
Getを実行した際に呼ばれる
<FieldName>VMId</FieldName>
スクリプト
<ParameterName>VMId</ParameterName>
</Field>
43
SPFの大きな問題

①実装済みの機能が少ない

②Hyper-Vを直接制御できない
VMMからでは制御できない機能もある

③fabricが管理する情報が取得できない

44
Hyper-Vを直接制御できない問題に対して

PowerShellはWMIが使えるので
(作りこめば)これを使うことで制御可能
VM VM VM VM

VM VM VM VM

VM VM VM VM

Hyper-V

Hyper-V

Hyper-V

Windows Server

Windows Server

Windows Server

WMI

WMI
WMI

PowerShell
スクリプト
VMM

SPF
IIS

Windows Server

Windows Server
45
SPFの大きな問題

①実装済みの機能が少ない

②Hyper-Vを直接制御できない

③fabricが管理する情報が取得できない
fabricはSystem Center 2012で初めて導入された概念で、VMMの仮想環境を
構成するリソースを一括管理する機能
仮想ネットワークアダプタのMACアドレスは
fabricのMACアドレスプールから割り当てられているので
MACアドレスも取得できない
46
fabric関連の情報が取得できない問題に対して

C#/VB.NETのDLLをPowerShellから
呼び出すことで、情報が取得できる
VM VM VM VM

VM VM VM VM

VM VM VM VM

Hyper-V

Hyper-V

Hyper-V

Windows Server

Windows Server

Windows Server

WMI

WMI
WMI
fabric
VMM

DLL
PowerShell
スクリプト
SPF
IIS

Windows Server

Windows Server
47
その他の問題点

①エンティティに定義されている
プロパティが取れない
②WCF(Webサービス)と
OData(REST)の差異
③WMIの名前空間が変更されている

48
その他の問題点

①エンティティに定義されている
プロパティが取れない
②WCF(Webサービス)と
OData(REST)の差異
③WMIの名前空間が変更されている

49
①エンティティに定義されているプロパティが取れない
• エンティティのプロパティの定義はあるのに、取得すると
値が空になっていることがある
• 大抵の場合はPowerShellのスクリプトを修正すれば取れ
るようになるが、fabric系の値のように、単純には 取得で
きない場合がある
• 設計の際には、クラスの仕様からだけでなく、実際に値が
取得できるか、事前に確認する
エンティティ:VirtualNetworkAdapter
ID
VirtualNetwork
MACAddress

XXXX-XXX・・・
・・・・・・・
null

Get
SPF
値が取れて
いない
50
その他の問題点

①エンティティに定義されている
プロパティが取れない
②WCF(Webサービス)と
OData(REST)の差異
③WMIの名前空間が変更されている

51
②WCF(Webサービス)とOData(REST)の差異
• WCF Webサービスでは、パラメータ付きでAPIを呼び出す
だけの単純なモデルであったが、ODataではエンティティに
対して4つの操作を行うモデルであるため、アクセス方法

が完全に異なる
• 2008から2012へ移行する場合、まじめに設計すると 、
インタフェース部分の改修にかなりの手間がかかること
を覚悟する
DDTKの場合
接続オブジェクト
インスタンス生成

API呼び出し

接続を閉じる

SPFの場合(更新)
接続オブジェクト
操作対象の
インスタンス生成 エンティティを取得

エンティティの
プロパティ変更

更新の指示

コミット

52
その他の問題点

①エンティティに定義されている
プロパティが取れない
②WCF(Webサービス)と
OData(REST)の差異
③WMIの名前空間が変更されている

53
③WMIの名前空間が変更されている
• WMIを呼び出す際、Windows2008と2012とでは、 名前
空 間 が 異 な り ( virtualization¥v2 ) 、 既 存 の 名 前 空 間
(virtualization)の使用は推奨されなくなった
• 新規でWindows2012用に開発する場合は問題ないが、
2008から移行する場合、virtualization名前空間で(大体は
動くが)動かない場合もあるので、注意が必要
virtualization
名前空間

virtualization
名前空間
推奨されない

Hyper-V 3.0
(WS2012)

Hyper-V 2.0
(WS2008R2)
プログラムコード

virtualization¥v2
名前空間

プログラムコード
54
WMIのサンプルコード

Windows2012では
virtualization¥v2名前空間
を使用

1:ManagementScope ms = new
2:
ManagementScope(@"server¥root¥virtualization¥v2", co);
3:ManagementObjectSearcher mos = new
4:ManagementObjectSearcher(ms,
5:
new ObjectQuery(
6:
"select * from Msvm_ComputerSystem where "+
7:
"Caption='仮想マシン' and ElementName='VM'"));
8:ManagementObjectCollection moc = mos.Get();

55
まとめ ~ Windows仮想マシンをソフトウェアで制御するための注意点
① VMMの制御はHyper-Vとのタイムラグに
注意する
② Hyper-Vの制御を安全に行うにはジョブを
確認する
③ SPFではfabricの値が取得できないので、
C#などで書いたDLLをPowerShellから呼
び出して取得する

56
参考
Hyper-V WMI Classes
http://msdn.microsoft.com/en-us/library/cc136986(v=vs.85).aspx

Dynamic Datacenter toolkit for Hosters
DDTK for Hostersホームページ
http://archive.msdn.microsoft.com/ddc
DDTK for Hostersサンプルコードのダウンロード
http://code.msdn.microsoft.com/DDTKH-Sample-Code-d0cb4152
SPF
Service Provider Foundationのアーキテクチャの概要
http://technet.microsoft.com/ja-jp/library/jj642897.aspx
VMMコレクションズリファレンス
http://msdn.microsoft.com/ja-JP/library/jj906381.aspx
Virtual PC guy
http://blogs.msdn.com/b/virtual_pc_guy/

57
ご清聴ありがとうございました
お問い合わせ先 IIJインフォメーションセンター
TEL:03-5205-4466 (9:30~17:30 土/日/祝日除く)
info@iij.ad.jp
http://www.iij.ad.jp/

58

Windows仮想マシンをソフトウェアで制御する~その実践と対策~