Abilitazione di IOMMU nel kernel per il pass-through della scheda grafica


16

Breve domanda:

Come posso attivare l' intel_iommuimpostazione nel kernel Linux? Gestisco un host Debian, usando il bootloader grub2. La documentazione che ho visto dice di modificare /boot/grub/menu.lst, che sembra essere rilevante solo per grub 1.x, poiché non ho quel file.

Sono consapevole (e l'ultima opzione che mi viene in mente) che la modifica di questa opzione di avvio potrebbe eliminare il seguente messaggio di errore /var/log/kern.log

vboxpci: No IOMMU domain (attach)

Domanda lunga:

Dare a un SO guest l'accesso diretto alla scheda grafica

Di recente mi sono reso conto che è possibile passare attraverso un dispositivo PCI Express ai sistemi operativi guest in esecuzione su Virtualbox. Fantastico, ho pensato! Ho due schede grafiche NVIDIA Quadro FX (con la connessione bridge SLI in atto, che spero non stia causando il dolore) e vorrei dedicare la seconda scheda grafica al sistema operativo guest, in modo da poter utilizzare le funzionalità OpenGL all'interno Photoshop et al.

NVIDIA commercializza questa configurazione " SLI Multi-OS ", che è fondamentalmente ciò che volevo impostare da anni, ma non voglio spendere molto per il software di virtualizzazione (Parallels workstation extreme), quando sono stato usando VirtualBox abbastanza felicemente per anni ormai.

Sistema host

Sto eseguendo Linux-3.5.0-19 dai repository Debian, su apparecchiature di workstation piuttosto di fascia alta (mobo Supercomputer WS Asus P6T7 con chipset Intel ICH10R e CPU Xeon W3680) e vorrei attivare il supporto IOMMU nel kernel , preferibilmente senza doverlo compilare da solo.

BIOS

Nelle impostazioni del BIOS, ho abilitato il supporto VT-x e VT-d. Tuttavia, non ho visto nulla che menzionasse specificamente IOMMU.

Collegamento del dispositivo PCI

Questo è stato piacevolmente sorprendentemente semplice! La documentazione ufficiale di VirtualBox è qui . Quello che ho fatto, che ho trovato meno ambiguo, è stato aprire nvidia-settings, selezionare la scheda grafica secondaria e annotare l'ID del bus ("PCI: 5: 0: 0" nel mio caso). Quindi, dalla riga di comando dell'host: -

VBoxManage modifyvm "Windows Guest" --pciattach 05:00.0

(Quando l'ho eseguito per la prima volta, si è verificato un errore perché VirtualBox emulava un chipset PIIX; diceva che il pass-through PCI funziona solo con chipset ICH9. Quindi ho cambiato il Chipset in ICH9 nelle impostazioni del sistema VM VirtualBox e ho attivato il guest per installare i nuovi driver necessari. Un riavvio successivo e tutto funzionava correttamente, quindi ho chiuso il guest ed eseguito nuovamente il comando.)

Non c'è stato alcun output e sono stato restituito alla riga di comando quasi immediatamente.

Utilizzo della GPU host dal guest

Prima di accendere il guest, ho riavviato il computer host, nel caso in cui dovesse accadere qualcosa di non documentato nel kernel, tramite virtualbox-dkms. Mentre eseguivo il comando precedente senza sudoprivilegi, dubito tuttavia che siano state apportate modifiche.

La prossima volta che ho avviato l'ospite, Windows Update ha iniziato a fare le sue cose e ha automaticamente rilevato e installato i driver NVIDIA corretti. Finora tutto bene. Prima di poter usare il dispositivo, però, ho dovuto riavviare il guest ...

Problema

Ora che i driver della scheda grafica sono installati sul guest e sul dispositivo PCI collegato, non riesco ad accedere al desktop di Windows. Vado alla schermata di accesso di Windows, quindi dopo aver effettuato l'accesso, lo schermo si blocca, dicendo semplicemente "Benvenuto", con un cerchio blu che dovrebbe essere ruotante ma non è accanto.

In /var/log/kern.log, gli ultimi messaggi stampati sono: -

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)

Qualche idea su come risolvere questo problema?

AGGIORNARE:

Ho avviato il kernel con intel_iommu=on , ma le cose non funzionano ancora completamente. Dopo aver riavviato l'host, l'ospite si avvia, accede correttamente e tutto sembra come prima di iniziare. La mia seconda scheda grafica non produce nulla.

In Gestione dispositivi, c'è un punto esclamativo accanto al dispositivo Quadro FX e un codice di errore di 12 nelle proprietà del dispositivo, con un messaggio che dice "Questo dispositivo non riesce a trovare abbastanza risorse gratuite". Ulteriore descrizione su technet.microsoft.com .

Nel registro del kernel host, sembra promettente: -

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 avvio il SO guest una seconda volta, senza riavviare l'host, il display si blocca nuovamente nella fase di "Benvenuto". Completa sicuramente la fase di accesso, poiché potrei usare le scorciatoie di Windows per spegnere la macchina senza forzare un arresto.

Ora sono un po 'fuori di idee ... Qualche suggerimento per farlo funzionare? Altre informazioni che posso fornire?

UPDATE2:

dmesg contiene alcuni errori più interessanti, ma non so cosa posso fare al riguardo:

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
L'impostazione IOMMU dovrebbe essere attiva di default su Debian stable se l'hardware lo supporta. Dal momento che stava causando problemi e tonnellate di errori nel registro, ho dovuto disattivarlo intel_iommu=soft. Puoi provare a passare intel_iommu=on.
Marco,

1
Bene, ho appena trovato il file e la riga dove cambiarlo; Il modulo grub-config di KDE è stato inserito CONFIG_CMDLINE_LINUX=intel_iommu=onin /etc/default/grub. Ora l'ospite si avvia, ma non rileva la scheda grafica ...
Alex Leach,

intel_iommu=softnon sembra essere un'opzione del kernel valida, e quando l'ho usata, è tornata a intel_iommu=on.. Da www.kernel.org , puoi avere iommu=soft, ma non riesco a trovare alcuna documentazione per quello. Sai cosa? lo fa?
Alex Leach,

3
Hai ragione, lo è iommu=soft. Disattiva l'IOMMU hardware (che causa numerosi errori DMA sul mio sistema) e utilizza invece un IOMMU software. Ecco un link a un vecchio thread: Suggerimento di usare iommu = soft per tutti i pacchetti del kernel
Marco,

Grazie. Potrei provarlo al prossimo riavvio. Penso che tutto il mio hardware supporti IOMMU, quindi, non sono sicuro se un'emulazione del software sarebbe una buona idea. Su una nota correlata, non sono sicuro se la mia GPU ha un'unità DMAR e se sarebbe una buona idea usare intel_iommu=igfx_off...
Alex Leach,

Risposte:


2

Ho ottenuto il passthrough VGA che funzionava con una NVIDIA GTX 760 usando KVM come hypervisor con vfio-vga; Non l'ho mai provato con Virtualbox. È stata una seccatura, ma funziona bene dopo aver corretto la configurazione. KVM è conveniente quanto Virtualbox per VM veloci dal desktop e potresti considerarlo come un'altra opzione.

Questo thread ha tonnellate di informazioni su molte diverse configurazioni e passaggi per la risoluzione dei problemi ed è stato davvero utile: https://bbs.archlinux.org/viewtopic.php?id=162768


1
CUDA funziona?
Aleksandr Dubinsky

Quel blog ora afferma di essere obsoleto e raccomanda vfio.blogspot.com
Aleksandr Dubinsky

Bene, impostare un efficiente KVM + qemu da zero potrebbe non essere così veloce.
sitilge,

@AleksandrDubinsky, Attualmente per far funzionare CUDA, è necessario utilizzare un kernel Linux specifico: superuser.com/a/1392031/109803
Gabriel Fair

0

Se il tuo driver Nvidia dice che non è stato possibile trovare abbastanza risorse gratuite, prova a disabilitare "Adattatore VGA standard" emulato in Gestione dispositivi. Riavvia l'ospite e potresti riscontrare quanto segue, nell'ordine:

1) Il tuo POST / avvio VM si verifica sull'adattatore VGA emulato. 2) L'adattatore VGA emulato diventa vuoto appena prima di accedere alla schermata di accesso 3) Il driver Nvidia carica e visualizza la GPU passthrough e si ottiene la schermata di accesso sulla scheda Nvidia.

Con un po 'di fortuna, potresti scoprire che le cose funzionano bene da lì in poi. Questo è più o meno esattamente ciò che accade sulla mia configurazione simile con Xen. Per favore, segnala i risultati. :)


0

Sembra che tu abbia due problemi separati. Far funzionare il riavvio con VGA pass through può essere un vero orso. In Xen, il dispositivo VGA si presenta spesso come un dispositivo rimovibile e alcune persone hanno avuto più fortuna a "espellere" il dispositivo prima di riavviare.

L'errore del codice 12 può probabilmente essere risolto semplicemente disabilitando il dispositivo video virtuale in Gestione dispositivi di Windows.


0

Prova a impostare uno di questi in /etc/grub:

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

Ho un nuovo sistema AMD a 64 bit e ho scoperto che Linux ha problemi con le impostazioni Nvidia e DMA causate dalle impostazioni di iommu nel BIOS, quindi impostarle in grub mi ha risolto il problema.

Leggi questo per maggiori dettagli .


-1

testato su HP dc7900 per visualizzare il messaggio "IOMMU trovato":

disattivare il video integrato

iommu=calgary intel_iommu=on intel_iommu=igfx_off
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.