Pergunta curta:
Como ativar a intel_iommu
configuração no kernel do Linux? Eu corro um host Debian, usando o gerenciador de inicialização grub2. A documentação que vi diz para editar /boot/grub/menu.lst
, o que parece ser relevante apenas para o grub 1.x, pois não tenho esse arquivo.
Entendo (e a última opção em que consigo pensar) que alterar esta opção de inicialização pode se livrar da seguinte mensagem de erro em /var/log/kern.log
vboxpci: No IOMMU domain (attach)
Pergunta longa:
Conceder acesso direto ao SO convidado à placa gráfica
Recentemente, percebi que é possível passar por um dispositivo PCI-express para sistemas operacionais convidados em execução no Virtualbox. Legal, pensei! Eu tenho duas placas gráficas NVIDIA Quadro FX (com conexão de ponte SLI, que espero não estejam causando sofrimento) e gostaria de dedicar a segunda placa gráfica ao sistema operacional convidado, para que eu possa usar os recursos OpenGL dentro Photoshop et al.
Mercado NVIDIA isso " configuração SLI Multi-OS ", que é basicamente o que eu queria instalar há muito tempo, mas eu não quero gastar mais que um prêmio no software de virtualização (Parallels workstation extreme), quando estiver usando VirtualBox bastante feliz por anos agora.
Sistema Host
Estou executando o linux-3.5.0-19 nos repositórios Debian, em equipamentos de estação de trabalho bastante sofisticados (mobo do supercomputador Asus P6T7 WS com chipset Intel ICH10R e CPU Xeon W3680) e gostaria de ativar o suporte ao IOMMU no kernel , de preferência sem ter que compilá-lo eu mesmo.
BIOS
Nas configurações do BIOS, tenho o suporte VT-x e VT-d ativado. Eu não conseguia ver nada mencionando especificamente o IOMMU, no entanto.
Conectando o dispositivo PCI
Isso foi agradavelmente surpreendentemente simples! A documentação oficial do VirtualBox está aqui . O que fiz, que achei menos ambíguo, foi abrir nvidia-settings
, selecionar a placa de vídeo secundária e anotar o ID do barramento ("PCI: 5: 0: 0" no meu caso). Em seguida, na linha de comando do host: -
VBoxManage modifyvm "Windows Guest" --pciattach 05:00.0
(Quando eu executei isso pela primeira vez, ocorreu um erro porque o VirtualBox estava emulando um chipset PIIX; ele dizia que a passagem PCI só funciona com chipsets ICH9. Então, mudei o chipset para ICH9 nas configurações do sistema VM VirtualBox e ativei o convidado para instalar os novos drivers necessários. Uma reinicialização posterior e tudo estava funcionando bem, então desliguei o convidado e executei novamente o comando.)
Não houve saída e retornei à linha de comando quase imediatamente.
Usando a GPU do host do convidado
Antes de ligar o convidado, reiniciei a máquina host, caso algo não documentado precisasse acontecer no kernel, pelo virtualbox-dkms. Como eu executei o comando anterior semsudo
privilégios, duvido que tenham sido feitas alterações.
Na próxima vez em que iniciei o convidado, o Windows Update começou a funcionar e detectou e instalou automaticamente os drivers NVIDIA corretos. Tudo parece bom até agora. Antes que eu pudesse usar o dispositivo, tive que reiniciar o convidado ...
Problema
Agora que os drivers da placa de vídeo estão instalados no convidado e no dispositivo PCI conectado, não consigo entrar na área de trabalho do Windows. Eu chego à tela de login do Windows e, após o login, a tela congela, apenas dizendo "Bem-vindo", com um círculo azul que deveria estar girando, mas não está ao lado.
Em /var/log/kern.log
, as últimas mensagens impressas são: -
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)
Alguma idéia de como consertar isso?
ATUALIZAR:
Eu tenho o kernel inicializando agora intel_iommu=on
, mas as coisas ainda não estão funcionando completamente. Depois de reiniciar o host, o convidado inicia, efetua login e tudo parece como antes de iniciar qualquer coisa. Minha segunda placa gráfica não está produzindo nada.
No Gerenciador de dispositivos, há um ponto de exclamação ao lado do dispositivo Quadro FX e um código de erro 12 nas propriedades do dispositivo, com uma mensagem dizendo "Este dispositivo não consegue encontrar recursos livres suficientes". Mais descrição em technet.microsoft.com .
No log do kernel do host, parece promissor: -
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
Se eu iniciar o SO convidado pela segunda vez, sem reiniciar o host, a tela congelará novamente no estágio "Bem-vindo". Definitivamente, ele termina o estágio de logon, pois eu poderia usar os atalhos do Windows para desligar a máquina sem forçar o desligamento.
Agora estou sem ideias ... Alguma sugestão para que isso funcione? Mais alguma informação que eu possa fornecer?
UPDATE2:
dmesg
contém alguns erros mais interessantes, mas não sei o que posso fazer sobre eles:
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
no /etc/default/grub
. Agora as botas de hóspedes, mas não detecta a placa de vídeo ...
intel_iommu=soft
não parece ser uma opção válida do kernel, e quando eu a usei, ela reverteu para intel_iommu=on
.. Em www.kernel.org , você pode ter iommu=soft
, mas não consigo encontrar nenhuma documentação para isso. Você sabe o que é faz?
iommu=soft
. Desativa o IOMMU de hardware (que causa vários erros de DMA no meu sistema) e usa um IOMMU de software. Aqui está um link para um thread antigo: Sugestão para usar o iommu = soft em todos os pacotes do kernel
intel_iommu=igfx_off
...
intel_iommu=soft
. Você pode tentar passarintel_iommu=on
.