Zusammenfassung
Ich versuche, GPU-Passthrough auf einem Linux-Host mit KVM einzurichten, damit ich einen Windows-Gast zum Spielen ausführen kann. Ich habe ein Problem, bei dem einige IOMMU-Einträge (die alle zu der GPU gehören, die ich durchleiten möchte) dem VFIO-Bus zugewiesen werden, während andere den NVIDIA-GPU-Treibern zugewiesen werden.
Hardware
CPU – Threadripper 1950X
GPU – Sapphire RX 480 (AMD, für Hostgrafik gedacht) – MSI Duke RTX 2080 (nVidia, für Gastgrafik gedacht)
MoBo - MSI Carbon Gaming Pro AC x399
Problem
Beim Versuch, meine nVidia-GPU durchzureichen, wird der Fehler angezeigt Please ensure all devices within the iommu_group are bound to their vfio bus driver.
(siehe Bilder unten).
- Das Setup im Virt-Manager:https://i.stack.imgur.com/BK0s4.png
- Der Fehler, den ich bekomme:https://i.stack.imgur.com/XJKfm.png
Wenn ich ausführe lspci -k
, finde ich die folgenden Datensätze:
0b:00.0 VGA compatible controller [0300]: NVIDIA Corporation GV104 [GeForce GTX 1180] [10de:1e87] (rev a1)
Subsystem: Micro-Star International Co., Ltd. [MSI] Device [1462:3721]
Kernel driver in use: vfio-pci
Kernel modules: nvidiafb, nouveau
0b:00.1 Audio device [0403]: NVIDIA Corporation Device [10de:10f8] (rev a1)
Subsystem: Micro-Star International Co., Ltd. [MSI] Device [1462:3721]
Kernel driver in use: vfio-pci
Kernel modules: snd_hda_intel
0b:00.2 USB controller [0c03]: NVIDIA Corporation Device [10de:1ad8] (rev a1)
Subsystem: Micro-Star International Co., Ltd. [MSI] Device [1462:3721]
Kernel driver in use: xhci_hcd
0b:00.3 Serial bus controller [0c80]: NVIDIA Corporation Device [10de:1ad9] (rev a1)
Subsystem: Micro-Star International Co., Ltd. [MSI] Device [1462:3721]
Kernel driver in use: nvidia-gpu
Kernel modules: i2c_nvidia_gpu
41:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Ellesmere [Radeon RX 470/480/570/570X/580/580X] [1002:67df] (rev c7)
Subsystem: PC Partner Limited / Sapphire Technology Radeon RX 470/480 [174b:e347]
Kernel driver in use: amdgpu
Kernel modules: amdgpu
41:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Ellesmere [Radeon RX 580] [1002:aaf0]
Subsystem: PC Partner Limited / Sapphire Technology Ellesmere [Radeon RX 580] [174b:aaf0]
Kernel driver in use: snd_hda_intel
Kernel modules: snd_hda_intel
0b:00.0
Das meldet, dass die RTX 2080 von vfio-pci auf , und verwendet wird 0b:00.1
, aber 0b:00.2
und 0b.00.3
(die alle zur RTX 2080 gehören) werden von xhci_hcd
und verwendet nvidia-gpu
.
Meines Wissens ist das das Problem.
Was ich getan habe
Ich bezog mich hauptsächlich aufein Level1-ThreadUndein Blogbeitrag von Jack Ford:
Auf die schwarze Liste gesetzter Jugendstil
im Ordner/etc/modprobe.d/blacklist-nouveau.conf
blacklist nouveau
options nouveau modeset=0
GRUB aktualisiert
In /etc/default/grub
:
GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash amd_iommu=on vfio-pci.ids=10de:1e87,10de:10f8,10de:1ad8,10de:1ad9"
GRUB_CMDLINE_LINUX=""
Hinzugefügte Kernelmodule
In /etc/modules
:
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
In /etc/modprobe.d/vfio.conf
:
options vfio-pci ids=10de:1e87,10de:10f8,10de:1ad8,10de:1ad9
In /etc/modules-load.d/vfio-pci.conf
:
vfio-pci
Bestätigt, dass IOMMU/VFIO aktiviert ist
$ dmesg | grep -E "DMAR|IOMMU"
[ 0.946794] AMD-Vi: IOMMU performance counters supported
[ 0.946855] AMD-Vi: IOMMU performance counters supported
[ 0.976135] AMD-Vi: Found IOMMU at 0000:00:00.2 cap 0x40
[ 0.976139] AMD-Vi: Found IOMMU at 0000:40:00.2 cap 0x40
[ 0.977856] perf/amd_iommu: Detected AMD IOMMU #0 (2 banks, 4 counters/bank).
[ 0.977873] perf/amd_iommu: Detected AMD IOMMU #1 (2 banks, 4 counters/bank).
[ 1.367168] AMD-Vi: AMD IOMMUv2 driver by Joerg Roedel <[email protected]>
$ dmesg | grep -i vfio
[ 0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-5.0.0-37-generic root=UUID=27ff4f46-db04-4ca0-8981-191a45c365ad ro quiet splash amd_iommu=on vfio-pci.ids=10de:1e87,10de:10f8,10de:1ad8,10de:1ad9 vt.handoff=1
[ 0.000000] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-5.0.0-37-generic root=UUID=27ff4f46-db04-4ca0-8981-191a45c365ad ro quiet splash amd_iommu=on vfio-pci.ids=10de:1e87,10de:10f8,10de:1ad8,10de:1ad9 vt.handoff=1
[ 2.667765] VFIO - User Level meta-driver version: 0.3
[ 2.675583] vfio-pci 0000:0b:00.0: vgaarb: changed VGA decodes: olddecodes=io+mem,decodes=io+mem:owns=none
[ 2.692215] vfio_pci: add [10de:1e87[ffffffff:ffffffff]] class 0x000000/00000000
[ 2.712193] vfio_pci: add [10de:10f8[ffffffff:ffffffff]] class 0x000000/00000000
[ 2.712199] vfio_pci: add [10de:1ad8[ffffffff:ffffffff]] class 0x000000/00000000
[ 2.712204] vfio_pci: add [10de:1ad9[ffffffff:ffffffff]] class 0x000000/00000000
[ 4.960496] vfio-pci 0000:0b:00.0: vgaarb: changed VGA decodes: olddecodes=io+mem,decodes=io+mem:owns=none
Abschluss
Vielen Dank für Ihre Hilfe ... Ich weiß nicht, was diese beiden anderen Einträge in der nVidia IOMMU-Gruppe sind, aber sie scheinen alle zum nVidia-Gerät zu gehören. Ich vermute, wenn ich den USB- und den seriellen Controller deaktivieren könnte, würde es vielleicht funktionieren?
Antwort1
Ich stehe seit Kurzem vor demselben Problem. Das Hauptziel besteht darin, WLAN mit VFIO zu betreiben, aber ich muss auch einen USB-Stick und einen RAM verschieben, da sie sich in derselben IOMMU-Gruppe befinden.
Ich habe alle in den Fragen angegebenen Schritte ausgeführt und RAM und WLAN-Gerät auf vfio erhalten, aber kein USB.
Schließlich habe ich herausgefunden, dass xhci_hcd in den Kernel kompiliert ist und nicht als Modul. Wenn Sie also die USB-Controller-ID in GRUB_CMDLINE_LINUX_DEFAULT eingeben, wird der USB-Controller trotzdem mit xhci_hcd verbunden, da er sich bereits im Kernel befindet. So bestätigen Sie, ob Ihr Kernel xhci_hcd darin kompiliert:
modprobe -D xhci_hcd
Wenn Ihre Ausgabe ist:
builtin xhci_hcd
Dann enthält Ihr Kernel xhci_hcd.
Am Ende erhalte ich ein Skript zum manuellen Aufheben und Binden der Treiber:
#!/bin/sh
PCI_HID=
echo -n "$PCI_HID" > /sys/bus/pci/drivers/xhci_hcd/unbind
echo -n "$PCI_HID" > /sys/bus/pci/drivers/vfio-pci/bind
Zur Frage. Folgendes sollte funktionieren:
#!/bin/sh
PCI_HID="0000:0b:00.2"
echo -n "$PCI_HID" > /sys/bus/pci/drivers/xhci_hcd/unbind
echo -n "$PCI_HID" > /sys/bus/pci/drivers/vfio-pci/bind
PCI_HID="0000:0b:00.3"
echo -n "$PCI_HID" > /sys/bus/pci/drivers/nvidia-gpu/unbind
echo -n "$PCI_HID" > /sys/bus/pci/drivers/vfio-pci/bind
PS: Obwohl wir Treiber manuell binden und trennen, sind die Schritte GRUB_CMDLINE_LINUX_DEFAULT und die Modulkonfiguration weiterhin erforderlich, da vfio sonst nicht an den USB-Controller gebunden wird.
Antwort2
Ich weiß, dass ich etwas spät zur Party komme, aber ich hoffe, dass das Folgende Menschen mit ähnlichen Problemen helfen kann. Bitte beachten Sie, dass ich dies nur auf diskreten USB-Controllern getestet habe.
xhci_hcd ist tatsächlich im Kernel integriert, sodass es den USB-Controller beansprucht und sofern kein Workaround wie etwa ein Skript zum Binden/Aufheben der Bindung gefunden wird, wird vfio-pci nicht als verwendeter Kernel zugewiesen.
Dieses Problem lässt sich auch mit dem folgenden Befehl lösen:
sudo driverctl -v set-override 0000:0X:00 vfio-pci
Wo0000:0X:00 ist Ihre PCI-ID.
Beim Neustart wird automatisch der Treiber vfio-pci zugewiesen.