昨日给心爱的笔记本外接了家中老爷机的显示器,感觉总算是舒服些了,然而重启切换到 Manjaro 下灾难才刚刚开始。Win 下多块屏幕以不同的缩放率显示没有什么大的问题,绝大多数的应用程序都能完美显示,除了有些看起来有点糊;而 Linux 这边嘛,一直用的 Gnome 却只能全局缩放,要么大到爆炸,要么小到瞎眼,等于说还是只有一块正常显示的显示器。

作为一个强迫症患者怎么能忍!随手 Baidu 下得知 Gnome 可以支持多个不同的缩放率,前提是得使用 Wayland 显示管理器。对于 Wayland 这个玩意可以说是没什么好感(PS: 之前有一次折腾到凌晨就为启用 Wayland,结果搞崩了系统,人生重在折腾。。。),虽说意在取代 X,但目前来看,你开心就好。

还是不甘心,这么NB的 Wayland 我也应该用用才对,说不定能解决我显示器的问题。又想起来一件更加坑的事情,N卡的闭源驱动天生对 Wayland 免疫(至少 Baidu Google 得到的都是这个结果),而开源驱动 Nouveau 很残废,cuda 之类的都别想用了;还有更坑的是我的笔记本是屏蔽了牙膏的核显,N卡直连显示器的那种(对没错,GSYNC 的锅)。

既然是用 Manjaro 的,就翻翻 Archlinux Wiki 吧,看看还有得救嘛。这一顿操作下来,倒是了解了一个有趣的故事。Wayland 由于在原理上和 X 完全不同,其开发人员便去找 A家、I家和 N家去谈,三家表示都很支持 Wayland,表示日后的驱动都会大力支持。关于设备的内存管理,Intel 和 AMD 的驱动 都使用了 GBM API,而 Nvidia 却另起炉灶,推出了 EGLStream 并声明不会使用 GBM。所以对 Nvidia 竖中指的除了 Linus 估计还有 Wayland 的开发人员,其对于 N 卡的支持不佳便可以理解了。

但是接着翻看到了一个好玩的东西,KMS(并非 Win 的那个 KMS)。全称为 Kernel mode setting,是一种从内核空间更改显示分辨率和深度等显示参数的方法,优点嘛,性能提升功耗降低巴拉巴拉一堆。最直观的可能就是从图形界面切换到 tty 的速度有明显的提升(个人感觉是快了些)。重点:Wayland 依赖于 KMS。接着看,Nvidia 的闭源驱动从 364.12 开始支持 KMS,但默认不开启。怎么开启呢,添加一个内核参数就可以。开启会怎样呢,默认会启用 Wayland。等等,这么神奇的嘛,马上就开。

这个改内核参数嘛,直接在开机后的 Grub 界面改是完全可以的,只不过下次重启就会失效;改 /boot/grub/grub.cfg 是持久修改;而我改的是 /etc/default/grub,感觉这样更安全些。

1
GRUB_CMDLINE_LINUX_DEFAULT="... nvidia-drm.modeset=1"

GRUB_CMDLINE_LINUX_DEFAULT 选项的末尾添加 nvidia-drm.modeset=1 即可。然后重新生成 Grub 的配置:

1
sudo grub-mkconfig -o /boot/grub/grub.cfg

KMS 还有一个加载早晚的区分,即其相对于 initramfs 的加载时机,仅仅修改内核参数后将在 initramfs 阶段后加载。至于区别嘛,我暂时也没有搞清楚,实现在 initramfs 阶段加载也比较容易。修改 /etc/mkinitcpio.conf 即可:

1
MODULES=(... nvidia nvidia_modeset nvidia_uvm nvidia_drm...)

修改 MODULES,添加显示卡所用的驱动即可,我这里是 N卡,就写这些;对于其它显卡可以参考 这里。修改完后重新生成 initramfs 即可,可以参考 这篇文章,麻烦的是每次升级完显卡驱动便要重新生成,而且有多个内核的话要注意 Present,我生成的命令如下:

1
mkinitcpio -p linux55

对了,默认情况下 Gnome 的桌面管理器 GDM 可能是禁用 Wayland 的。注释掉 /etc/gdm/custom.conf 中的这行即可:

1
2
# Uncoment the line below to force the login screen to use Xorg
# WaylandEnable=false

到此为之重启就好,假如还能成功登陆,在命令行中输入:

1
echo $XDG_SESSION_TYPE

结果是 Wayland,就代表你成功了。打开设置,双屏缩放再也不是问题。可是还没有兴奋几分钟,一盆凉水就浇了下来,打开了几个程序试了试还是翻车,难道我的 Wayland 是假的??可是打开 Gnome 全家桶譬如 Terminal、Calc之类的,都很完美啊。继续看 Wiki,原来是大部分的程序暂时都不兼容 Wayland 导致的。而基于 GTK3 的程序是完美兼容的,然而哪来那么多的 GTK3 程序。

最终统计了下,日常用的程序只有 Firefox (版本 75) 能正常显示,不过得稍稍设置一下,添加一个环境变量即可。对于 Wayland,可以在 $HOME/.config/environment.d 下放置用户的环境变量,创建以 .conf 文件即可,这种文件是不会被 X 系统读取的。

1
2
# firefox.conf
MOZ_ENABLE_WAYLAND=1

保存后重启下,除了被镶了个大黑边之外 firefox 还算正常(全屏无视),问题从显示管理器不支持转嫁到了应用程序不支持。。。真是令人无语。如果仅仅如此就算了,Wayland 明显感觉比 Xorg 卡顿许多;3.36 版本的 Gnome 用 Xorg 日常感觉比较流畅,很少卡顿。而且 VDPAU 直接废掉了,原因不明,简单说就是 Linux 下的硬件加速,用于视频播放之类的。无论使用什么播放器看视频,CPU 直接起飞。

最后,这篇文章我还是在 X 系统下水完的,xrandr 不就看起来有点糊嘛,又不是不能用,但愿 Wayland 能愈来愈好用。