我有一块 MSI B450 Tomahawk Max 主板,里面有两个 GPU。我的“主”GPU 是 NVidia GeForce GTX 1660,位于主 GPU 插槽(PCI_E1,最靠近 CPU 并以 16 倍速度运行)。我的第二个 GPU 是一个便宜的小型 AMD Radeon HD 5450,位于 PCI_E4,这是唯一可以容纳全尺寸卡的插槽。我的锐龙 5 没有集成显卡功能。
我想让我的 X windows 系统只使用 Radeon 卡,这样我的 NVidia 就可以腾出来做其他事情,比如 GPU 直通到 VM 等。我在使用它作为参考时遵循了本指南。我设法完成了所有设置,以便我的 nvidia 卡在启动时被 vfio-pci 存根抓取,并且正确的驱动程序最初被列入黑名单,但以后可以加载。一切似乎都很好,除了...我无法在 nVidia 卡被淘汰的情况下启动 X。我的控制台上出现了一个空白的黑屏。我可以 ssh 进入盒子,但控制台是空白的。
具有讽刺意味的是,如果我改变一些事情以使 Radeon 卡被淘汰,那么 X 开始就好了。我还可以同时运行两张卡,每张卡都驱动不同的显示器。但是我不能让 X 开始只使用 Radeon 卡。
我确实尝试了参考页面上给出的这个解决方案,但它不起作用 - 我最终遇到了完全相同的情况。它似乎完全没有效果。
我针对以下两种情况发布了我的 Xorg.0.log 文件。Radeon-stub 可以工作。Nvidia-stub 一个不起作用 - 它以抱怨没有配置屏幕结束。我试图通过它寻找线索,但 X 的配置对我来说非常不透明,因为所有自动配置都在幕后进行。我无法弄清楚为什么任何事情都有效或失败。
如果我知道如何查看我当前的 X 配置,那就太好了,所以至少我知道“好”的样子。
如何强制 X 仅使用我的 Radeon GPU?
我的两个存根配置的内核参数如下:
英伟达存根:
linux /boot/vmlinuz-5.4.0-48-generic root=UUID=09d61674-efb6-441a-b9ab-f958990e5c31 ro debug splash dis_ucode_ldr vfio-pci.ids=10de:2184,10de:1aeb,10de:1aec,10de:1aed module_blacklist=nvidia,snd_hda_intel,i2c_nvidia_gpu vt.handoff=7
Radeon存根:
linux /boot/vmlinuz-5.4.0-48-generic root=UUID=09d61674-efb6-441a-b9ab-f958990e5c31 ro debug splash module_blacklist=radeon,snd_hda_intel vt.handoff=7
Radeon Stub Xorg.0.log (工作,在 Nvidia GPU 上使用)
Nvidia Stub Xorg.0.log (失败,说“屏幕 0 已删除,因为没有匹配的配置部分)
没有存根的Xorg.0.log,Nvidia 卡上的一台显示器,Radeon 卡上的一台显示器(工作正常)
编辑:根据@dirkt 的建议,我尝试将“nouveau”驱动程序添加到内核命令行黑名单中。Xorg.0 日志文件链接如下。它根本没有效果。
Nvidia Stub + 列入黑名单的 nouveau Xorg.0.log
另外,请注意,此时我还没有对我的虚拟机做任何事情。我只是想让 X 在不使用 Nvidia 卡的情况下运行。
我还尝试从我的系统中删除 nvidia 卡。X 可以工作,但我当然不能通过不存在的视频卡将它们传递给 VM。我注意到这个日志文件和 Nvidia-stub 文件之间的区别是没有提到 nvidia/nouveau 驱动程序。比较这些日志文件还突出显示nvidia-stub中的第一个错误如下(我的 nvidia GPU 在 PCI 总线地址 26 上)。这几乎可以肯定是因为 nvidia 卡被淘汰了,但这正是我希望 X忽略它的原因。
(EE) [drm] Failed to open DRM device for pci:0000:26:00.0: -19
这是该日志文件:
因此,经过大量挖掘后,我发现答案就在这里,在 xorg 的“OutputClass”部分可用选项的描述中:
将此添加到 /usr/share/X11/xorg.conf.d 中的相关文件中,告诉 X 不要将 radeon 卡用作我的主要 GPU。就我而言,我的文件名为“10-radeon.conf”。这告诉 X 忽略引导序列指定为“主要”的 GPU,而是使用与给定 OutputClass 匹配的卡。
请注意,这是使 X 忽略主 GPU(在我的情况下)所需的唯一系统修改。不需要特殊的内核参数或其他模块。所有这一切都是忽略 X 配置的 nvidia GPU。它不会使用 vfio-pci 存根或其他任何东西来存根 GPU - 但它确实为这种可能性做好了准备。
部分答案:
首先,通过暂时禁用 VM 使调试更容易。成功忽略主机系统上的 NVidia 卡后,再次启用它。
您的日志显示您正在使用
nouveau
驱动程序,因此将主机系统上的 nouveau 内核模块列入黑名单,请参见此处(或在您的发行版中搜索“黑名单 nouveau 内核模块”)。开机后使用
dmesg
,查看黑名单是否有效;比较黑名单更改前后的输出。一旦成功,您的 X 日志应该只显示它与 Radeon 一起出现。如果这不起作用,请尝试自定义
xorg.conf
(是的,这些仍然是一件事,即使有些人否认这一点)。然后让硬件直通到 VM 工作,然后确保在 VM 来宾操作系统上使用正确的驱动程序(可能您需要闭源
nvidia
驱动程序,具体取决于您想用它做什么)。