Hyper-V で Linux 仮想マシンに kdump または kexec を使用できない

この記事では、Hyper-V 上の Linux 仮想マシンに kdump または kexec を使用できない問題の解決策について説明します。

適用対象: Windows Server 2012 R2、Windows Server 2008 R2 Service Pack 1
元の KB 番号: 2858695

現象

  • プリWindows Server 2012 R2

    次のような状況で問題が発生します。

    • Hyper-V の役割がインストールされている事前Windows Server 2012 R2 ベースのコンピューターがあります。

    • コンピューター上の Hyper-V 仮想マシンに Linux をインストールします。

    • Linux 仮想マシンで kdump を構成します。

      注:

      Linux 仮想マシンには、Linux Integration Services ドライバーが既に用意されています。 ドライバーは、事前構築済みまたは手動でインストールできます。

      このシナリオでは、Linux 仮想マシンがクラッシュした場合、Linux カーネルからのコア ダンプ ファイルは期待どおりに生成されません。

  • Windows Server 2012 R2

    次のような状況で問題が発生します。

    • Windows Server 2012 R2 Hyper-V ホスト上に Linux 仮想マシンがあります。

    • 15 個以上の vCPU が Linux 仮想マシンに接続されています。

    • Linux 仮想マシンで kdump を構成します。

      このシナリオでは、kdump は機能せず、プロセスが応答を停止 (ハング) するため、クラッシュ ダンプは作成されません。

原因

この問題は、Hyper-V が、仮想マシン内で実行されている同じ合成ドライバーから 2 つの同時接続をホストできないために発生します。

Linux Integration Services 合成ストレージ ドライバー (storvsc とも呼ばれます) を使用している Linux 仮想マシンで kdump が構成されている場合、kexec カーネルは同じドライバーを使用するように構成されます。 Linux 仮想マシンがクラッシュした場合、kexec カーネルでホストされている合成ストレージ ドライバーは、Hyper-V ストレージ プロバイダーへの接続を開こうとします。 ただし、Hyper-V は、クラッシュした Linux 仮想マシン上の同じストレージ ドライバーへの既存の接続のため、新しい接続の確立に失敗します。 したがって、kexec カーネルは、クラッシュした Linux 仮想マシンのコアをダンプできません。

解決方法

この問題を解決するには、標準の Linux ストレージ ドライバーを使用して kexec カーネルを構成します。 この構成は、Linux 仮想マシンで kdump 機能が有効になった後に実行する必要があります。 基本的な考え方は、Linux Integration Services ストレージ ドライバーをオフにしてから、適切な構成ファイルの prefer_ms_hyper_v パラメーターを使用して、kexec カーネル内で標準の Linux ストレージ ドライバーを有効にすることです。

prefer_ms_hyper_v パラメーターを使用して、標準の Linux ストレージ ドライバーの動作を制御できます。 このパラメーターを 1 に設定し、Linux 仮想マシンが Hyper-V で実行されている場合、標準の Linux ストレージ ドライバーはそれ自体を無効にし、Linux Integration Services ストレージ ドライバーがストレージ デバイスを制御できるようにします。 prefer_ms_hyper_v パラメーターを 0 に設定すると、標準の Linux ストレージ ドライバーが機能できます。 標準の Linux ストレージ ドライバーは Hyper-V への接続を必要としないため、kexec カーネルはコアをダンプできます。

Linux ディストリビューションによって、prefer_ms_hyper_vの値を指定するメカニズムが若干異なります。 次のセクションでは、いくつかの一般的な Linux ディストリビューションにパラメーターを設定する方法について説明します。

Red Hat Enterprise Linux (RHEL)

RHEL 5.9 では、 prefer_ms_hyper_v パラメーターをカーネル コマンド ライン引数を使用して、RHEL 5.9 カーネルに組み込まれている ide_core モジュールに渡す必要があります。 既定では、このパラメーターは 1 に初期化され、Linux 仮想マシンが Hyper-V 環境で実行されている場合、ide_core モジュールの使用を回避します。 管理者は、 kexec カーネル ブート プロセス中にide_core ドライバーが動作するように、prefer_ms_hyper_v パラメーター値を 0 に設定する必要があります。

RHEL 6.4 では、ata_piix ドライバー モジュールprefer_ms_hyper_v パラメーターを渡す必要があります。

そのためには、/etc/kdump.conf の内容を変更します。 11.10 を参照してください。詳細については、カーネル ドライバーによる kdump の読み込みを防止します。

Ubuntu 12.04(.x)

Ubuntu 12.04(. x) は、ata_piix ドライバーに prefer_ms_hyper_v パラメーターを渡す必要があります。 これを行うには、/etc/init.d/kdump ファイルの内容を変更します。

/etc/init.d/kdump ファイルの内容を変更するには、ata_piixを追加します。 kdump コマンド ライン オプションにprefer_ms_hyper_v=0。

do_start {}
{
    ....  
    ....  
    APPEND="$APPEND kdump_needed maxcpus=1 irqpoll reset_devices ata_piix.prefer_ms_hyperv=0"  
    ...  
}

SUSE Linux Enterprise Server (SLES) 11 SP2(x)

SLES 11 SP2(x) ディストリビューションでは、prefer_ms_hyper_v パラメーターを ata_piix ドライバーに渡す必要があります。 これを行うには、/etc/sysconfig/kdump ファイルの内容を次のように変更します。

KDUMP_COMMANDLINE_APPENDに ata_piix.prefer_ms_hyper_v=0 を追加します。

KDUMP_COMMANDLINE_APPEND="ata_piix.prefer_ms_hyperv=0"

必要な編集後、/etc/sysconfig/kdump ファイルは次のようになります。

KDUMP_COMMANDLINE_APPEND="ata_piix.prefer_ms_hyperv=0"

詳細

KDUMP は、Linux ディストリビューションで推奨される標準の方法で構成する必要があります。

サードパーティの情報に関する免責事項

この資料に記載されているサードパーティ製品は、マイクロソフトと関連のない他社の製品です。 明示的か黙示的かにかかわらず、これらの製品のパフォーマンスや信頼性についてマイクロソフトはいかなる責任も負わないものとします。