Aktivieren von IOMMU im Kernel für die Grafikkartendurchleitung

16

Kurze Frage:

Wie kann ich die intel_iommuEinstellung im Linux-Kernel aktivieren? Ich führe einen Debian-Host mit dem Bootloader grub2 aus. Die Dokumentation, die ich gesehen habe, sagt zu bearbeiten /boot/grub/menu.lst, was nur für Grub 1.x relevant zu sein scheint, da ich diese Datei nicht habe.

Ich habe das Verständnis (und die letzte Option, die mir in den Sinn kommt), dass durch Ändern dieser Startoption möglicherweise die folgende Fehlermeldung in entfernt wird /var/log/kern.log

vboxpci: No IOMMU domain (attach)

Lange Frage:

Ermöglichen eines Gastbetriebssystems direkten Zugriff auf die Grafikkarte

Kürzlich wurde mir klar, dass es möglich ist, ein PCI-Express-Gerät an Gastbetriebssysteme zu übergeben, die in Virtualbox ausgeführt werden. Cool, dachte ich mir! Ich habe zwei NVIDIA Quadro FX-Grafikkarten (mit vorhandener SLI-Bridge-Verbindung, die hoffentlich keine Probleme bereiten) und möchte die zweite Grafikkarte dem Gastbetriebssystem widmen, damit ich die OpenGL-Funktionen verwenden kann Photoshop et al.

NVIDIA vermarktet diese " SLI Multi-OS " -Konfiguration, die ich eigentlich schon seit Ewigkeiten einrichten wollte, aber ich möchte nicht übermäßig viel Geld für die Virtualisierungssoftware (Parallels Workstation Extreme) ausgeben, wenn ich schon war Ich benutze VirtualBox schon seit Jahren sehr gerne.

Host-System

Ich führe Linux-3.5.0-19 aus den Debian-Repositories auf einer recht hochwertigen Workstation aus (Asus P6T7 WS Supercomputer Mobo mit Intel ICH10R-Chipsatz und Xeon W3680-CPU) und möchte die IOMMU-Unterstützung im Kernel einschalten am besten ohne es selbst kompilieren zu müssen.

BIOS

In den BIOS-Einstellungen habe ich die VT-x- und VT-d-Unterstützung aktiviert. Ich konnte jedoch nichts sehen, was speziell IOMMU erwähnte.

Anschließen des PCI-Geräts

Das war angenehm überraschend einfach! Die offizielle Dokumentation zu VirtualBox finden Sie hier . Was ich getan habe, was ich weniger eindeutig fand, war zu öffnen nvidia-settings, die sekundäre Grafikkarte auszuwählen und die Bus-ID zu notieren ("PCI: 5: 0: 0" in meinem Fall). Dann von der Kommandozeile des Hosts: -

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

(Als ich das erste Mal ausgeführt habe, ist ein Fehler aufgetreten, weil VirtualBox einen PIIX-Chipsatz emuliert hat. Es heißt, dass PCI-Pass-Through nur mit ICH9-Chipsätzen funktioniert. Ich habe den Chipsatz in den Einstellungen des VirtualBox VM-Systems auf ICH9 geändert und den Gast eingeschaltet Nach einem Neustart funktionierte alles einwandfrei, so dass ich den Gast herunterfuhr und den Befehl erneut ausführte.)

Es gab keine Ausgabe, und ich wurde fast sofort zur Befehlszeile zurückgebracht.

Verwenden der Host-GPU vom Gast

Bevor ich den Gast einschaltete, startete ich zuerst den Host-Rechner von virtualbox-dkms neu, falls etwas Undokumentiertes im Kernel passieren musste. Da ich den vorherigen Befehl ohne sudoBerechtigungen ausgeführt habe, bezweifle ich, dass Änderungen vorgenommen wurden.

Als ich den Gast das nächste Mal gestartet habe, hat Windows Update seine Arbeit aufgenommen und die richtigen NVIDIA-Treiber automatisch erkannt und installiert. Alles sieht soweit gut aus. Bevor ich das Gerät benutzen konnte, musste ich den Gast neu starten ...

Problem

Nachdem die Grafikkartentreiber auf dem Gast installiert und das PCI-Gerät angeschlossen sind, kann ich nicht auf den Windows-Desktop zugreifen. Ich rufe den Windows-Anmeldebildschirm auf und nach dem Anmelden friert der Bildschirm ein. Ich sage nur "Willkommen", daneben befindet sich ein blauer Kreis, der sich drehen soll, aber nicht.

In /var/log/kern.logsind die zuletzt gedruckten Nachrichten: -

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)

Irgendeine Idee, wie man das behebt?

AKTUALISIEREN:

Ich habe den Kernel jetzt mit gebootet intel_iommu=on, aber die Dinge funktionieren immer noch nicht vollständig. Nach dem Neustart des Hosts startet der Gast, meldet sich in Ordnung an und alles scheint so zu sein, wie es war, bevor irgendetwas davon gestartet wurde. Meine 2. Grafikkarte gibt nichts aus.

Im Geräte-Manager befindet sich neben dem Quadro FX-Gerät ein Ausrufezeichen und in den Geräteeigenschaften wird der Fehlercode 12 mit der Meldung "Dieses Gerät kann nicht genügend freie Ressourcen finden" angezeigt. Weitere Beschreibung auf technet.microsoft.com .

Im Host-Kernel-Log sieht es vielversprechend aus:

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

Wenn ich das Gastbetriebssystem ein zweites Mal starte, ohne den Host neu zu starten, friert die Anzeige in der Phase "Willkommen" erneut ein. Damit ist die Anmeldephase definitiv beendet, da ich Windows-Verknüpfungen verwenden könnte, um den Computer herunterzufahren, ohne ein Herunterfahren zu erzwingen.

Jetzt habe ich keine Ideen mehr ... Irgendwelche Vorschläge, um das zum Laufen zu bringen? Weitere Informationen, die ich bereitstellen kann?

UPDATE2:

dmesg enthält einige weitere interessante Fehler, aber ich weiß nicht, was ich dagegen tun kann:

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!
Alex Leach
quelle
1
Die IOMMU-Einstellung sollte auf Debian Stable standardmäßig aktiv sein, wenn die Hardware dies unterstützt. Da es Ärger und Unmengen von Fehlern im Protokoll verursachte, musste ich es mit deaktivieren intel_iommu=soft. Sie können versuchen, vorbei intel_iommu=on.
Marco
1
Cool, habe gerade die Datei und die Zeile gefunden, in der das geändert werden soll. Das KDE-Modul grub-config CONFIG_CMDLINE_LINUX=intel_iommu=onin /etc/default/grub. Jetzt bootet der Gast, erkennt aber die Grafikkarte nicht ...
Alex Leach
intel_iommu=softscheint keine gültige Kerneloption zu sein, und als ich sie verwendete, kehrte sie zu zurück intel_iommu=on. Von www.kernel.org können Sie haben iommu=soft, aber ich kann keine Dokumentation dafür finden. Wissen Sie, was es ist tut?
Alex Leach
3
Du hast recht, es ist iommu=soft. Es deaktiviert die Hardware-IOMMU (die auf meinem System zahlreiche DMA-Fehler verursacht) und verwendet stattdessen eine Software-IOMMU. Hier ist ein Link zu einem alten Thread: Vorschlag, iommu = soft für alle Kernelpakete zu verwenden
Marco
Vielen Dank. Ich könnte das ausprobieren, wenn ich das nächste Mal neu starte. Ich denke jedoch, dass meine gesamte Hardware IOMMU unterstützt. Daher bin ich mir nicht sicher, ob eine Software-Emulation eine gute Idee wäre. Ich bin mir nicht sicher, ob meine GPU über eine DMAR-Einheit verfügt und ob es eine gute Idee wäre, diese zu verwenden intel_iommu=igfx_off...
Alex Leach,

Antworten:

2

Ich habe VGA-Passthrough für eine NVIDIA GTX 760 mit KVM als Hypervisor mit vfio-vga erhalten. Ich habe es noch nie mit Virtualbox versucht. Es war ein Schmerz, aber funktioniert gut, nachdem die Konfiguration richtig gemacht wurde. KVM ist genauso praktisch wie Virtualbox für schnelle VMs von Ihrem Desktop aus, und Sie könnten es als eine weitere Option in Betracht ziehen.

Dieser Thread enthält unzählige Informationen zu vielen verschiedenen Konfigurationen und Schritten zur Fehlerbehebung und war sehr hilfreich: https://bbs.archlinux.org/viewtopic.php?id=162768

Josh
quelle
1
Funktioniert CUDA?
Aleksandr Dubinsky
Dieser Blog behauptet nun veraltet zu sein und empfiehlt vfio.blogspot.com
Aleksandr Dubinsky
Nun, das Einrichten eines effizienten KVM + QEMU von Grund auf ist möglicherweise nicht so schnell.
Sitilge
@AleksandrDubinsky, Um CUDA zum Laufen zu bringen, muss derzeit ein bestimmter Linux-Kernel verwendet werden: superuser.com/a/1392031/109803
Gabriel Fair
0

Wenn Ihr Nvidia-Treiber angibt, dass nicht genügend freie Ressourcen gefunden wurden, deaktivieren Sie den emulierten "Standard-VGA-Adapter" im Geräte-Manager. Starten Sie den Gast neu. Möglicherweise geschieht Folgendes in der angegebenen Reihenfolge:

1) Ihr VM-POST / -Start erfolgt auf dem emulierten VGA-Adapter. 2) Der emulierte VGA-Adapter wird kurz vor dem Aufrufen des Anmeldebildschirms leer. 3) Der Nvidia-Treiber wird geladen und zeigt die Passthrough-GPU an. Der Anmeldebildschirm wird auf der Nvidia-Karte angezeigt.

Mit etwas Glück könnten Sie feststellen, dass die Dinge von da an gut funktionieren. Das ist mehr oder weniger genau das, was bei meinem ähnlichen Setup mit Xen passiert. Bitte melden Sie die Ergebnisse. :)

user1842677
quelle
0

Es hört sich so an, als hätten Sie zwei verschiedene Probleme. Ein Neustart mit VGA Pass-Through kann ein echter Bär sein. In Xen wird das VGA-Gerät häufig als Wechseldatenträger angezeigt, und einige Benutzer hatten vor dem Neustart mehr Glück, das Gerät auszuwerfen.

Der Code 12-Fehler kann möglicherweise behoben werden, indem das virtuelle Videogerät einfach im Windows-Geräte-Manager deaktiviert wird.

StrongBad
quelle
0

Versuchen Sie, eine der folgenden Einstellungen vorzunehmen /etc/grub:

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

Ich habe ein neues AMD 64-Bit-System und festgestellt, dass Linux Probleme mit den Nvidia- und DMA-Einstellungen hat, die durch die iommu-Einstellungen im BIOS verursacht werden. Diese Einstellungen in grub haben das Problem für mich behoben.

Lesen Sie dies für weitere Details .

Steve LinuxBlue
quelle
-1

Getestet auf HP DC7900 mit der Meldung "IOMMU gefunden":

integriertes Video deaktivieren

iommu=calgary intel_iommu=on intel_iommu=igfx_off
backtolinux
quelle