GNU/Linux >> Linux Esercitazione >  >> Linux

Linux:abilitare Iommu nel kernel per il pass-through della scheda grafica?

Breve domanda:

Come posso attivare intel_iommu impostazione nel kernel Linux? Eseguo 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.

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

vboxpci: No IOMMU domain (attach)

Domanda lunga:

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

Di recente mi sono reso conto che è possibile passare attraverso un dispositivo PCI-express al sistema operativo guest in esecuzione in Virtualbox. Fantastico, ho pensato! Ho due schede grafiche NVIDIA Quadro FX (con 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 quella che volevo impostare da anni, ma non voglio spendere più di un centesimo per il software di virtualizzazione (workstation Parallels Extreme), quando sono stato usando VirtualBox abbastanza felicemente da anni ormai.

Sistema host

Sto eseguendo linux-3.5.0-19 dai repository Debian, su apparecchiature workstation di fascia alta (Asus P6T7 WS Supercomputer mobo 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 sono riuscito a vedere 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 , seleziona la scheda grafica secondaria e annota il Bus ID ("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 stava emulando un chipset PIIX; diceva che il pass-through PCI funziona solo con i chipset ICH9. Quindi ho cambiato il chipset in ICH9 nelle impostazioni del sistema VirtualBox VM e ho attivato il guest per installare i nuovi driver necessari. Un riavvio più tardi e tutto ha funzionato correttamente, quindi ho spento il guest e ho eseguito nuovamente il comando.)

Non c'era output e sono stato riportato alla riga di comando quasi immediatamente.

Utilizzo della GPU host dal guest

Prima di attivare il guest, ho riavviato la macchina host, nel caso fosse necessario che accadesse qualcosa di non documentato nel kernel, tramite virtualbox-dkms. Poiché ho eseguito il comando precedente senza sudo privilegi, dubito che siano state apportate modifiche.

Quando ho avviato il guest, Windows Update ha iniziato a fare le sue cose e ha rilevato e installato automaticamente i driver NVIDIA corretti. Tutto bene finora. Prima di poter utilizzare il dispositivo, però, ho dovuto riavviare il guest...

Problema

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

Correlati:Linux – In che modo Linux decide su un'applicazione predefinita?

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?

AGGIORNAMENTO:

Ho il kernel che si avvia ora 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 com'era prima di iniziare qualsiasi operazione. La mia seconda scheda grafica non emette nulla.

In Gestione dispositivi, è presente un punto esclamativo accanto al dispositivo Quadro FX e c'è un codice di errore 12 nelle proprietà del dispositivo, con un messaggio che dice "Questo dispositivo non riesce a trovare risorse libere sufficienti". 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 sistema operativo guest una seconda volta, senza riavviare l'host, il display si blocca di nuovo nella fase "Benvenuto". Tuttavia, termina definitivamente la fase di accesso, poiché potrei utilizzare le scorciatoie di Windows per spegnere la macchina senza forzare l'arresto.

Ora ho un po' di idee... Qualche suggerimento per farlo funzionare? Qualche informazione in più che posso fornire?

AGGIORNAMENTO2:

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!

Risposta accettata:

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

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


Linux
  1. Una guida al terminale Linux per principianti

  2. Linux – Partecipare alla mailing list del kernel?

  3. Kernel Linux per Nintendo Wii?

  4. Kali sul sottosistema Windows per Linux

  5. Kali Linux per Gemini PDA

Come il kernel Linux gestisce gli interrupt

Come controllare la versione del kernel in Linux

GalliumOS:la distribuzione Linux per i Chromebook

Lavorare con il kernel in tempo reale per Red Hat Enterprise Linux

Qual è l'interfaccia per le chiamate di sistema ARM e dove è definita nel kernel Linux?

Come visualizzare i parametri della riga di comando del kernel Linux forniti per l'avvio corrente?