Ativando o IOMMU no kernel para passagem da placa gráfica

14

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!
    
por Alex Leach 26.11.2012 / 16:44

5 respostas

2

Eu obtive uma passagem VGA trabalhando com uma NVIDIA GTX 760 usando o KVM como um hipervisor com o vfio-vga; Eu nunca tentei com o Virtualbox. Foi uma dor, mas funciona bem depois de obter a configuração correta. O KVM é tão conveniente quanto o Virtualbox para VMs rápidas da sua área de trabalho e você pode considerá-lo como outra opção.

Este tópico tem toneladas de informações em várias configurações e etapas de solução de problemas diferentes e foi muito útil: link

    
por 14.12.2014 / 09:37
0

Se o driver da Nvidia estiver dizendo que não encontrou recursos livres suficientes, tente desabilitar o "Adaptador VGA padrão" emulado no Gerenciador de dispositivos. Reinicialize o convidado e você poderá descobrir o seguinte, na ordem:

1) A inicialização / inicialização do VM POST acontece no adaptador VGA emulado. 2) O adaptador VGA emulado fica em branco pouco antes de chegar à tela de login 3) Nvidia driver carrega e traz o GPU passthrough, e você começa a tela de login na placa Nvidia.

Com um pouco de sorte, você pode achar que as coisas funcionam bem a partir daí. Isso é mais ou menos exatamente o que acontece na minha configuração semelhante com o Xen. Por favor, relate os resultados. :)

    
por 22.08.2013 / 13:35
0

Parece que você tem dois problemas separados. Começar a reinicialização para trabalhar com passagem VGA pode ser um verdadeiro urso. No Xen, o dispositivo VGA geralmente aparece como um dispositivo removível e algumas pessoas tiveram melhor sorte ao "ejetar" o dispositivo antes de reinicializar.

O erro do código 12 provavelmente pode ser corrigido simplesmente desativando o dispositivo de vídeo virtual no gerenciador de dispositivos do Windows.

    
por 19.05.2014 / 08:55
0

Tente definir um deles em /etc/grub :

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

Eu tenho um novo sistema AMD de 64 bits e descobri que o Linux tem problemas com a configuração da Nvidia e do DMA causada por configurações do iommu no BIOS, então configurá-las no grub corrigiu para mim.

Leia isto para mais detalhes .

    
por 06.07.2014 / 03:41
-1

testado no HP dc7900 para ver a mensagem "IOMMU encontrado":

desativar vídeo integrado

iommu=calgary intel_iommu=on intel_iommu=igfx_off
    
por 04.03.2015 / 10:28