我在一台配备 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