Não é possível usar kdump ou kexec para máquinas virtuais linux no Hyper-V

Este artigo fornece uma resolução para um problema em que kdump ou kexec não podem ser usados para máquinas virtuais linux no Hyper-V.

Aplica-se a: Windows Server 2012 R2, Windows Server 2008 R2 Service Pack 1
Número de KB original: 2858695

Sintomas

  • Pré-Windows Server 2012 R2

    Considere o seguinte cenário:

    • Você tem um computador baseado em R2 pré-Windows Server 2012 que tem a função Hyper-V instalada.

    • Você instala o Linux em uma máquina virtual Hyper-V no computador.

    • Você configura o kdump na máquina virtual do Linux.

      Observação

      A máquina virtual do Linux já tem os drivers do Linux Integration Services. Os drivers podem ser pré-criados ou instalados manualmente.

      Nesse cenário, se a máquina virtual linux falhar, o arquivo de despejo principal do kernel do Linux não será gerado conforme o esperado.

  • Windows Server 2012 R2

    Considere o seguinte cenário:

    • Você tem máquinas virtuais do Linux em Windows Server 2012 host R2 Hyper-V.

    • 15 ou mais vCPUs são anexados à máquina virtual do Linux.

    • Você configura o kdump na máquina virtual do Linux.

      Nesse cenário, o kdump não funciona e o despejo de falhas não é criado, pois o processo para de responder (trava).

Motivo

Esse problema ocorre porque o Hyper-V não pode hospedar duas conexões simultâneas do mesmo driver sintético, que está em execução dentro de uma máquina virtual.

Quando o kdump é configurado em uma máquina virtual linux que está usando o driver de armazenamento sintético do Linux Integration Services (também conhecido como storvsc), o kernel kexec é configurado para usar o mesmo driver. Se a máquina virtual linux falhar, o driver de armazenamento sintético hospedado no kernel kexec tentará abrir uma conexão com o provedor de armazenamento Hyper-V. No entanto, o Hyper-V não consegue estabelecer a nova conexão devido à conexão pré-existente com o mesmo driver de armazenamento na máquina virtual do Linux com falha. Portanto, o kernel kexec não pode despejar o núcleo da máquina virtual Linux com falha.

Resolução

Para resolve esse problema, configure o kernel kexec usando o driver de armazenamento Linux padrão. Essa configuração deve ser executada depois que a funcionalidade kdump estiver habilitada em uma máquina virtual do Linux. A ideia básica é desativar o driver de armazenamento do Linux Integration Services e habilitar o driver de armazenamento Linux padrão dentro do kernel kexec usando o parâmetro prefer_ms_hyper_v no arquivo de configuração apropriado.

O parâmetro prefer_ms_hyper_v pode ser usado para controlar o comportamento do driver de armazenamento linux padrão. Quando esse parâmetro é definido como 1 e a máquina virtual Linux está em execução no Hyper-V, o driver de armazenamento linux padrão desabilita a si mesmo e permite que o driver de armazenamento do Linux Integration Services controle os dispositivos de armazenamento. Ao definir o parâmetro prefer_ms_hyper_v como 0, o driver de armazenamento linux padrão pode funcionar. Como o driver de armazenamento linux padrão não requer uma conexão com o Hyper-V, o kernel kexec pode despejar núcleo.

Diferentes distribuições do Linux têm mecanismos ligeiramente diferentes para especificar o valor de prefer_ms_hyper_v. A seção a seguir descreve como o parâmetro pode ser definido para várias distribuições populares do Linux.

Red Hat Enterprise Linux (RHEL)

No RHEL 5.9, você precisa passar o parâmetro prefer_ms_hyper_v por meio de um argumento de linha de comando do kernel para o módulo ide_core integrado ao kernel RHEL 5.9. Por padrão, esse parâmetro é inicializado como 1 e faz com que a máquina virtual linux evite usar o módulo ide_core se estiver em execução em um ambiente Hyper-V. Os administradores precisam definir o valor do parâmetro prefer_ms_hyper_v como 0 para que o driver ide_core se torne operacional durante o processo de inicialização do kernel kexec.

No RHEL 6.4, você precisa passar o parâmetro prefer_ms_hyper_v para o módulo ata_piix driver.

Para fazer isso, altere o conteúdo de /etc/kdump.conf. Confira 11.10. Impedindo que os drivers de kernel carreguem para kdump para obter mais informações.

Ubuntu 12.04(.x)

No Ubuntu 12.04(. x), você precisa passar o parâmetro prefer_ms_hyper_v para o driver ata_piix. Você pode fazer alterando o conteúdo do arquivo /etc/init.d/kdump.

Para alterar o conteúdo do arquivo /etc/init.d/kdump, anexe ata_piix. prefer_ms_hyper_v=0 para as opções de linha de comando kdump:

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

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

Nas distribuições SLES 11 SP2(x), você precisa passar o parâmetro prefer_ms_hyper_v para o driver ata_piix. Você pode fazer isso modificando o conteúdo do arquivo /etc/sysconfig/kdump da seguinte maneira:

Append ata_piix.prefer_ms_hyper_v=0 para KDUMP_COMMANDLINE_APPEND:

KDUMP_COMMANDLINE_APPEND="ata_piix.prefer_ms_hyperv=0"

Após as edições necessárias, o arquivo /etc/sysconfig/kdump se parece com este:

KDUMP_COMMANDLINE_APPEND="ata_piix.prefer_ms_hyperv=0"

Mais informações

O KDUMP deve ser configurado da maneira padrão sugerida pelas distribuições do Linux.

Aviso de isenção de responsabilidade para informações de terceiros

Os produtos de terceiros mencionados neste artigo são produzidos por empresas independentes da Microsoft. A Microsoft não oferece nenhuma garantia, implícita ou não, do desempenho ou da confiabilidade desses produtos.