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


16

Pergunta curta:

Como ativar a intel_iommuconfiguraçã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!

1
A configuração do IOMMU deve estar ativa por padrão no Debian stable se o hardware suportar. Como estava causando problemas e vários erros no log, tive que desativá-lo intel_iommu=soft. Você pode tentar passar intel_iommu=on.
26612 Marco Marco

1
Legal, acabei de encontrar o arquivo e a linha onde alterar isso; O módulo grub-config do KDE instalado CONFIG_CMDLINE_LINUX=intel_iommu=onno /etc/default/grub. Agora as botas de hóspedes, mas não detecta a placa de vídeo ...
Alex Leach

intel_iommu=softnã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?
Alex Leach

3
Você está certo, é 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
Marco

Obrigado. Eu posso dar uma chance quando eu reiniciar novamente. Eu acho que todo o meu hardware suporta o IOMMU, portanto, não tenho certeza se uma emulação de software seria uma boa idéia. Em uma nota relacionada, não tenho certeza se a minha GPU tem uma unidade dmar, e se seria uma boa idéia para uso intel_iommu=igfx_off...
Alex Leach

Respostas:


2

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

Este tópico contém inúmeras informações sobre várias configurações diferentes e etapas de solução de problemas, e foi realmente útil: https://bbs.archlinux.org/viewtopic.php?id=162768


1
CUDA funciona?
Aleksandr Dubinsky

Esse blog agora afirma estar desatualizado e recomenda vfio.blogspot.com
Aleksandr Dubinsky

Bem, a instalação de um qemu KVM + eficiente a partir do zero pode não ser tão rápida.
sitilge

@AleksandrDubinsky, Atualmente, para que o CUDA funcione, é necessário usar um kernel Linux específico: superuser.com/a/1392031/109803
Gabriel Fair

0

Se o driver da Nvidia estiver dizendo que não conseguiu encontrar recursos livres suficientes, tente desativar o "Adaptador VGA padrão" emulado no Gerenciador de dispositivos. Reinicie o convidado e você poderá encontrar o seguinte, em ordem:

1) Sua VM POST / boot ocorre no adaptador VGA emulado. 2) O adaptador VGA emulado fica em branco pouco antes de chegar à tela de login. 3) O driver da Nvidia é carregado e abre a GPU de passagem, e você obtém a tela de login na placa Nvidia.

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


0

Parece que você tem dois problemas separados. Conseguir que a reinicialização funcione com o passe VGA pode ser um verdadeiro problema. No Xen, o dispositivo VGA geralmente aparece como um dispositivo removível e algumas pessoas tiveram mais sorte em "ejetar" o dispositivo antes de reiniciar.

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


0

Tente definir um destes em /etc/grub:

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

Eu tenho o novo sistema AMD de 64 bits e descobri que o Linux tem problemas com as configurações de Nvidia e DMA causadas pelas configurações de iommu no BIOS, portanto, defini-las no grub o corrigiu para mim.

Leia isto para mais detalhes .


-1

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

desativar vídeo integrado

iommu=calgary intel_iommu=on intel_iommu=igfx_off
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.