如何让 X 忽略我的主 GPU?

rot*_*oup 4 xorg gpu amd-radeon nvidia-graphics-card

我有一块 MSI B450 Tomahawk Max 主板,里面有两个 GPU。我的“主”GPU 是 NVidia GeForce GTX 1660,位于主 GPU 插槽(PCI_E1,最靠近 CPU 并以 16 倍速运行)。我的第二个 GPU 是一个便宜的小型 AMD Radeon HD 5450,位于 PCI_E4,这是唯一可以容纳全尺寸卡的插槽。我的 Ryzen 5 没有集成显卡功能。

我想让我的 X windows 系统仅使用 Radeon 卡,这样我的 NVidia 就可以腾出来做其他事情,比如 GPU 直通到虚拟机等。我在使用本指南作为参考的同时遵循了本指南。我设法完成所有设置,以便我的 nvidia 卡在启动时被 vfio-pci 存根捕获,并且正确的驱动程序最初被列入黑名单,但可以稍后加载。一切似乎都很好,除了...我无法在 nVidia 卡被拔掉的情况下启动 X。我的控制台上只是出现了空白的黑屏。我可以 ssh 进入盒子,但控制台是空白的。

具有讽刺意味的是,如果我改变方式来使 Radeon 卡失效,那么 X 就可以正常启动。我还可以同时运行两张卡,每张卡驱动不同的显示器。但我无法让 X 开始仅使用 Radeon 卡。

我确实尝试了参考页面上给出的解决方案,但它不起作用 - 我最终遇到了完全相同的情况。似乎根本没有任何效果。

我针对以下两种情况发布了我的 Xorg.0.log 文件。Radeon-stub 可以工作。Nvidia-stub 不起作用 - 它最终抱怨没有配置屏幕。我试图费力地浏览它以找到线索,但考虑到所有在幕后进行的自动配置,X 的配置对我来说非常不透明。我不明白为什么任何事情都会成功或失败。

如果我知道如何查看当前的 X 配置,那就太好了,这样至少我知道“好”是什么样子。

如何强制 X 仅使用我的 Radeon GPU?

我的两个存根配置的内核参数如下:

Nvidia 存根:

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

这是该日志文件:

Nvidia 卡已删除 Xorg.0.log

rot*_*oup 7

因此,经过大量挖掘后,我发现答案就在这里,在 xorg 的“OutputClass”部分可用选项的描述中:

选项“PrimaryGPU”“布尔值”

此选项指定匹配的设备应被视为主 GPU,从而取代固件对用作输出的 GPU 的选择。如果多个输出设备与具有 PrimaryGPU 选项集的 OutputClass 部分匹配,则枚举的第一个输出设备将成为主 GPU。

将其添加到 /usr/share/X11/xorg.conf.d 中的相关文件中,告诉 X 不要使用 radeon 卡作为我的主 GPU。就我而言,我的文件名为“10-radeon.conf”。这告诉 X 忽略启动序列指定为“主要”的 GPU,而是使用与给定 OutputClass 匹配的卡。

Section "OutputClass"
        Identifier "Radeon"
        MatchDriver "radeon"
        Driver "radeon"
        Option "PrimaryGPU" "yes"
EndSection
Run Code Online (Sandbox Code Playgroud)

请注意,这是使 X 忽略主 GPU(在我的例子中)所需的唯一系统修改。不需要特殊的内核参数或其他 mods。所有这一切都会忽略 X 配置的 nvidia GPU。它不会使用 vfio-pci 存根或其他任何东西来对 GPU 进行存根 - 但它确实为卡做好了这种可能性的准备。