Pregunta corta:
¿Cómo puedo activar la 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 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!
CONFIG_CMDLINE_LINUX=intel_iommu=on
en /etc/default/grub
. Ahora el invitado arranca, pero no detecta la tarjeta gráfica ...
intel_iommu=soft
no 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?
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
intel_iommu=igfx_off
...
intel_iommu=soft
. Puedes intentar pasarintel_iommu=on
.