直到最近,我还在运行 Ubuntu 19.10,并且拥有一个带有直通 GPU 的 Win 10 VM。一切都运行良好。几天前,我全新安装了 20.04,但无法使相同的设置正常工作。我希望只需导入旧配置,一切就会正常工作,但事实并非如此。此时,我进入了 VM 启动并可以在没有安装驱动程序的情况下使用 GPU(GTX 1080)的阶段。但是,一旦我尝试安装驱动程序,屏幕最终就会变黑,并一直保持这种状态,直到 VM 重新启动进入恢复状态。
我不确定哪些细节对调试问题最有帮助,因为显然涉及很多配置。最初我遵循该指南,过去是 18.04,现在是 20.04。然后我到处捡了一些不同的碎片。
当vfio
移动到内核时,我的 grub 启动行如下所示:intel_iommu=on iommu=pt apparmor=0 security='' vfio-pci.ids=10de:1b80,10de:10f0 pcie_aspm=off vfio_iommu_type1.allow_unsafe_interrupts=1 vfio_pci.disable_vga=1 vfio_pci.disable_idle_d3=1 acpi=off intremap=no_x2apic_optout nox2apic
我可以看到 GPU 由vfio
驱动程序控制。
以下kvm
内容已通过:(options kvm ignore_msrs=1
通过检查验证/sys/module/kvm/parameters/ignore_msrs
)
为了解决 nvidia 驱动程序错误“43”,我添加了建议的更改这里
将 20.04 上的新设置与 19.10 上的旧设置进行比较,我认为有两个主要变化:
vfio
已移至内核,因此我现在不再将参数传递给模块,而是直接将它们传递给内核。这似乎可行,正如我上面所写。- 我不得不从 切换
i440fx
到q35
。i440fx
VM 拒绝确认连接到 GPU 的显示器的存在。它承认 GPU 的存在,尽管状态为错误,但无法使用它。并且任何安装 nvidia 驱动程序的尝试都会导致 BSOD。在q35
没有安装驱动程序的情况下,它能够使用屏幕。
配置的其他部分没有改变,这就是我没有提供上述更多细节的主要原因,因为现在我仍然假设它们是“正确的”并且“应该可以工作”。
我尝试创建一个新的虚拟机,但它有同样的问题:一旦我尝试在虚拟机中安装 nvidia 驱动程序,屏幕就会在某个时候变黑,并且虚拟机会在一段时间后崩溃。如果我停止通过 GPU,那么我可以删除驱动程序,然后再次使用 GPU。
我在日志中找不到任何有用的信息。我确实看到了一些可能相关的内容,但我不确定:
Jul 12 00:05:56 homenest libvirtd[41132]: host doesn't support hyperv 'relaxed' feature
Jul 12 00:05:56 homenest libvirtd[41132]: host doesn't support hyperv 'vapic' feature
禁用上述功能会使消息消失,但对虚拟机中的 nvidia 驱动程序没有影响。
Jul 12 00:06:16 homenest kernel: [ 5476.135668] kvm [124558]: vcpu0, guest rIP: 0xfffff803343862f7 ignored rdmsr: 0x611
Jul 12 00:06:16 homenest kernel: [ 5476.135672] kvm [124558]: vcpu0, guest rIP: 0xfffff8033438630d ignored rdmsr: 0x641
Jul 12 00:06:16 homenest kernel: [ 5476.135674] kvm [124558]: vcpu0, guest rIP: 0xfffff80334386323 ignored rdmsr: 0x606
Jul 12 00:06:16 homenest kernel: [ 5476.135676] kvm [124558]: vcpu0, guest rIP: 0xfffff80334386134 ignored rdmsr: 0x606
Jul 12 00:06:16 homenest kernel: [ 5476.135679] kvm [124558]: vcpu0, guest rIP: 0xfffff803343811bc ignored rdmsr: 0x641
Jul 12 00:06:16 homenest kernel: [ 5476.135681] kvm [124558]: vcpu0, guest rIP: 0xfffff80334381207 ignored rdmsr: 0x611
据我所知,这些都是一些可以安全忽略的垃圾邮件。
Jul 12 18:42:48 homenest kernel: [ 212.184333] vfio-pci 0000:05:00.0: enabling device (0100 -> 0103)
Jul 12 18:42:48 homenest kernel: [ 212.184520] vfio-pci 0000:05:00.0: vfio_ecap_init: hiding ecap 0x19@0x900
Jul 12 18:42:48 homenest kernel: [ 212.186952] vfio-pci 0000:05:00.1: enabling device (0100 -> 0102)
不知道并且找不到该vfio_ecap_init
消息的含义,但是其他两行表明vfio
设备已成功通过。
遗憾的是,我没有关于 19.10 上各个组件版本的信息。现在我有以下内容:
Compiled against library: libvirt 6.0.0
Using library: libvirt 6.0.0
Using API: QEMU 6.0.0
Running hypervisor: QEMU 4.2.0
5.4.0-40-generic
我想测试较旧的内核,但5.3.18-050318-generic
由于无法从 zfs 启动,系统无法启动,并且5.4.0-26-generic
系统启动后似乎缺少一些内核模块,因此虚拟机根本无法启动。由于我不确定这些内核是否真的会有所不同,所以我不想花时间修复这些问题。
这就是问题概述。如果您能提供任何建议,告诉我该尝试什么以及从哪里着手解决该问题,我将不胜感激。如果需要任何其他信息,我很乐意提供。
更新:额外的实验表明,问题会自行触发,如果带有通过 GPU 的虚拟机停留几分钟,它就会崩溃,屏幕变黑等。之后,可以通过不通过 GPU 启动虚拟机来“恢复”。我也尝试通过另一个 GPU,行为完全相同。
我还发现日志中出现了另一条消息:
kernel: [ 608.945246] vfio-pci 0000:03:00.0: vfio_bar_restore: reset recovery - restoring BARs
我仍需要尝试裸机 Windows 安装和 Ubuntu 19.10 安装,这些安装以前运行良好。只需要找时间运行所有这些实验...