我的系统包含 2 个 Nvidia 卡。我想要实现的是一张卡由nouveau
驱动程序驱动,而另一张卡由官方nvidia
blob 驱动程序驱动。
如果 nvidia 驱动程序在启动时自动启动,使用特定的 nvidia 驱动程序选项“nvidia_340.NVreg_AssignGpus=0:02:00”,则两个驱动程序会成功共存。使驱动程序仅探测特定设备,并且使用 手动启动 nouveau 驱动程序modprobe
,探测其他未使用的设备。
我想通过使两个模块在启动时加载来实现自动化,但我还没有设法告诉nouveau
驱动程序仅探测两个显卡之一。模块的加载顺序似乎是不确定的,当 nouveau 模块在 nvidia 模块之前加载时,它会探测这两个模块并阻止官方 nvidia 访问另一个模块。
我知道我可以在启动阶段执行一个 systemd 服务任务modprobe nouveau
(在加载 nvidia 模块后很好地执行),但我想有更好的方法来做到这一点。我想到了,udev
但由于我不太了解,所以我不确定这是要走的路。
处理这个问题的正确方法是什么?
答案1
因此,解决方案的道路并不容易,但解决方案本身却出人意料地简单:
install
这个想法是在配置文件中使用该指令/etc/modprobe.d/
来重新定义 nvidia 驱动程序通过 modprobe 运行的方式。我在文件中设置了以下内容/etc/modprobe.d/nvidia-with-nouveau.conf
:
install nvidia_340 /sbin/modprobe --ignore-install nvidia_340; /sbin/modprobe nouveau
它指示内核如何启动 nvidia 模块(我的版本是 340)。通过这个指令,我告诉它首先启动 nvidia,然后启动 nouveau。--ignore-install
需要防止内核重用 install 指令来启动 nvidia 模块,我认为这可能会导致某种无限循环。
install
配置文件中的其他可用指令/etc/modprobe.d
在 中得到了很好的解释man modprode.d
。
将 nouveau 驱动程序保留在黑名单中以防止其自行启动非常重要。在 Ubuntu 上,Nvidia 驱动程序通过来自官方 Ubuntu 存储库的 deb 软件包安装时,会通过安装文件将 nouveau 模块列入黑名单/etc/modprobe.d/nvidia-340_hybrid.conf
(这适用于我,在其他操作系统和驱动程序版本上可能有所不同)。
该文件包含以下内容:
blacklist nouveau
blacklist lbm-nouveau
alias nouveau off
alias lbm-nouveau off
以下几行为 nouveau 创建别名,off
并且必须对其进行注释:
#alias nouveau off
#alias lbm-nouveau off
最后,我想,需要更新 initramfs 才能考虑到这些更改:
sudo update-initramfs -u
我现在可以享受多席位配置,其中一个席位在 nouveau 上,另一个席位在 nvidia-driver 上。