Arch Linux 多显卡切换配置

书接上回 虚拟机显卡直通 (PCI passthrough via OVMF)


系统准备

现在的台式机 CPU,动不动就不带核显,但那个是插着电源线的,不用考虑如何省电

而现在的笔记本,动不动就是核显加独显,并且 BIOS 里不一定带独显开关。这就造成了一种困扰:我现在没有玩游戏或其他用显卡的需求,只是写写代码,然而刚好在外面没插电,这样独显就还一直是通着电的状态,电池本来能用 5 小时,现在 3 小时就没电了。所以,有没有一种方法,可以在 BIOS 不支持独显开关的情况下,按需关掉或者开启独显?

答案是有,并且有很多种方案。但是这里按照我的个人喜好,只介绍 EnvyControl 这一种(其他的我试过,水土不服)


Arch Linux 安装完成后,默认是用的开源驱动 nouveau,网上说官方的闭源驱动性能更好,那么首先就给系统装上闭源驱动

1
sudo pacman -S nvidia

然后你可以配置一些钩子,让系统自动重新生成初始化内存镜像,或者简单粗暴地手动生成

1
sudo mkinitcpio -p linux

上面的命令是基于当前最新 Linux 内核的,如果你用的是其他内核或者自定义内核,那么则自己按需修改

然后重启系统,显卡驱动就算安装完成了

接着就是重头戏,安装 envycontrol,但是这个包只在 AUR 里,所以需要通过 yay 或者其他工具进行安装

1
yay -S envycontrol

核显 + 独显

默认情况下,当前模式是核显 + 独显(至少我自己的笔记本是这样),或者可以通过下面命令切换(每次切换都要重启系统,这个很好理解,因为有时要拉黑一些驱动和修改 udev 规则)

1
sudo envycontrol -s hybrid

如何测试当前显卡使用情况?可以查看 glxinfo 的输出信息

1
glxinfo | grep "OpenGL renderer"

比如我的笔记本输出如下内容


既然说核显 + 独显都是通电的,怎么确认呢?

多种方法,比如 lspci,不过这个输出多少会让人眼花缭乱,所以这里用人看的一目了然的方法 neofetch

这里很明显看到核显和独显都是在线的

但是用 nvidia-smi 会发现,是没有任何进程在用独显的

但是也可以看到功耗是有的,虽然不多,但是细水长流


那么既然独显在线,又没人用,还用着电,浪费就浪费在这里了

所以在核显 + 独显(也叫 hybrid)模式,默认是使用核显的,但是独显也通电,当你想用的时候就可以通过一些另外的方式用,比如 prime-run,安装也很简单

1
sudo pacman -S nvidia-prime

这个时候在需要使用独显的程序或者命令前加 prime-run,就可以用到独显,比如上面的改成这样

1
prime-run glxinfo | grep "OpenGL renderer string"

这样就能按需使用独显

独显

比如当前插着电,或者就是想要更高性能的表现,则可以切换为独显模式

1
sudo envycontrol -s nvidia

这个时候直接执行 glxinfo (带 prime-run 或者不带都一样),则会提示目前正在使用的是独显

并且会看到也有进程使用独显了(如果这个时候使用 neofetch,核显也是会有的,因为它有其他工作要做,比如设置屏幕亮度之类的)

没意外的话,所有新进程都用独显

核显

这个就是文章一开头的场景,切换命令如下

1
sudo envycontrol -s integrated

这个时候执行 neofetch 则看不到独显了,也就是不通电了

那么执行 glxinfo 当然显示核显了

如果执行独显相关的 prime-run 或者 nvidia-smi 则肯定报错了