Linux on Hyper-V 最新情報(2012年1月) の補足 (続き)
前回に引き続き、「Linux Integration Services for Hyper-V (Linux IS)」と GPLv2 版の「Microsoft Hyper-V drivers」(linux-3.3 に統合される予定。2/9 に rc3 が出ています。→ www.kernel.org) の機能について説明します。前回は、 仮想マシンバス (VMBus) とストレージ (SCSI) とネットワーク (Networking) の VSC (Virtualization Service Client) について説明しました。今回は、Mouse、Time Synchronization、Operating syste shutdown、Heartbeat、Data Exchange です。
マウス連携とは、ホストOSのデスクトップと仮想マシン接続ウィンドウに表示されたゲストOSのデスクトップ(GUI環境)の間で、マウスカーソルをシームレスに移動できる機能です。linux-3.3-rc1 (rc3でも同じ、以下同) に含まれる Microsoft Hyper-V drivers には、マウス連携のための「hid_hyperv」が含まれます(以前は hv_mouse という名前でした)。Linux IS v3.2 (RHEL 6.x、CentOS 6.x 用) には hv_mouse という名前です。Linux IS v2.1 (SLES 10、RHEL 5.x、CentOS 5.x 用) にはマウス連携機能は含まれませんが、 Citrix Project Satori (inputvsc) で対応できます。
マウス連携が利用できない場合、仮想マシン接続 (VMConnect) ウィンドウ内のマウスを解放するには、Ctrl+Alt+← キーを押します。リモートデスクトップ接続のセッション内で仮想マシン接続ウィンドウを使用する場合、ウィンドウ内でマウスは使えません。
マウス連携が利用できる場合、仮想マシン接続ウィンドウのスタータスバーのメッセージが消えます。

Time Synchronization
ゲストOSのシステム時刻をホストOSの時刻に同期する機能です。Microsoft Hyper-V driversでは、「hv_utils」に時刻同期機能が含まれます。WindowsとLinuxでは、時刻のカウント方法が異なるため、時刻同期機能が無いと時間にズレが生じる可能性があります。時刻同期機能は、その時刻のズレを自動訂正してくれます。
また、保存された状態やスナップショットからの開始時に、自動的に正しい時刻に調整してくれます。稼働中の時刻訂正は NTP などでもできるので、こちらの復元時の日付&時刻訂正のほうが重要だと思います。
なお、時刻同期機能は、正確な時刻を取得するために hv_timesouce (Linux IS v2.1) または adjtimex (Linux IS v3.2、Microsoft Hyper-V Drivers) を使用します。
ホストOS側(Hyper-Vマネージャーや仮想マシン接続のインターフェイスや、WMIインターフェイスなどから)から、仮想マシンのゲストOSのシャットダウンを開始する機能です。Microsoft Hyper-V drivers と Linux IS v3.2 では、「hv_utils」にシャットダウン連携機能が含まれます。
シャットダウン連携機能が利用できない場合、ホスト側からのシャットダウン開始はエラーになります。

Heartbeat
仮想マシンのゲストOSが稼働していることを示すハートビートを生成して、ホストに提供します。Microsoft Hyper-V driversでは、「hv_utils」にハートビート機能が含まれます。ハートビートをサポートしない(または受信できない)場合、「コンタクトなし」と表示されます。ハートビートが確認できると、「OK」と表示されます。
ハートビートは、次の WMI クラスを使用してホスト側から取得することもできます。
Msvm_HeartbeatComponent Class
[URL] http://msdn.microsoft.com/en-us/library/cc136840(VS.85).aspx
KVP (Key Value Pair) データ交換サービスのことです。Microsoft Hyper-V driversでは、「hv_utils」にKVPのサポートが含まれます。ただし、「hv_utils」だけでは機能せず、ゲストOSの情報を収集して、問い合わせに応答する「hv_kvp_daemon」というサービスが必要です。linux-3.3-rc1の場合、ソースコードの「/tools/hv/hv_kvp_daemon.c」にサービスのソースコードがあります。Linux IS v3.2 でも、「hv_utils」と「hv_kvp_daemon」でサポートされます。Linux v2.1 ではサポートされません。
ホスト側から仮想マシンのKVPデータにアクセスするには、次の WMI クラスを使用できます。
Msvm_KvpExchangeComponent Class
[URL] http://msdn.microsoft.com/en-us/library/cc136848(v=vs.85).aspx
以下のVBScript「hvvminfo.vbs」(実行例は上のスクリーンショット) は、私が作成したKVPデータ取得スクリプトのサンプルです。
──────────────────────────────────────
Option Explicit
Dim arg, targetVM, WMIService, VMs, InputKey
Dim KVP, xml, guestData, xpath, node, guestDataStr
If Right((LCase(WScript.FullName)),11) <> "cscript.exe" then
WScript.Echo "このスクリプトはCSCRIPT.EXEを使用して実行して下さい。"
WScript.Quit
End if
Set arg = WScript.Arguments
if arg.Count = 0 then
WScript.StdOut.Write "仮想マシン名を入力して下さい: "
InputKey = Trim(WScript.StdIn.ReadLine)
If InputKey <> "" then
targetVM = InputKey
Else
WScript.Echo "仮想マシン名が入力されませんでした。中止します。"
WScript.Quit
End If
else
targetVM = arg(0)
end if
Set WMIService = GetObject("winmgmts:\\.\root\virtualization")
Set VMs = WMIService.ExecQuery("SELECT * FROM Msvm_ComputerSystem WHERE ElementName='" & targetVM & "'")
if VMs.Count < 1 then
WScript.Echo targetVM & " が見つかりません。"
WScript.Quit
end if
Select Case VMs.ItemIndex(0).EnabledState
Case 2 '実行中
Set KVP = (VMs.ItemIndex(0).Associators_("Msvm_SystemDevice", "Msvm_KvpExchangeComponent")).ItemIndex(0)
Set xml = CreateObject("Microsoft.XMLDOM")
xml.async = false
guestDataStr = ""
for each guestData in KVP.GuestIntrinsicExchangeItems
xml.loadXML(guestData)
xpath = "/INSTANCE/PROPERTY[@NAME='Name']/VALUE/child:text()"
set node = xml.selectSingleNode(xpath)
guestDataStr = guestDataStr & node.Text & ": "
xpath = "/INSTANCE/PROPERTY[@NAME='Data']/VALUE/child:text()"
set node = xml.selectSingleNode(xpath)
if node is nothing then
guestDataStr = guestDataStr & "---" & vbCrLf
else
guestDataStr = guestDataStr & node.Text & vbCrLf
end if
Set node = nothing
next
WScript.Echo
WScript.Echo "仮想マシン名 " & targetVM & " のゲスト OS の情報"
WScript.Echo "------------------------------------------------------------------------------"
if guestDataStr <> "" then
WScript.Echo guestDataStr
WScript.Echo
else
WScript.Echo targetVM & " は完全に起動していないか、ゲスト コンポーネントが動作していません。"
end if
Case Else
WScript.Echo targetVM & " は実行中でないため、ゲスト OS の情報を取得できません。"
End Select
──────────────────────────────────────