Breve domanda:
Come posso attivare l' intel_iommu
impostazione 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 sudo
privilegi, 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!
CONFIG_CMDLINE_LINUX=intel_iommu=on
in /etc/default/grub
. Ora l'ospite si avvia, ma non rileva la scheda grafica ...
intel_iommu=soft
non 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?
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
intel_iommu=igfx_off
...
intel_iommu=soft
. Puoi provare a passareintel_iommu=on
.