书接上回 虚拟机显卡直通 (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
则肯定报错了