在UNRAID下想要利用NVIDIA显卡,最为传统的方法是创建一个虚拟机,并将显卡直通进去。最早使用1080测试了直通功能,只需要在虚拟机设置里的Other PCI Devices选中1080即可。但20系显卡因为多了一个type c接口,情况有些变化,之前在知乎上分享了URNIAD 6.6.6直通2080ti的经历,特地将其转载过来。
错误
之前在Unraid里建立了一个使用GTX1080的虚拟机,想用RTX 2080Ti替换了GTX1080。修改虚拟机配置后,启动虚拟机时很不幸地报错了:
fio error: 0000:02:00.0: group 27 is not viable Please ensure all devices within the iommu_group are bound to their vfio bus driver.
这是因为2080Ti新增了一个USB Type-C接口,默认情况下Unraid的VM manager并不会将这个接口同时分配给虚拟机。
在TOOLS->System Devices->PCI Devices and IOMMU Groups可以看到该USB控制器与显示控制器在同一个IOMMU group内。
IOMMU group 27: [10de:1e04] 02:00.0 VGA compatible controller: NVIDIA Corporation TU102 [GeForce RTX 2080 Ti] (rev a1) [10de:10f7] 02:00.1 Audio device: NVIDIA Corporation TU102 High Definition Audio Controller (rev a1) [10de:1ad6] 02:00.2 USB controller: NVIDIA Corporation TU102 USB 3.1 Controller (rev a1) [10de:1ad7] 02:00.3 Serial bus controller [0c80]: NVIDIA Corporation TU102 UCSI Controller (rev a1)
因此只将显示控制器分配给IOMMU,就会出现上面的错误。
解决方案
将显示控制器与USB控制器分离开放到不同的IOMMU group内
该方案最简单,只需要将Unraid->SETTINGS->PCIe ACS overide改成Both,然后重启计算机就行。
IOMMU group 31: [10de:1e04] 02:00.0 VGA compatible controller: NVIDIA Corporation TU102 [GeForce RTX 2080 Ti] (rev a1) IOMMU group 32: [10de:10f7] 02:00.1 Audio device: NVIDIA Corporation TU102 High Definition Audio Controller (rev a1) IOMMU group 33: [10de:1ad6] 02:00.2 USB controller: NVIDIA Corporation TU102 USB 3.1 Controller (rev a1) IOMMU group 34: [10de:1ad7] 02:00.3 Serial bus controller [0c80]: NVIDIA Corporation TU102 UCSI Controller (rev a1)
重启完之后显示控制器与USB控制器就处于不同的IOMMU group了,虚拟机的设置也不用改。

将USB控制器也直通给虚拟机
如果不想修改PCIe ACS overide,可以把USB控制器也直通给虚拟机。这一部分主要是参考了youtube上的视频教程:https://www.youtube.com/watch?time_continue=202&v=UilWLtMYd-U。
作者提供了两条辅助命令非常方便。
for usb_ctrl in $(find /sys/bus/usb/devices/usb* -maxdepth 0 -type l); do pci_path=”$(dirname “$(realpath “${usb_ctrl}”)”)”; echo “Bus $(cat “${usb_ctrl}/busnum”) –> $(basename $pci_path) (IOMMU group $(basename $(realpath $pci_path/iommu_group)))”; lsusb -s “$(cat “${usb_ctrl}/busnum”):”; echo; done
第一条命令可以显示出USB设备与控制器的详细信息,比如Unraid启动盘是在哪个控制器下面。这一步其实对于我来说用处不大,因为我只想把2080Ti上的USB控制器直通给虚拟机。这主要是针对那些想把板载USB控制器直通的人,他们需要这些信息。
for iommu_group in $(find /sys/kernel/iommu_groups/ -maxdepth 1 -mindepth 1 -type d);do echo “IOMMU group $(basename “$iommu_group”)”; for device in $(ls -1 “$iommu_group”/devices/); do if [[ -e “$iommu_group”/devices/”$device”/reset ]]; then echo -n “[RESET]”; fi; echo -n $’t’;lspci -nns “$device”; done; done
第二条命令才是我真正需要的,直接找到IOMMU group 27,看到两个控制器的id为10de:1ad6与10de:1ad7。
IOMMU group 27 [RESET] 02:00.0 VGA compatible controller [0300]: NVIDIA Corporation TU102 [GeForce RTX 2080 Ti] [10de:1e04] (rev a1) 02:00.1 Audio device [0403]: NVIDIA Corporation TU102 High Definition Audio Controller [10de:10f7] (rev a1) 02:00.2 USB controller [0c03]: NVIDIA Corporation TU102 USB 3.1 Controller [10de:1ad6] (rev a1) 02:00.3 Serial bus controller [0c80]: NVIDIA Corporation TU102 UCSI Controller [10de:1ad7] (rev a1)
然后将vfio-pci.ids=10de:1ad6,10de:1ad7
加入syslinux设置,然后重启计算。
default menu.c32 menu title Lime Technology, Inc. prompt 0 timeout 50 label unRAID OS menu default kernel /bzimage append vfio-pci.ids=10de:1ad6,10de:1ad7 initrd=/bzroot
打开虚拟机设置,将两个控制器分配给虚拟机。

最终效果
在设备管理器已经可以看到了2080Ti带的USB控制器了。买了一个绿联的拓展坞,测试后可以正常使用。如果需要一台高性能的游戏虚拟机,20系显卡是非常适合的。之前没有直通 USB 控制器的时候,每当临时插上 USB 设备,就要去 Unraid 网页分配一次,非常繁琐。而直通主板的 USB 控制器又有相当多的限制,如果单独购买 PCI-E 转 usb 扩展卡又太过于浪费。