No se puede usar kdump ni kexec para máquinas virtuales Linux en Hyper-V

En este artículo se proporciona una solución a un problema en el que kdump o kexec no se pueden usar para máquinas virtuales Linux en Hyper-V.

Se aplica a: Windows Server 2012 R2, Windows Server 2008 R2 Service Pack 1
Número de KB original: 2858695

Síntomas

  • Pre-Windows Server 2012 R2

    Imagine la siguiente situación:

    • Tiene un equipo basado en R2 Windows Server 2012 que tiene instalado el rol de Hyper-V.

    • Instale Linux en una máquina virtual de Hyper-V en el equipo.

    • Puede configurar kdump en la máquina virtual Linux.

      Nota:

      La máquina virtual Linux ya tiene los controladores de Linux Integration Services. Los controladores se pueden crear previamente o instalar manualmente.

      En este escenario, si la máquina virtual Linux se bloquea, el archivo de volcado principal del kernel de Linux no se genera según lo previsto.

  • Windows Server 2012 R2

    Imagine la siguiente situación:

    • Tiene máquinas virtuales Linux en Windows Server 2012 host de Hyper-V de R2.

    • 15 o más vCPU están conectadas a la máquina virtual Linux.

    • Puede configurar kdump en la máquina virtual Linux.

      En este escenario, kdump no funciona y no se crea el volcado de memoria, porque el proceso deja de responder (se bloquea).

Causa

Este problema se produce porque Hyper-V no puede hospedar dos conexiones simultáneas desde el mismo controlador sintético, que se ejecuta dentro de una máquina virtual.

Cuando kdump está configurado en una máquina virtual Linux que usa el controlador de almacenamiento sintético de Linux Integration Services (también conocido como storvsc), el kernel kexec está configurado para usar el mismo controlador. Si la máquina virtual Linux se bloquea, el controlador de almacenamiento sintético hospedado en el kernel kexec intenta abrir una conexión con el proveedor de almacenamiento de Hyper-V. Sin embargo, Hyper-V no puede establecer la nueva conexión debido a la conexión preexistente con el mismo controlador de almacenamiento en la máquina virtual Linux bloqueada. Por lo tanto, el kernel kexec no puede volcar el núcleo de la máquina virtual Linux bloqueada.

Solución

Para resolver este problema, configure el kernel kexec mediante el controlador de almacenamiento estándar de Linux. Esta configuración debe realizarse después de habilitar la funcionalidad kdump en una máquina virtual Linux. La idea básica es desactivar el controlador de almacenamiento de Linux Integration Services y, a continuación, habilitar el controlador de almacenamiento estándar de Linux dentro del kernel kexec mediante el parámetro prefer_ms_hyper_v en el archivo de configuración adecuado.

El parámetro prefer_ms_hyper_v se puede usar para controlar el comportamiento del controlador de almacenamiento estándar de Linux. Cuando este parámetro se establece en 1 y la máquina virtual Linux se ejecuta en Hyper-V, el controlador de almacenamiento estándar de Linux se deshabilita y permite que el controlador de almacenamiento de Linux Integration Services controle los dispositivos de almacenamiento. Al establecer el parámetro prefer_ms_hyper_v en 0, el controlador de almacenamiento estándar de Linux puede funcionar. Dado que el controlador de almacenamiento estándar de Linux no requiere una conexión a Hyper-V, el kernel kexec puede volcar el núcleo.

Las distintas distribuciones de Linux tienen mecanismos ligeramente diferentes para especificar el valor de prefer_ms_hyper_v. En la sección siguiente se describe cómo se puede establecer el parámetro para varias distribuciones populares de Linux.

Red Hat Enterprise Linux (RHEL)

En RHEL 5.9, debe pasar el parámetro prefer_ms_hyper_v a través de un argumento de línea de comandos del kernel al módulo ide_core integrado en el kernel de RHEL 5.9. De forma predeterminada, este parámetro se inicializa en 1 y hace que la máquina virtual Linux evite usar el módulo ide_core si se ejecuta en un entorno de Hyper-V. Los administradores tienen que establecer el valor del parámetro prefer_ms_hyper_v en 0 para que el controlador de ide_core esté operativo durante el proceso de arranque del kernel kexec.

En RHEL 6.4, debe pasar el parámetro prefer_ms_hyper_v al módulo del controlador de ata_piix .

Para ello, cambie el contenido de /etc/kdump.conf. Consulte la versión 11.10. Impedir que los controladores de kernel se carguen para kdump para obtener más información.

Ubuntu 12.04(.x)

En Ubuntu 12.04(. x), debe pasar el parámetro prefer_ms_hyper_v al controlador de ata_piix. Para ello, cambie el contenido del archivo /etc/init.d/kdump.

Para cambiar el contenido del archivo /etc/init.d/kdump, anexe ata_piix. prefer_ms_hyper_v=0 a las opciones de línea de comandos kdump:

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)

En las distribuciones de SLES 11 SP2(x), debe pasar el parámetro prefer_ms_hyper_v al controlador de ata_piix. Para ello, modifique el contenido del archivo /etc/sysconfig/kdump de la siguiente manera:

Anexe ata_piix.prefer_ms_hyper_v=0 a KDUMP_COMMANDLINE_APPEND:

KDUMP_COMMANDLINE_APPEND="ata_piix.prefer_ms_hyperv=0"

Después de las modificaciones necesarias, el archivo /etc/sysconfig/kdump tiene este aspecto:

KDUMP_COMMANDLINE_APPEND="ata_piix.prefer_ms_hyperv=0"

Más información

KDUMP debe configurarse de la manera estándar que sugieren las distribuciones de Linux.

Aviso de declinación de responsabilidades sobre la información de terceros

Los productos de otros fabricantes que se mencionan en este artículo han sido creados por compañías independientes de Microsoft. Microsoft no ofrece ninguna garantía, ya sea implícita o de otro tipo, sobre la confiabilidad o el rendimiento de dichos productos.