为什么在 Ubuntu 中链接 GPU 会冻结 QEMU

为什么在 Ubuntu 中链接 GPU 会冻结 QEMU

我在一台配备 2 个 GTX 1070 和 I5 7400 CPU 的工作站上运行 Ubuntu,安装了 QEMU,并且有一个旧的 Windows 10 虚拟机,我尝试通过在 virt-manager GUI 中添加 PCI 链接硬件来链接 GPU,并恢复 Windows 虚拟机(从保存的状态)它检测到 PCI 硬件但没有安装任何驱动程序,我完全打开虚拟机然后尝试再次运行它,但出现此错误

  File "/usr/share/virt-manager/virtManager/object/libvirtobject.py", line 57, in newfn
    ret = fn(self, *args, **kwargs)
  File "/usr/share/virt-manager/virtManager/object/domain.py", line 1384, in startup
    self._backend.create()
  File "/usr/lib/python3/dist-packages/libvirt.py", line 1353, in create
    raise libvirtError('virDomainCreate() failed')
libvirt.libvirtError: unsupported configuration: host doesn't support passthrough of host PCI devices

所以我检查 VT 是否已启用,并且已启用,因为 sudo rdmsr 0x3A返回一个5

我做的下一步是检查kvm-ok,然后我得到了

 INFO: /dev/kvm exists
 KVM acceleration can be used

到目前为止一切似乎都还好,所以我用

virt-host-validate并意识到IOMMU没有启用所以我做了以下编辑 ,GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"然后GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on"update-grub

现已IOMMU启用,因为virt-host-validate输出

  QEMU: Checking if IOMMU is enabled by kernel                               : PASS

现在,当我尝试运行没有 pci 链接的相同 vm 时,它工作正常,但添加 pci 链接会导致libvirtd超时和冻结

авг 28 00:45:22 WORKSTATION systemd[1]: libvirtd.service: Unit process 1814 (dnsmasq) remains running after unit stopped.
авг 28 00:45:22 WORKSTATION systemd[1]: libvirtd.service: Unit process 1815 (dnsmasq) remains running after unit stopped.
авг 28 00:45:22 WORKSTATION systemd[1]: libvirtd.service: Unit process 4018 (libvirtd) remains running after unit stopped.
авг 28 00:45:22 WORKSTATION systemd[1]: Failed to start Virtualization daemon.

输出 pfdmesg

[32729.791574] [drm:nv_drm_master_set [nvidia_drm]] *ERROR* [nvidia-drm] [GPU ID 0x00000500] Failed to grab modeset ownership
[32729.792216] [drm:nv_drm_master_set [nvidia_drm]] *ERROR* [nvidia-drm] [GPU ID 0x00000900] Failed to grab modeset ownership

我是否遗漏了什么,是否需要启用任何额外的功能或者禁用任何功能?

答案1

dmesg输出中可以看出,Linux 内核为两张卡加载了驱动程序。

为了释放虚拟机的设备,您需要解除与该设备的驱动程序的绑定。https://www.iram.fr/~blanchet/ethercat/unbind_manually_pci_device.html告诉如何解除驱动程序与设备的绑定。

首先,找到 PCI 插槽和实际驱动程序:

lspci -Dk

输出可能如下所示:

0000:01:06.0 Ethernet controller: Intel Corporation 8255xER/82551IT Fast

以太网控制器(修订版 10)正在使用的内核驱动程序:e100 0000:01:07.0 以太网控制器:Intel Corporation 8255xER/82551IT 快速以太网控制器(修订版 10)正在使用的内核驱动程序:e100

您需要在那里找到 NVidia 条目。您可能需要猜测您正在使用哪个设备。

您需要记下 GPU 的PCI ID( 0000:01:07.0)和驱动程序名称( )。e100

然后你可以发出

echo -n "<pci id>" > /sys/bus/pci/drivers/<driver>/unbind

您需要用从输出中获得的值替换<pci_id>和。这将解除 NVidia 驱动程序与指定设备的绑定,释放它以进行 PCI 直通。<driver>lspci

相关内容