Linux on Hyper-V 最新情報(2012年1月) の補足 (続き)|Windows Server|ブログ|Computerworld

header_cwr_head_mid_fl_logo

CW_ウルトラバナー_Topics04

CW_ウルトラバナー_Topics05

CW_ウルトラバナー_Topics06

CW_ウルトラバナー_Topics07

CW_ウルトラバナー_Topics08

Windows Server

Linux on Hyper-V 最新情報(2012年1月) の補足 (続き)

Posted by 山市良 ( 2012年02月13日 )

前回に引き続き、「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 です。

Mouse

マウス連携とは、ホスト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) を使用します。

Operating system shutdown

ホスト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


Data Exchange

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

──────────────────────────────────────

ページの先頭へ戻る