Hyper-V 環境におけるゲスト OS のクラッシュダンプ採取手順について

こんにちは。Windows プラットフォームサポートの林です。

本日は Hyper-V 環境における手動でのゲスト OS のクラッシュダンプ採取手順についてご説明致します。

手動でのゲスト OS のダンプ採取手順は本来は通常の物理環境と差異がなく、ダンプキー(右 Ctrl キー + Scroll Lock キー x 2回)をゲスト OS へ入力することでハング時などはクラッシュさせることができます。しかし、ダンプキーをゲスト OS へ送るには仮想環境の場合、仮想マシン接続でゲスト OS に接続し、仮想マシン接続に Window フォーカスが合っている状態でダンプキーをホスト OS から入力する必要があります。そしてこの場合、Window フォーカスが仮想マシン接続に合っているかどうか視覚的にわかりにくく、誤ってホスト OS にダンプキーが入ってしまうというリスクがありました。そこで今回はこのような方法ではなく、スクリプトや PowerShell のコマンドレットでダンプキーや NMI を安全にゲスト OS に送信してゲストをクラッシュさせる方法をご案内致します。

手動でゲスト OS をクラッシュさせる手順は Hyper-V ホストのバージョンに依存しており、ホスト OS が Windows Server 2012 R2 以降とそれ以前の OS で手順が異なります。

1. ホスト OS が Windows Server 2012 R2 以降の場合

  • Windows Server 2012 R2 からは Debug-VM という PowerShell のコマンドレットにて NMI をソフトウェア的にゲスト OS へ送ることができるようになっております。そのため、ゲスト OS 内で NMI 受信時にクラッシュする設定を行い、ゲスト OS ハング時などには Debug-VM を使って手動でクラッシュさせメモリダンプを採取します。

2. ホスト OS が Windows Server 2008 / 2008 R2 / 2012 の場合

  • Windows Server 2012 R2 以前の場合には Debug-VM コマンドがありませんので、VBScript 等にてダンプキー(右 Ctrl キー + Scroll Lock キー x 2回)をソフトウェア的にゲスト OS へ送ることで安全にゲスト OS をクラッシュさせることができます。

以下、上記それぞれの具体的なダンプ採取事前設定および手動でのクラッシュダンプ採取手順となります。

ゲスト OS 完全メモリダンプ設定および採取手順(ホストOS が Windows Server 2012 R2 以降の場合)

=========================
完全メモリダンプ設定手順
=========================

[作業対象ホスト]
ゲストOS

[再起動の必要性]
ゲストOS の再起動が必要

[作業タイミング]
現象発生前の任意のタイミング

注意:下記作業は "ゲスト OS" 内で実施お願いいたします。

1. PageFile の大きさを 物理メモリ + 300 Mbyte の大きさに設定します。
例えば、物理メモリ 8192 MB( 8 GB)を搭載の場合は、初期サイズに 8492 MB 以上を設定します。

a) [スタート] - [コンピュータ] を右クリックし [プロパティ(R)] をクリックします。
b) [システムの詳細設定(A)] をクリックします。
c) [詳細設定] タブの [パフォーマンス] にある [設定(S)] をクリックします。
d) [詳細設定] タブの [仮想メモリ] の項目にある [変更(C)] ボタンをクリックします。
e) この画面にて、[すべてのドライブのページング ファイルのサイズを自動的に管理する(A)]
オプションを外します。
f) システムボリューム (通常 C: ) をクリックします。
g) [カスタムサイズ] にチェックを付け、[初期サイズ]、[最大サイズ] の両方に物理メモリ + 300 Mbyte
以上の値を入力します。 (例えば 4096MB メモリの場合、4396MB)
h) その後 [設定] ボタンをクリックし設定を反映させ [OK] ボタンをクリックします。
i) "変更結果はコンピューターを再起動しなければ有効になりません。" というポップアップが
表示されますので、[OK] ボタンをクリックします。
j) "パフォーマンス オプション" のウィンドウも [OK] ボタンにて閉じます。

2. 完全メモリ ダンプ (Full Dump) および NMI 受信時にクラッシュするよう
レジストリ設定します。

a) 「Windows ロゴ キー + R」キーを入力し "ファイル名を指定して実行" のウィンドウを
表示させます。
b) "regedit" と入力し、[OK] ボタンをクリックします。

c) レジストリ エディタが起動しますので下記のレジストリを設定してください。

キー: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\CrashControl
値: CrashDumpEnabled
タイプ: REG_DWORD
設定値: 1

d) ゲストが Windows Server 2008 R2/Windows 7 もしくはそれ以前の場合には
同じく上記キーに NMICrashDump というレジストリを作成します。

キー: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\CrashControl
値: NMICrashDump
タイプ: REG_DWORD
設定値: 1

   注意: ゲストが Windows 8/Windows Server 2012 以降の場合には上記 NMICrashDump
         を設定する必要はありません。

3. ゲスト OS を再起動し、上記設定変更を反映させます。

以上で完全メモリダンプの設定は終了になります。現象発生時に下記の
「完全メモリダンプ取得手順」にてダンプをご取得お願いいたします。

========================
完全メモリダンプ取得手順
========================

[作業対象ホスト]
ホストOS

[取得タイミング]
現象発生時

[採取ファイル]
%systemroot%\Memory.dmp

[ダンプ取得手順]

以下の手順を "現象発生時に" 管理者権限のあるユーザにて "ホスト OS" 上で実行します。

1. "ホスト OS" 上で管理者権限のある PowerShell プロンプトを起動し、以下のように
debug-vm コマンドで NMI をゲスト OS へ送信します。

debug-vm -name [仮想マシン名] -InjectNonMaskableInterrupt -Confirm:$false -Force

2. ゲスト OS はクラッシュしますので、ゲストの再起動後にログオンし、
以下のダンプファイルを採取します。

C:\Windows\Memory.dmp

Hyper-V ゲストOS の完全ダンプ取得手順(ホスト OS が Windows Server 2008/2008 R2/2012の場合)

=========================
完全メモリダンプ設定手順
=========================

[作業対象ホスト]
ゲストOS

[再起動の必要性]
ゲストOS の再起動が必要

[作業タイミング]
現象発生前の任意のタイミング

注意:下記作業は "ゲスト OS" 内で実施お願いいたします。

1. PageFile の大きさを 物理メモリ + 300 Mbyte 以上の大きさに設定します。
例えば、物理メモリ 8192 MB( 8 GB)を搭載の場合は、初期サイズに 8492 MB 以上を設定します。

a) [スタート] - [コンピュータ] を右クリックし [プロパティ(R)] をクリックします。
b) [システムの詳細設定(A)] をクリックします。
c) [詳細設定] タブの [パフォーマンス] にある [設定(S)] をクリックします。
d) [詳細設定] タブの [仮想メモリ] の項目にある [変更(C)] ボタンをクリックします。
e) この画面にて、[すべてのドライブのページング ファイルのサイズを自動的に管理する(A)]
オプションを外します。
f) システムボリューム (通常 C: ) をクリックします。
g) [カスタムサイズ] にチェックを付け、[初期サイズ]、[最大サイズ] の両方に物理メモリ + 1 Mbyte
以上の値を入力します。 (例えば 4096MB メモリの場合、4396MB)
h) その後 [設定] ボタンをクリックし設定を反映させ [OK] ボタンをクリックします。
i) "変更結果はコンピューターを再起動しなければ有効になりません。" というポップアップが
表示されますので、[OK] ボタンをクリックします。
j) "パフォーマンス オプション" のウィンドウも [OK] ボタンにて閉じます。

2. 完全メモリ ダンプ (Full Dump) を設定します。

a) 「Windows ロゴ キー + R」キーを入力し "ファイル名を指定して実行" のウィンドウを
表示させます。
b) "regedit" と入力し、[OK] ボタンをクリックします。
c) レジストリ エディタが起動しますので下記のレジストリを設定してください。

キー: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\CrashControl
値: CrashDumpEnabled
タイプ: REG_DWORD
設定値: 1

3. キーボードから STOP エラーを発生させるように設定します。
上記同様にレジストリ エディタで下記のレジストリを新規作成してください。

キー: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters
値: CrashOnCtrlScroll
タイプ: REG_DWORD
設定値: 1

4. ゲスト OS を再起動し、上記設定変更を反映させます。

以上で完全メモリダンプの設定は終了になります。現象発生時に下記の
「完全メモリダンプ取得手順」にてダンプをご取得お願いいたします。

========================
完全メモリダンプ取得手順
========================

[作業対象ホスト]
ホストOS

[取得タイミング]
現象発生時

[採取ファイル]
%systemroot%\Memory.dmp

以下の手順を "現象発生時に" 管理者権限のあるユーザにて "ホスト OS" 上で実行します。

1. 下記の DumpVM.txt の内容を拡張子 vbs で保存してください。(DumpVM.vbs で保存)
ホスト OS のデスクトップに配置してください。

DumpVM.txt

2. 管理者権限のあるコマンドプロンプトにて下記のようにスクリプトを実行します。

> cd %userprofile%\desktop
> cscript DumpVM.vbs  -v "My VM Name"

※ "My VM Name" はダンプを取得するゲスト OS 名です。VM名にスペースを含む場合は
上記例のように必ずダブルコーテーションで括ってください。

上記実施後、ゲスト OS はブルースクリーンになり、システムダンプが取得されます。

- ご参考 -
NMI_HARDWARE_FAILURE error when an NMI is triggered on Windows 8 and Windows Server 2012
https://support.microsoft.com/en-us/kb/2750146

How to generate a complete crash dump file or a kernel crash dump file by using an NMI on a Windows-based system
https://support.microsoft.com/en-us/kb/927069

How to determine the appropriate page file size for 64-bit versions of Windows
https://support.microsoft.com/en-us/kb/2860880

Debug-VM
https://technet.microsoft.com/ja-jp/library/dn464280(v=wps.630).aspx