요약

요약

요약

게임용 Windows 게스트를 실행할 수 있도록 KVM이 있는 Linux 호스트에서 GPU 패스스루를 설정하려고 합니다. 일부 IOMMU 항목(모두 통과하려는 GPU에 속함)이 vfio 버스에 할당되고 다른 항목은 nvidia-gpu 드라이버에 할당되는 문제가 발생했습니다.

하드웨어

CPU - 스레드리퍼 1950X

GPU - Sapphire RX 480(AMD, 호스트 그래픽용) - MSI Duke RTX 2080(nVidia, 게스트 그래픽용)

MoBo - MSI 카본 게이밍 프로 AC x399

문제

nVidia GPU를 통과하려고 하면 오류가 발생합니다 Please ensure all devices within the iommu_group are bound to their vfio bus driver.(아래 이미지 참조).

을 실행하면 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

0b:00.0, 및 의 vfio-pci에서 RTX 2080을 사용하고 있지만 0b:00.1및 (모두 RTX 2080에 속함)은 및 에서 사용하고 있다고 0b:00.2보고 합니다 .0b.00.3xhci_hcdnvidia-gpu

내 이해는 이것이 문제라는 것입니다.

내가 한 것

주로 참고했는데레벨1 스레드그리고Jack Ford의 블로그 게시물:

블랙리스트에 오른 누보

파일에/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

최근에 같은 문제에 직면했습니다. 주요 목표는 Wi-Fi에서 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

추신: 드라이버를 수동으로 바인딩 및 바인딩 해제하고 있지만 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가 됩니다.

관련 정보