我需要为 qemu 下的 VM 传递 USB 3.0 控制器。
我的 lspci -nnk 是:
...
02:00.0 USB controller [0c03]: Renesas Technology Corp. uPD720201 USB 3.0 Host Controller [1912:0014] (rev 03)
Kernel driver in use: xhci_hcd
03:00.0 USB controller [0c03]: VIA Technologies, Inc. VL805 USB 3.0 Host Controller [1106:3483] (rev 01)
Subsystem: Gigabyte Technology Co., Ltd VL805 USB 3.0 Host Controller [1458:5007]
Kernel driver in use: xhci_hcd
...
我想要通过的是 uPD720201,它在 IOMMU 组中很孤独。
我的 vfio.conf 是:
options vfio-pci ids=1002:68f9,1002:aa68,1912:0014 disable_vga=1
#Note : the 1002:68f9 and 1002:aa68 are the gpu card, which is correctly pass trough
但现在的问题似乎是 xhci_hcd 驱动程序覆盖了 vfio 驱动程序,因为它似乎在启动时正确加载:
$ dmesg | grep "vfio"
[ 4.475492] vfio: unknown parameter 'vfio_iommu_type1' ignored
[ 4.476319] vfio: unknown parameter 'vfio_virqfd' ignored
[ 4.477177] vfio: unknown parameter 'vfio_pci' ignored
[ 4.478023] vfio: unknown parameter 'ids' ignored
[ 21.546903] vfio-pci 0000:05:00.0: vgaarb: changed VGA decodes: olddecodes=io+mem,decodes=none:owns=none
[ 21.568068] vfio_pci: add [1002:68f9[ffff:ffff]] class 0x000000/00000000
[ 21.588151] vfio_pci: add [1002:aa68[ffff:ffff]] class 0x000000/00000000
[ 21.588824] vfio_pci: add [1912:0014[ffff:ffff]] class 0x000000/00000000
[ 27.296307] vfio-pci 0000:05:00.0: vgaarb: changed VGA decodes: olddecodes=none,decodes=none:owns=none
我已经尝试在 blacklist.conf 和 grub 中将 xhci_hcd 列入黑名单:
/etc/modprobe.d/blacklist.conf
...
blacklist xhci_hcd
...
/etc/default/grub
...
GRUB_CMDLINE_LINUX_DEFAULT="amd_iommu=on iommu=pt kvm_amd.npt=1 modprobe.blacklist=xhci_hcd"
...
当然,在进行这些修改后,我执行了 update-initramfs -u 和 update-grub2。在所有情况下,它都没有效果,我总是看到“正在使用的内核驱动程序:xhci_hcd”我发现禁用 xhci_hcd 的唯一方法是通过以下方式解除我的卡的绑定:
$ echo '0000:02:00.0' | tee /sys/bus/pci/devices/0000:02:00.0/driver/unbind
但我不知道如何在启动时执行它(可能在 vfio 分配之前)。
您知道禁用 xhci_hcd(或其他方法)以使其工作的解决方案吗?
我试过了,我有这个:
命令已经出现,但都在一行上,所以我只需在它们之间输入回车符。
现在我的板载 USB3 控制器已被禁用(我试图在其上放置一个 USB 设备但它确实被禁用了)但我添加的控制器没有被禁用。
我的 lspci -nnk 是:
...
02:00.0 USB controller [0c03]: Renesas Technology Corp. uPD720201 USB 3.0 Host Controller [1912:0014] (rev 03)
Kernel driver in use: xhci_hcd
03:00.0 USB controller [0c03]: VIA Technologies, Inc. VL805 USB 3.0 Host Controller [1106:3483] (rev 01)
Subsystem: Gigabyte Technology Co., Ltd VL805 USB 3.0 Host Controller [1458:5007]
...
注意:现在我的 grub 文件是(并且它使我上面描述的内容持久):
/etc/default/grub
...
GRUB_CMDLINE_LINUX="amd_iommu=on iommu=pt kvm_amd.npt=1"
GRUB_CMDLINE_LINUX="modprobe.blacklist=xhci_hcd"
...
答案1
我最终选择从 kernel.org 源完全重建内核,并将 xhci_hcd 设为加载模块而不是内置模块。现在我可以通过以下方式禁用 xhci_hcd:
modprobe -r xhci_pci
modprobe -r xhci_hcd
随后是:
modprobe vfio
modprobe vfio_pci
现在我可以将控制器连接到虚拟机并获得:
lspci -nnk
...
02:00.0 USB controller [0c03]: Renesas Technology Corp. uPD720201 USB 3.0 Host Controller [1912:0014] (rev 03)
Kernel driver in use: vfio-pci
Kernel modules: xhci_pci
03:00.0 USB controller [0c03]: VIA Technologies, Inc. VL805 USB 3.0 Host Controller [1106:3483] (rev 01)
Subsystem: Gigabyte Technology Co., Ltd VL805 USB 3.0 Host Controller [1458:5007]
Kernel modules: xhci_pci
...
但不幸的是我的板载 USB 3.0 控制器(VL805)被禁用,所以我只能执行以下操作:
...
modprobe xhci_pci
modprobe xhci_hcd
...
所以现在两个控制器都可以在好的机器上运行,但这有点复杂
注意:grub和blacklist.conf中的所有配置都是无用的。