GNU/Linux >> Tutoriales Linux >  >> Linux

Linux:¿habilitar Iommu en el kernel para el paso de tarjetas gráficas?

Pregunta corta:

¿Cómo puedo activar intel_iommu? configuración en el kernel de Linux? Ejecuto un host Debian, usando el gestor de arranque grub2. La documentación que he visto dice que edite /boot/grub/menu.lst , que parece ser relevante solo para grub 1.x, ya que no tengo ese archivo.

Tengo entendido (y la última opción que se me ocurre) que cambiar esta opción de arranque podría eliminar el siguiente mensaje de error en /var/log/kern.log

vboxpci: No IOMMU domain (attach)

Pregunta larga:

Otorgar acceso directo a la tarjeta gráfica a un sistema operativo invitado

Recientemente me di cuenta de que es posible pasar a través de un dispositivo PCI-express a sistemas operativos invitados que se ejecutan en Virtualbox. Genial, pensé! Tengo dos tarjetas gráficas NVIDIA Quadro FX (con conexión de puente SLI en su lugar, que espero no esté causando problemas) y me gustaría dedicar la segunda tarjeta gráfica al sistema operativo invitado, para poder usar las funciones de OpenGL dentro Photoshop y otros

NVIDIA comercializa esta configuración "SLI Multi-OS", que es básicamente lo que he querido configurar durante mucho tiempo, pero no quiero gastar más de un gran dinero en el software de virtualización (parallels workstation extreme), cuando he estado utilizando VirtualBox bastante felizmente desde hace años.

Sistema anfitrión

Estoy ejecutando linux-3.5.0-19 desde los repositorios de Debian, en un equipo de estación de trabajo bastante avanzado (asus P6T7 WS Supercomputer mobo con chipset Intel ICH10R y CPU Xeon W3680) y me gustaría activar la compatibilidad con IOMMU en el kernel , preferiblemente sin tener que compilarlo yo mismo.

BIOS

En la configuración del BIOS, tengo habilitada la compatibilidad con VT-x y VT-d. Sin embargo, no pude ver nada que mencionara específicamente a IOMMU.

Conexión del dispositivo PCI

¡Esto fue gratamente sorprendentemente simple! La documentación oficial de VirtualBox está aquí. Lo que hice, que encontré menos ambiguo, fue abrir nvidia-settings , seleccione la tarjeta gráfica secundaria y anote el Bus ID ("PCI:5:0:0" en mi caso). Luego, desde la línea de comando del host:-

VBoxManage modifyvm "Windows Guest" --pciattach 05:00.0

(Cuando ejecuté esto por primera vez, hubo un error porque VirtualBox estaba emulando un conjunto de chips PIIX; decía que el paso de PCI solo funciona con conjuntos de chips ICH9. Así que cambié el conjunto de chips a ICH9 en la configuración del sistema VirtualBox VM y encendí el invitado para instalar los nuevos controladores necesarios. Un reinicio más tarde y todo funcionaba bien, así que apagué el invitado y volví a ejecutar el comando).

No hubo resultados y volví a la línea de comandos casi de inmediato.

Uso de GPU host desde el invitado

Antes de activar el invitado, primero reinicié la máquina host, en caso de que sucediera algo no documentado en el kernel, mediante virtualbox-dkms. Como ejecuté el comando anterior sin sudo Sin embargo, dudo que se hayan realizado cambios.

La próxima vez que inicié el invitado, Windows Update comenzó a hacer lo suyo y detectó e instaló automáticamente los controladores NVIDIA correctos. Todo se ve bien hasta ahora. Sin embargo, antes de poder usar el dispositivo, tuve que reiniciar el invitado...

Problema

Ahora que los controladores de la tarjeta gráfica están instalados en el invitado y el dispositivo PCI está conectado, no puedo acceder al escritorio de Windows. Llego a la pantalla de inicio de sesión de Windows, luego, después de iniciar sesión, la pantalla se congela, solo dice "Bienvenido", con un círculo azul que debería estar girando pero no está al lado.

Relacionado:Linux:¿cómo decide Linux sobre una aplicación predeterminada?

En /var/log/kern.log , los últimos mensajes impresos son:-

vboxpci: vboxPciOsDevInit: dev=500
vboxpci: detected device: 10de:05ff at 05:00.0, driver pci-stub
vboxpci: vboxPciOsDevInit: dev=500 pdev=ffff88061bea0000
pci-stub 0000:05:00.0: irq 76 for MSI/MSI-X
vboxpci: enabled MSI
500: linux vboxPciOsDevGetRegionInfo: reg=0
got mmio region: fa000000:16777216
500: linux vboxPciOsDevGetRegionInfo: reg=1
got mmio region: d0000000:268435456
500: linux vboxPciOsDevGetRegionInfo: reg=3
got mmio region: f8000000:33554432
500: linux vboxPciOsDevGetRegionInfo: reg=5
got pio region: 8c00:128
500: linux vboxPciOsDevGetRegionInfo: reg=6
got mmio region: fb980000:524288
got PCI IRQ: 76
device eth0 entered promiscuous mode
power state: 0
vboxpci: No IOMMU domain (attach)

¿Alguna idea de cómo solucionar esto?

ACTUALIZACIÓN:

Tengo el kernel arrancando ahora con intel_iommu=on , pero las cosas aún no funcionan del todo. Después de reiniciar el host, el invitado se inicia, inicia sesión correctamente y todo parece como antes de iniciar nada de esto. Mi segunda tarjeta gráfica no genera nada.

En el Administrador de dispositivos, hay un signo de exclamación junto al dispositivo Quadro FX y hay un código de error de 12 en las propiedades del dispositivo, con un mensaje que dice "Este dispositivo no puede encontrar suficientes recursos libres". Más descripción en technet.microsoft.com.

En el registro del kernel del host, parece prometedor:-

vboxpci: detected device: 10de:05ff at 05:00.0, driver pci-stub
vboxpci: vboxPciOsDevInit: dev=500 pdev=ffff88061baa0000
pci-stub 0000:05:00.0: irq 76 for MSI/MSI-X
vboxpci: enabled MSI
500: linux vboxPciOsDevGetRegionInfo: reg=0
got mmio region: fa000000:16777216
500: linux vboxPciOsDevGetRegionInfo: reg=1
got mmio region: d0000000:268435456
500: linux vboxPciOsDevGetRegionInfo: reg=3
got mmio region: f8000000:33554432
500: linux vboxPciOsDevGetRegionInfo: reg=5
got pio region: 8c00:128
500: linux vboxPciOsDevGetRegionInfo: reg=6
got mmio region: fb980000:524288
got PCI IRQ: 76
created IOMMU domain ffff88058377c9a0
device eth0 entered promiscuous mode
power state: 0
vboxpci: iommu_attach_device() success

Si inicio el sistema operativo invitado por segunda vez, sin reiniciar el host, la pantalla se congela nuevamente en la etapa de "Bienvenida". Sin embargo, definitivamente termina la etapa de inicio de sesión, ya que podría usar los accesos directos de Windows para apagar la máquina sin forzar un apagado.

Ahora me quedé sin ideas... ¿Alguna sugerencia para que esto funcione? ¿Hay más información que pueda proporcionar?

ACTUALIZACIÓN 2:

dmesg contiene algunos errores más interesantes, pero no sé qué puedo hacer al respecto:

IOMMU 0 0xfbfff000: using Queued invalidation
IOMMU 1 0xfbffe000: using Queued invalidation
------------[ cut here ]------------
WARNING: at /build/buildd/linux-3.5.0/drivers/iommu/intel-iommu.c:4254 init_dmars+0x39b/0x74f()
Hardware name: System Product Name

Your BIOS is broken; DMA routed to ISOCH DMAR unit but no TLB space.

BIOS vendor: American Megatrends Inc.; Ver: 0811   ; Product Version: System Version
...
Your BIOS is broken; RMRR ends before it starts!

Respuesta aceptada:

Obtuve el paso de VGA trabajando con una NVIDIA GTX 760 usando KVM como hipervisor con vfio-vga; Nunca lo he probado con Virtualbox. Fue un dolor, pero funciona bien después de hacer la configuración correcta. KVM es tan conveniente como Virtualbox para máquinas virtuales rápidas desde su escritorio y podría considerarlo como otra opción.

Este hilo tiene toneladas de información sobre muchas configuraciones diferentes y pasos para solucionar problemas, y fue realmente útil:https://bbs.archlinux.org/viewtopic.php?id=162768


Linux
  1. Una guía de la terminal de Linux para principiantes

  2. Analizar el kernel de Linux con ftrace

  3. Pruebas de integración continua para el kernel de Linux

  4. Linux:¿participa en la lista de correo del kernel?

  5. Linux:¿buscar el controlador de Linux para auriculares en el árbol del kernel?

Cómo el kernel de Linux maneja las interrupciones

Cómo verificar la versión del kernel en Linux

GalliumOS:la distribución de Linux para Chromebooks

Trabajar con el kernel en tiempo real para Red Hat Enterprise Linux

¿Cuál es la interfaz para las llamadas al sistema ARM y dónde se define en el kernel de Linux?

¿Cómo mostrar los parámetros de la línea de comandos del kernel de Linux dados para el arranque actual?