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