Pergunta curta:
Como posso ativar a configuração intel_iommu
no kernel do Linux? Eu corro um host Debian, usando o bootloader grub2. A documentação que vi diz para editar /boot/grub/menu.lst
, que parece ser relevante apenas para o grub 1.x, já que não tenho esse arquivo.
É do meu conhecimento (e a última opção que consigo pensar) que a alteração desta opção de inicialização pode eliminar a seguinte mensagem de erro em /var/log/kern.log
vboxpci: No IOMMU domain (attach)
Longa pergunta:
Conceder acesso direto ao sistema operacional convidado à placa gráfica
Recentemente, percebi que é possível passar por um dispositivo expresso PCI para os sistemas operacionais convidados em execução no Virtualbox. Legal, eu pensei! Eu tenho duas placas gráficas NVIDIA Quadro FX (com conexão de ponte SLI no lugar, o que eu espero que não esteja causando o luto) 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.
NVIDIA comercializa essa configuração " SLI Multi-OS ", que é basicamente o que eu queria definir por muito tempo, mas eu não quero gastar mais do que um software de virtualização (Parallels workstation extreme), quando tenho usado o VirtualBox bastante feliz há anos.
Sistema host
Estou executando o linux-3.5.0-19 a partir dos repositórios do Debian, em equipamentos de estação de trabalho bastante sofisticados (Asus P6T7 WS Supercomputer mobo w / chipset Intel ICH10R e Xeon W3680 CPU) e gostaria de ativar o suporte ao IOMMU no kernel, de preferência sem ter que compilar eu mesmo.
BIOS
Nas configurações da BIOS, tenho suporte a VT-x e VT-d ativado. Eu não pude ver nada especificamente mencionando o IOMMU, no entanto.
Anexando o dispositivo PCI
Isso foi agradavelmente surpreendentemente simples! A documentação oficial do VirtualBox é aqui . O que eu fiz, que eu achei menos ambíguo, foi abrir nvidia-settings
, selecionar a placa gráfica secundária e anotar a ID do Bus ("PCI: 5: 0: 0" no meu caso). Então, a partir da linha de comando do host: -
VBoxManage modifyvm "Windows Guest" --pciattach 05:00.0
(Quando eu corri isso pela primeira vez, houve um erro porque o VirtualBox estava emulando um chipset PIIX; ele disse que a passagem PCI só funciona com chipsets ICH9. Então eu mudei o Chipset para ICH9 nas configurações do Sistema VirtualBox VM e liguei no 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 eu retornei à linha de comando quase imediatamente.
Usando a GPU hospedeira do convidado
Antes de ligar o guest, eu primeiro reiniciei a máquina host, caso algo não documentado precisasse acontecer no kernel, pelo virtualbox-dkms. Como eu executei o comando anterior sem sudo
privileges, duvido que qualquer alteração tenha sido feita.
Quando iniciei o guest, o Windows Update começou a fazer a sua atividade e detectou e instalou automaticamente os drivers da 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 gráfica estão instalados no convidado e no dispositivo PCI conectado, não consigo entrar na área de trabalho do Windows. Chego à tela de login do Windows e, depois de fazer login, a tela congela, apenas dizendo "Bem-vindo", com um círculo azul que deve estar girando, mas não ao lado dela.
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 ideia de como corrigir isso?
ATUALIZAÇÃO:
Eu tenho o kernel inicializando agora com intel_iommu=on
, mas as coisas ainda não estão funcionando plenamente. Depois de reiniciar o host, o guest inicia, efetua o login e tudo parece como estava 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 há um código de erro 12 nas propriedades do dispositivo, com uma mensagem dizendo "Este dispositivo não consegue encontrar recursos livres suficientes". Descrição adicional 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 sistema operacional convidado pela segunda vez, sem reiniciar o host, a tela congelará novamente na etapa "Bem-vindo". Ele definitivamente termina o estágio de log-in, como eu poderia usar os atalhos do Windows para desligar a máquina sem forçar um desligamento ..
Agora estou meio sem idéias ... Alguma sugestão para que isso funcione? Mais informações posso 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!