![如何让 X 忽略我的主 GPU?](https://linux22.com/image/1634072/%E5%A6%82%E4%BD%95%E8%AE%A9%20X%20%E5%BF%BD%E7%95%A5%E6%88%91%E7%9A%84%E4%B8%BB%20GPU%EF%BC%9F.png)
我有一块 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 直通到 VM 等。我已关注本指南使用时这作为参考。我设法设置了所有东西,这样我的 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
Radeon Stub:
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
另外,请注意,此时我还没有对我的 VM 进行任何操作。我只是尝试让 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
以下是该日志文件:
答案1
经过一番挖掘,我发现答案就在这里在 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
请注意,这是使 X 忽略主 GPU 所需的唯一系统修改(就我而言)。不需要特殊内核参数或其他修改。这只会忽略 X 配置中的 nvidia GPU。它不会使用 vfio-pci 存根或其他任何东西来消除 GPU - 但它确实为这种可能性做好了准备。
答案2
部分答案:
首先,通过暂时禁用虚拟机来简化调试。成功忽略主机系统上的 NVidia 卡后,再次启用它。
您的日志表明您正在使用该nouveau
驱动程序,因此将主机系统上的 nouveau 内核模块列入黑名单,例如这里(或者在谷歌上搜索适合你的发行版的“blacklist nouveau kernel module”)。
启动后使用dmesg
,查看黑名单是否有效;比较黑名单更改前后的输出。
一旦成功,您的 X 日志应该会显示它只与 Radeon 有关。如果这不起作用,请尝试自定义xorg.conf
(是的,这些仍然存在,尽管有些人否认这一点)。
然后让硬件直通到 VM 工作,然后确保在 VM 客户操作系统上使用正确的驱动程序(可能您需要闭源nvidia
驱动程序,这取决于您想用它做什么)。