GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Linux – Iommu im Kernel für Grafikkarten-Pass-Through aktivieren?

Kurze Frage:

Wie kann ich intel_iommu einschalten Einstellung im Linux-Kernel? Ich betreibe einen Debian-Host mit dem grub2-Bootloader. Die Dokumentation, die ich gesehen habe, besagt, dass /boot/grub/menu.lst bearbeitet werden soll , was nur für Grub 1.x relevant zu sein scheint, da ich diese Datei nicht habe.

Nach meinem Verständnis (und der letzten Option, die mir einfällt) könnte das Ändern dieser Boot-Option die folgende Fehlermeldung in /var/log/kern.log beseitigen

vboxpci: No IOMMU domain (attach)

Lange Frage:

Gib einem Gastbetriebssystem direkten Zugriff auf die Grafikkarte

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

NVIDIA vermarktet diese „SLI Multi-OS“-Konfiguration, die ich im Grunde schon seit Ewigkeiten einrichten wollte, aber ich möchte nicht mehr als einen Riesen für die Virtualisierungssoftware (Parallels Workstation Extreme) ausgeben, wenn ich es getan habe benutze VirtualBox schon seit Jahren sehr gerne.

Hostsystem

Ich verwende linux-3.5.0-19 aus den Debian-Repositories auf ziemlich High-End-Workstation-Geräten (Asus P6T7 WS Supercomputer Mobo mit Intel ICH10R-Chipsatz und Xeon W3680-CPU) und möchte die IOMMU-Unterstützung im Kernel aktivieren , am besten ohne es selbst kompilieren zu müssen.

BIOS

In den BIOS-Einstellungen habe ich VT-x- und VT-d-Unterstützung aktiviert. Ich konnte jedoch nichts finden, was IOMMU ausdrücklich erwähnt.

Anschließen des PCI-Geräts

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

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

(Als ich dies zum ersten Mal ausführte, gab es einen Fehler, weil VirtualBox einen PIIX-Chipsatz emulierte; es hieß, dass PCI-Passthrough nur mit ICH9-Chipsätzen funktioniert. Also änderte ich den Chipsatz in den VirtualBox-VM-Systemeinstellungen auf ICH9 und schaltete den Gast ein um die erforderlichen neuen Treiber zu installieren. Ein Neustart später und alles funktionierte einwandfrei, also habe ich den Gast heruntergefahren und den Befehl erneut ausgeführt.)

Es gab keine Ausgabe und ich kehrte fast sofort zur Befehlszeile zurück.

Host-GPU vom Gast verwenden

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

Als ich das nächste Mal den Gast startete, begann Windows Update mit seiner Arbeit und erkannte und installierte automatisch die richtigen NVIDIA-Treiber. Bis jetzt sieht alles gut aus. Bevor ich das Gerät jedoch verwenden konnte, musste ich den Gast neu starten…

Problem

Jetzt, wo die Grafikkartentreiber auf dem Gast installiert und das PCI-Gerät angeschlossen sind, kann ich nicht auf den Windows-Desktop zugreifen. Ich komme zum Windows-Anmeldebildschirm, dann friert der Bildschirm nach der Anmeldung ein und sagt nur „Willkommen“, mit einem blauen Kreis daneben, der sich drehen sollte, aber nicht ist.

Verwandte:Linux – Wie entscheidet sich Linux für eine Standardanwendung?

In /var/log/kern.log , die letzten ausgegebenen Nachrichten sind:-

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 beheben kann?

AKTUALISIERUNG:

Ich habe den Kernel jetzt mit intel_iommu=on booten lassen , 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 vor dem Start war. Meine zweite Grafikkarte gibt nichts aus.

Im Geräte-Manager befindet sich neben dem Quadro FX-Gerät ein Ausrufezeichen und in den Geräteeigenschaften ist der Fehlercode 12 mit der Meldung „Dieses Gerät kann nicht genügend freie Ressourcen finden“. 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 bei „Willkommen“ wieder ein. Es beendet jedoch definitiv die Anmeldephase, da ich Windows-Verknüpfungen verwenden könnte, um den Computer herunterzufahren, ohne ein Herunterfahren zu erzwingen..

Jetzt sind mir irgendwie die Ideen ausgegangen … Irgendwelche Vorschläge, um das zum Laufen zu bringen? Gibt es weitere Informationen, die ich bereitstellen kann?

AKTUALISIERUNG2:

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!

Akzeptierte Antwort:

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

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


Linux
  1. Eine Anleitung zum Linux-Terminal für Anfänger

  2. Analysieren Sie den Linux-Kernel mit ftrace

  3. Linux-Kernel für Nintendo Wii?

  4. Kali auf dem Windows-Subsystem für Linux

  5. Kali Linux für den Gemini-PDA

8 Tipps für die Linux-Kommandozeile

Wie der Linux-Kernel mit Interrupts umgeht

Kontinuierliche Integrationstests für den Linux-Kernel

So überprüfen Sie die Kernel-Version in Linux

GalliumOS:Die Linux-Distribution für Chromebooks

Arbeiten mit dem Echtzeit-Kernel für Red Hat Enterprise Linux