我正在尝试在 Ryzen 7 2700x 上为 GTX 1060 进行 GPU 直通。
我跟着https://mathiashueber.com/windows-virtual-machine-gpu-passthrough-ubuntu/但是我无法将 nvidia 驱动程序列入黑名单,因为主机的 GPU 也是 NVIDIA,所以我使用了下面提到的怪癖。
当我在主机上启动 Ubuntu 19 时,我得到了以下内容lspci -nnv
:
07:00.0 VGA compatible controller [0300]: NVIDIA Corporation TU116 [GeForce GTX 1660] [10de:2184] (rev a1) (prog-if 00 [VGA controller])
Subsystem: NVIDIA Corporation TU116 [GeForce GTX 1660] [10de:1324]
Flags: bus master, fast devsel, latency 0, IRQ 11
Memory at f6000000 (32-bit, non-prefetchable) [size=16M]
Memory at d0000000 (64-bit, prefetchable) [size=256M]
Memory at e0000000 (64-bit, prefetchable) [size=32M]
I/O ports at f000 [size=128]
Expansion ROM at 000c0000 [disabled] [size=128K]
Capabilities: <access denied>
Kernel driver in use: vfio-pci
Kernel modules: nvidiafb, nouveau
07:00.1 Audio device [0403]: NVIDIA Corporation Device [10de:1aeb] (rev a1)
Subsystem: NVIDIA Corporation Device [10de:1324]
Flags: bus master, fast devsel, latency 0, IRQ 81
Memory at f7080000 (32-bit, non-prefetchable) [size=16K]
Capabilities: <access denied>
Kernel driver in use: snd_hda_intel
Kernel modules: snd_hda_intel
07:00.2 USB controller [0c03]: NVIDIA Corporation Device [10de:1aec] (rev a1) (prog-if 30 [XHCI])
Subsystem: NVIDIA Corporation Device [10de:1324]
Flags: bus master, fast devsel, latency 0, IRQ 49
Memory at e2000000 (64-bit, prefetchable) [size=256K]
Memory at e2040000 (64-bit, prefetchable) [size=64K]
Capabilities: <access denied>
Kernel driver in use: xhci_hcd
07:00.3 Serial bus controller [0c80]: NVIDIA Corporation Device [10de:1aed] (rev a1)
Subsystem: NVIDIA Corporation Device [10de:1324]
Flags: bus master, fast devsel, latency 0, IRQ 11
Memory at f7084000 (32-bit, non-prefetchable) [size=4K]
Capabilities: <access denied>
Kernel driver in use: vfio-pci
它们位于同一个 iommu 组 (15) 中。您可以看到,该组中的某些设备未被 vfio-pci 持有。由于我在客户机和主机中都有 NVIDIA 卡,因此我无法简单地将 nvidia 驱动程序列入黑名单,而且我也没有费心将其他驱动程序列入黑名单。相反,我执行了这个脚本来手动将 pci 设备与驱动程序解除绑定:
echo -n "0000:07:00.1" > /sys/bus/pci/drivers/snd_hda_intel/unbind
echo -n "0000:07:00.1" > /sys/bus/pci/drivers/vfio-pci/bind
echo -n "0000:07:00.2" > /sys/bus/pci/drivers/xhci_hcd/unbind
echo -n "0000:07:00.2" > /sys/bus/pci/drivers/vfio-pci/bind
echo -n "0000:07:00.3" > /sys/bus/pci/drivers/nvidia-gpu/unbind
echo -n "0000:07:00.3" > /sys/bus/pci/drivers/vfio-pci/bind
有时这些07.00.3
线是不需要的,因为驱动程序开始绑定到,vfio-pci
但有时它被使用nvidia-gpu
。
在我以 root 身份运行脚本之后,所有 4 个设备都显示正在使用vfio-pci
。
如果我只添加 07.00.0(即 GTX 1060),virt-manager 会立即启动,Windows 会在设备管理器中显示 GTX 1060,但带有黄色感叹号。我尝试通过设备管理器更新驱动程序,但没有任何反应。如果我在 Steam 上启动游戏,它会启动然后关闭。我显然将电视的 HDMI 更改为 GTX 1060 的 HDMI,但我收到电视的“无信号”。Windows 还安装了 NVIDIA 控制面板,但当我尝试启动它时,什么也没发生。值得注意的是,当我使用 GTX 启动 virt-manager 时,我无法检测到其他显示器,只有默认显示器,我甚至无法更改分辨率(800x600)。我尝试了 QXL、VGA 和 Virtio,它们都以 800x600 开始,不允许我更改。
如果我将 GTX (07.00.0) 与任何其他产品放在一起07.00.x for x=1,2,3
,当我按下运行按钮时,virt-manager 会挂起几分钟,直到它最终启动 VM。然后 Windows 启动非常慢,我甚至无法解锁屏幕,因为当我单击它时,它需要大约 5 分钟的动画并显示密码输入才能解锁。
我的 Windows 10 用作i440FX
芯片组和UEFI x86_64: /usr/share/OVMF/OVMF_CODE.fd
固件。
我正在使用内核为 4.15.0-1050-oem 的 Ubuntu 19.10,因为附带的内核(5.something)出现了这个冻结错误:19.10 Ubuntu 主机在 Windows 10 qemu 安装期间完全冻结每次我启动 Windows VM 时。
然后我编译了 qemu 4.1,但当我使用所有 4 个 pci 设备 ( 07.00.x for x=0,1,2,3
) 启动时,我仍然遇到 virt-manager 启动速度极慢以及 Windows 解锁屏幕速度极慢的问题。当我仅使用 GTX (07.00.0) 启动时,我再次遇到与旧 QEMU 相同的行为。
值得注意的是,每次我添加 时07.00.x for x=1,2,3
,当我关闭虚拟机并尝试移除这些 pci 设备时,virt-manager 都会冻结,我必须将其关闭并重新打开。然后当它打开时,我必须等待 QEMU/KVM 再次连接。当它连接时,我得到
Error starting domain: internal error: Unknown PCI header type '127'
当我再次启动虚拟机时。我必须重新启动主机。这在旧版和 4.1 qemu 上都会发生。
这是我的详细 XML 机器:https://pastebin.com/BKtJq9PX
我尝试改变
<type arch="x86_64" machine="pc-i440fx-4.0">hvm</type>
到
<type arch='x86_64' machine='pc-q35-4.1'>hvm</type>
但我总是
error: XML error: The PCI controller with index='0' must be model='pcie-root' for this machine type, but model='pci-root' was found instead
关于如何进一步调试这个问题有什么想法吗?
更新:
我发现我的 NVIDIA 驱动程序中的错误是“错误 43”,因此找到了https://mathiashueber.com/fighting-error-43-nvidia-gpu-virtual-machine/。我在 XML 中应用了补丁,但它们不起作用。
这是我的整个 XML:https://pastebin.com/yajTNFPs
答案1
在将设备分配给 vfio-pci 之前,您需要确保所传递的设备没有受到主机端驱动程序的污染。通常,您可以通过将 nouveau、nvidia 和任何其他已开具发票的驱动程序(例如上述 USB 设备的驱动程序)列入黑名单来实现这一点。如果您需要系统中其他设备的这些驱动程序,请在将需要绑定到 vfio-pci 的设备绑定到 vfio-pci 之后,在启动脚本中加载它们。
还请注意,在客户机和主机之间动态绑定和解除绑定 PCI 设备会导致许多系统出现稳定性问题。最好的方法是将设备静态绑定到 vfio-pci 并保持绑定状态。
您的 libvirt xml 文件看起来具有避免客户机中的代码 43 错误的所有必要位。