概括
我正在嘗試使用 KVM 在 Linux 主機上設定 GPU 直通,以便我可以運行 Windows 來賓遊戲。我遇到了一個問題,一些 IOMMU 條目(全部屬於我希望直通的 GPU)被分配給 vfio 總線,而其他條目則被分配給 nvidia-gpu 驅動程式。
硬體
CPU——Threadripper 1950X
GPU - Sapphire RX 480(AMD,用於主機顯示卡) - MSI Duke RTX 2080(nVidia,用於客戶顯示卡)
MoBo - MSI Carbon Gaming Pro AC x399
問題
當我嘗試通過我的 nVidia GPU 時,出現錯誤Please ensure all devices within the iommu_group are bound to their vfio bus driver.
(見下圖)。
- virt-manager 中的設定:https://i.stack.imgur.com/BK0s4.png
- 我得到的錯誤:https://i.stack.imgur.com/XJKfm.png
當我運行時lspci -k
,我發現以下記錄:
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
其中報告稱,vfio-pci 正在 、 和 上使用 RTX 2080 0b:00.0
,0b:00.1
但是0b:00.2
和0b.00.3
(都屬於 RTX 2080)正在由xhci_hcd
和使用nvidia-gpu
。
我的理解是,這就是問題所在。
我做了什麼
我主要提到Level1 線和傑克福特的部落格文章:
列入黑名單的新風
在文件中/etc/modprobe.d/blacklist-nouveau.conf
blacklist nouveau
options nouveau modeset=0
更新了GRUB
在/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=""
新增了內核模組
在/etc/modules
:
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
在/etc/modprobe.d/vfio.conf
:
options vfio-pci ids=10de:1e87,10de:10f8,10de:1ad8,10de:1ad9
在/etc/modules-load.d/vfio-pci.conf
:
vfio-pci
確認 IOMMU/VFIO 已啟用
$ 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
結論
非常感謝您的幫助...我不知道 nVidia IOMMU 群組中的其他兩個條目是什麼,但它們似乎都屬於 nVidia 設備。我猜如果我可以停用 USB 和串行控制器,事情可能會起作用嗎?
答案1
最近面臨同樣的問題。主要目標是讓 wifi 使用 vfio,但還需要移動 USB 和 RAM,因為它們位於同一 IOMMU 群組中。
我完成了問題中所述的所有步驟,在 vfio 上獲得了 RAM 和 WIFI 設備,但沒有 USB。
最後發現xhci_hcd是編譯到核心中的,而不是作為模組的。因此,將 USB 控制器 id 放入 GRUB_CMDLINE_LINUX_DEFAULT 中,USB 控制器仍將與 xhci_hcd 綁定,因為它已經位於核心內部。若要確認您的核心是否在下列範圍內編譯 xhci_hcd:
modprobe -D xhci_hcd
如果你的輸出是:
builtin xhci_hcd
那麼你的核心包含 xhci_hcd。
我最終得到了一個腳本來執行手動驅動程式取消綁定和綁定:
#!/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
對於這個問題。以下應該有效:
#!/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:雖然我們手動綁定和取消綁定驅動程序,但 GRUB_CMDLINE_LINUX_DEFAULT 和模組配置步驟仍然是必要的,否則 vfio 將不會綁定 USB 控制器。
答案2
我知道我參加聚會有點晚了,但我希望以下內容可以幫助面臨類似問題的人。 請注意,我僅在獨立 USB 控制器上對此進行了測試。
xhci_hcd 確實內建在核心中,因此它聲明 USB 控制器,除非找到解決方法,例如綁定/取消綁定 vfio-pci 的腳本,否則不會將其指派為正在使用的核心。
解決此問題的另一種方法是使用以下命令:
sudo driverctl -v set-override 0000:0X:00 vfio-pci
在哪裡0000:0X:00 是您的 PCI ID。
重新啟動後,分配的驅動程式將自動成為 vfio-pci。