Habilitación de IOMMU en el núcleo para el paso de la tarjeta gráfica


16

Pregunta corta:

¿Cómo puedo activar la intel_iommuconfiguración en el kernel de Linux? Ejecuto un host Debian, usando el gestor de arranque grub2. La documentación que he visto dice editar /boot/grub/menu.lst, lo 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)

Larga pregunta:

Dar acceso directo a la tarjeta gráfica a un SO huésped

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

NVIDIA comercializa esta configuración " SLI Multi-OS ", que es básicamente lo que he querido configurar durante años, pero no quiero gastar más de un millón en el software de virtualización (estación de trabajo Parallels extreme), cuando he estado usando VirtualBox muy feliz por años.

Sistema host

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 el soporte de IOMMU en el núcleo , preferiblemente sin tener que compilarlo yo mismo.

BIOS

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

Conectar el dispositivo PCI

¡Esto fue agradablemente sorprendentemente simple! La documentación oficial de VirtualBox está aquí . Lo que hice, que encontré menos ambiguo, fue abrir nvidia-settings, seleccionar la tarjeta gráfica secundaria y anotar la ID del bus ("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 la transferencia PCI solo funciona con los 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 salida y me devolvieron a la línea de comando casi de inmediato.

Usar la GPU del host del invitado

Antes de encender el invitado, reinicié la máquina host, en caso de que algo indocumentado tuviera que suceder en el núcleo, por virtualbox-dkms. Como ejecuté el comando anterior sinsudo embargo, al privilegios, dudo que se hayan realizado cambios.

La próxima vez que inicié al 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 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 diciendo "Bienvenido", con un círculo azul que debería estar girando pero que no está al lado.

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)

¿Algúna idea de cómo arreglar esto?

ACTUALIZAR:

Tengo el arranque del núcleo ahora intel_iommu=on, pero las cosas todavía no funcionan completamente. Después de reiniciar el host, el invitado se inicia, inicia sesión bien y todo parece como estaba antes de comenzar todo esto. Mi segunda tarjeta gráfica no genera nada.

En el Administrador de dispositivos, hay un signo de exclamación al lado del 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". Descripción adicional en technet.microsoft.com .

En el registro del núcleo 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 finaliza la etapa de inicio de sesión, ya que podría usar accesos directos de Windows para apagar la máquina sin forzar un apagado.

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

ACTUALIZACIÓN2:

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!

1
La configuración de IOMMU debería estar activa por defecto en Debian estable si el hardware lo admite. Como estaba causando problemas y toneladas de errores en el registro, tuve que desactivarlo intel_iommu=soft. Puedes intentar pasar intel_iommu=on.
Marco

1
Genial, acabo de encontrar el archivo y la línea donde cambiar esto; Módulo grub-config de KDE puesto CONFIG_CMDLINE_LINUX=intel_iommu=onen /etc/default/grub. Ahora el invitado arranca, pero no detecta la tarjeta gráfica ...
Alex Leach

intel_iommu=softno parece ser una opción de kernel válida, y cuando la usé, volvió a intel_iommu=on... De www.kernel.org , puedes tener iommu=soft, pero no puedo encontrar ninguna documentación para eso ... ¿Sabes de qué se trata? ¿hace?
Alex Leach

3
Tienes razón, es iommu=soft. Desactiva el hardware IOMMU (que causa numerosos errores de DMA en mi sistema) y utiliza un software IOMMU en su lugar. Aquí hay un enlace a un hilo antiguo: Sugerencia para usar iommu = soft para todos los paquetes del kernel
Marco

Gracias. Podría intentarlo la próxima vez que reinicie. Sin embargo, creo que todo mi hardware es compatible con IOMMU, así que no estoy seguro de si una emulación de software sería una buena idea. En una nota relacionada, no estoy seguro de si mi GPU tiene una unidad DMAR, y si sería una buena idea usar intel_iommu=igfx_off...
Alex Leach

Respuestas:


2

Obtuve el paso VGA trabajando con un 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


1
¿CUDA funciona?
Aleksandr Dubinsky

Ese blog ahora afirma estar desactualizado y recomienda vfio.blogspot.com
Aleksandr Dubinsky

Bueno, configurar un KVM + qemu eficiente desde cero puede no ser tan rápido.
sitilge

@AleksandrDubinsky, actualmente para que CUDA funcione, se debe usar un kernel de Linux específico: superuser.com/a/1392031/109803
Gabriel Fair

0

Si su controlador Nvidia dice que no pudo encontrar suficientes recursos gratuitos, intente deshabilitar el "Adaptador VGA estándar" emulado en el Administrador de dispositivos. Reinicie el invitado, y puede encontrar lo siguiente, en orden:

1) Su VM POST / boot ocurre en el adaptador VGA emulado. 2) El adaptador VGA emulado se queda en blanco justo antes de que llegue a la pantalla de inicio de sesión 3) El controlador Nvidia se carga y muestra la GPU de paso, y obtiene la pantalla de inicio de sesión en la tarjeta Nvidia.

Con un poco de suerte, es posible que las cosas funcionen bien a partir de ahí. Esto es más o menos exactamente lo que sucede en mi configuración similar con Xen. Por favor, informe los resultados. :)


0

Parece que tienes dos problemas separados. Hacer que el reinicio funcione con VGA puede ser un verdadero oso. En Xen, el dispositivo VGA a menudo aparece como un dispositivo extraíble y algunas personas han tenido mejor suerte al "expulsar" el dispositivo antes de reiniciar.

El error del código 12 probablemente se puede solucionar simplemente deshabilitando el dispositivo de video virtual en el administrador de dispositivos de Windows.


0

Intente configurar uno de estos en /etc/grub:

  • iommu=memmaper
  • iommu=soft
  • vga=normal
  • vesa=0

Tengo un nuevo sistema AMD de 64 bits y descubrí que Linux tiene problemas con la configuración de Nvidia y DMA causada por la configuración de iommu en el BIOS, por lo que configurar esto en grub me lo arregló.

Lea esto para más detalles .


-1

probado en HP dc7900 para ver el mensaje "IOMMU encontrado":

desactivar video integrado

iommu=calgary intel_iommu=on intel_iommu=igfx_off
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.