我仔细看了一下 61-gdm.rules 之后找了一台 I卡+N卡 的笔记本试了一下,得出了一个比较合适的解决方案,如果你感兴趣的话,可以试试
61-gdm.rules 这个规则文件中含有多个阻止你使用 wayland 的检测,这些检测规则并不仅仅是简单的检测,同时它们也描述了 gdm 对于启用 wayland 所需的一些条件。
从包管理的角度考虑,用户不应该手动修改 /usr/lib/udev/rules.d 中的规则文件,所以,我们应该把 61-gdm.rules 文件复制到 /etc/udev/rules.d 中再对其进行修改。
/etc/udev/rules.d 中的 61-gdm.rules 文件将会起到覆盖 /usr/lib/udev/rules.d/61-gdm.rules 的作用。
以下我一一陈述各项校验和 wayland 的启用需求:
1、gdm 不允许双显卡的笔记本使用 wayland:
# 61-gdm.rules 85 行
# If this is a hybrid graphics laptop with vendor nvidia driver, disable wayland
LABEL="gdm_hybrid_nvidia_laptop_check"
TEST!="/run/udev/gdm-machine-is-laptop", GOTO="gdm_hybrid_nvidia_laptop_check_end"
TEST!="/run/udev/gdm-machine-has-hybrid-graphics", GOTO="gdm_hybrid_nvidia_laptop_check_end"
TEST!="/run/udev/gdm-machine-has-vendor-nvidia-driver", GOTO="gdm_hybrid_nvidia_laptop_check_end"
GOTO="gdm_disable_wayland"
LABEL="gdm_hybrid_nvidia_laptop_check_end"
此条无解,只能注释掉或是在 LABEL="gdm_hybrid_nvidia_laptop_check" 前面加上 GOTO 语句来跳过这块校验:
GOTO="gdm_hybrid_nvidia_laptop_check_end"
2、gdm 会在没有启用 modesetting 的情况下禁用 wayland
# 61-gdm.rules 32 行
# disable Wayland if modesetting is disabled
KERNEL!="card[0-9]*", GOTO="gdm_nomodeset_end"
KERNEL=="card[0-9]-*", GOTO="gdm_nomodeset_end"
SUBSYSTEM!="drm", GOTO="gdm_nomodeset_end"
# but keep it enabled for simple framebuffer drivers
DRIVERS=="simple-framebuffer", GOTO="gdm_nomodeset_end"
IMPORT{parent}="GDM_MACHINE_HAS_VIRTUAL_GPU"
ENV{GDM_MACHINE_HAS_VIRTUAL_GPU}!="1", RUN+="/usr/bin/touch /run/udev/gdm-machine-has-hardware-gpu"
IMPORT{cmdline}="nomodeset", GOTO="gdm_disable_wayland"
LABEL="gdm_nomodeset_end"
你需要确保内核参数 nvidia-drm.modeset=1,这个可以直接加到内核命令行参数上。
你可以使用 (sudo) systool -vm nvidia_drm 命令来检查 nvidia modeset 是否被启用,如果已经启用,则 Parameters 块中的 modeset 的值为 "Y"
3、gdm wayland 需要 nvidia 模块中的 NVreg_PreserveVideoMemoryAllocations 的值为 1
# 61-gdm.rules 54 行
IMPORT{program}="/bin/sh -c \"sed -e 's/: /=/g' -e 's/\([^[:upper:]]\)\([[:upper:]]\)/\1_\2/g' -e 's/[[:lower:]]/\U&/g' -e 's/^/NVIDIA_/' /proc/driver/nvidia/params\""
ENV{NVIDIA_PRESERVE_VIDEO_MEMORY_ALLOCATIONS}!="1", GOTO="gdm_disable_wayland"
这个参数与系统休眠过程中的显卡内存的临时存放有关,这个值默认为 0,所以需要用户手动配置该参数,配置如下:
在 /etc/modprobe.d 中创建一个 .conf 文件,文件内容:
options nvidia NVreg_PreserveVideoMemoryAllocations=1 NVreg_TemporaryFilePath=[你想要临时存放显存的目录,配置后记得创建对应目录]
该配置参考 wiki 条目:NVIDIA/Tips and tricks - ArchWiki
4、gdm wayland 需要 enable nvidia 的休眠和唤醒服务
# 61-gdm.rules 56 行
IMPORT{program}="/bin/sh -c 'echo NVIDIA_HIBERNATE=`systemctl is-enabled nvidia-hibernate`'"
ENV{NVIDIA_HIBERNATE}!="enabled", GOTO="gdm_disable_wayland"
IMPORT{program}="/bin/sh -c 'echo NVIDIA_RESUME=`systemctl is-enabled nvidia-resume`'"
ENV{NVIDIA_RESUME}!="enabled", GOTO="gdm_disable_wayland"
IMPORT{program}="/bin/sh -c 'echo NVIDIA_SUSPEND=`systemctl is-enabled nvidia-suspend`'"
ENV{NVIDIA_SUSPEND}!="enabled", GOTO="gdm_disable_wayland"
这些服务需要用户自己 enable,所以:
systemctl enable nvidia-hibernate.service
systemctl enable nvidia-resume.service
systemctl enable nvidia-suspend.service
然后就可以用 wayland 啦,虽然这个解决方案并不完美,但是总比简单粗暴地删文件要安全一些。
你看,gdm 给出了这么多的先决条件,如果只是一删了之,以后用起来肯定还会碰到各种问题。以后有啥问题不要草率地删文件了喔。