gnome开启Wayland

本文介绍了在ArchLinux或Manjaro系统中,如何解决GDM登录管理器缺少Wayland选项的问题。通过修改配置文件`/etc/gdm/custom.conf`和`/usr/lib/udev/rules.d/61-gdm.rules`,以及调整`mkinitcpio.conf`和`grub`设置,确保在启动时加载必要的显卡模块,特别是对于NVIDIA显卡用户,需要在内核参数中添加`nvidia-drm.modeset=1`。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:

使用gdm登录管理器,且没有wayland和xorg选项,登录后显示是x11.

解决方法:

与这个问题相关的应该有两个配置文件

  • /etc/gdm/custom.conf
  • /usr/lib/udev/rules.d/61-gdm.rules

这两个配置文件是关于gdm登录选项的。
第一个文件大概长这样:

# GDM configuration storage

[daemon]
# Uncomment the line below to force the login screen to use Xorg
# WaylandEnable=false

[security]

[xdmcp]

[chooser]

[debug]
# Uncomment the line below to turn on debugging
#Enable=true

其中WaylandEnable=false表示关闭wayland,如果这句话前面有”#“,即被注释掉,就表示启用,请确保它是被注释的状态。

另一个文件长这样:

# disable Wayland on Hi1710 chipsets
ATTR{vendor}=="0x19e5", ATTR{device}=="0x1711", GOTO="gdm_disable_wayland"

# disable Wayland if modesetting is disabled
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{cmdline}="nomodeset", GOTO="gdm_disable_wayland"
LABEL="gdm_nomodeset_end"

# Disable wayland when nvidia modeset is disabled or when drivers are a lower
# version than 470, in any case always prefer Xorg
KERNEL!="nvidia_drm", GOTO="gdm_nvidia_drm_end"
SUBSYSTEM!="module", GOTO="gdm_nvidia_drm_end"
ACTION!="add", GOTO="gdm_nvidia_drm_end"
# disable wayland if nvidia-drm modeset is not enabled
ATTR{parameters/modeset}!="Y", GOTO="gdm_disable_wayland"
# disable wayland for nvidia drivers versions lower than 470
ATTR{version}=="4[0-6][0-9].*|[0-3][0-9][0-9].*|[0-9][0-9].*|[0-9].*", GOTO="gdm_disable_wayland"
GOTO="gdm_prefer_xorg"
LABEL="gdm_nvidia_drm_end"

GOTO="gdm_end"

LABEL="gdm_prefer_xorg"
RUN+="/usr/lib/gdm-runtime-config set daemon PreferredDisplayServer xorg"
GOTO="gdm_end"

LABEL="gdm_disable_wayland"
RUN+="/usr/lib/gdm-runtime-config set daemon WaylandEnable false"
GOTO="gdm_end"

LABEL="gdm_end"

这个文件由label和goto组成,GOTO语句的语法就是:

<条件>,GOTO="<LABEL名>"

表示如果满足条件,则跳转到相应的label。
上面代码中,标签:

  • gdm_disable_wayland:表示禁用wayland
  • gdm_prefer_xorg:表示优先选择xorg。

这里我们再加入一项label到/usr/lib/udev/rules.d/61-gdm.rules中,名叫gdm_prefer_wayland,表示优先采用wayland:

LABEL="gdm_prefer_wayland"
RUN+="/usr/lib/gdm-runtime-config set daemon PreferredDisplayServer wayland"
GOTO="gdm_end"

并在文件开头直接goto到这个标签
GOTO = "gdm_prefer_wayland"
现在整个文件应该长这样:

# added manually. directly prefer wayland.
GOTO="gdm_prefer_wayland"
# disable Wayland on Hi1710 chipsets
ATTR{vendor}=="0x19e5", ATTR{device}=="0x1711", GOTO="gdm_disable_wayland"

# disable Wayland if modesetting is disabled
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{cmdline}="nomodeset", GOTO="gdm_disable_wayland"
LABEL="gdm_nomodeset_end"

# Disable wayland when nvidia modeset is disabled or when drivers are a lower
# version than 470, in any case always prefer Xorg
KERNEL!="nvidia_drm", GOTO="gdm_nvidia_drm_end"
SUBSYSTEM!="module", GOTO="gdm_nvidia_drm_end"
ACTION!="add", GOTO="gdm_nvidia_drm_end"
# disable wayland if nvidia-drm modeset is not enabled
ATTR{parameters/modeset}!="Y", GOTO="gdm_disable_wayland"
# disable wayland for nvidia drivers versions lower than 470
ATTR{version}=="4[0-6][0-9].*|[0-3][0-9][0-9].*|[0-9][0-9].*|[0-9].*", GOTO="gdm_disable_wayland"
GOTO="gdm_prefer_xorg"
LABEL="gdm_nvidia_drm_end"

GOTO="gdm_end"

LABEL="gdm_prefer_xorg"
RUN+="/usr/lib/gdm-runtime-config set daemon PreferredDisplayServer xorg"
GOTO="gdm_end"

LABEL="gdm_disable_wayland"
RUN+="/usr/lib/gdm-runtime-config set daemon WaylandEnable false"
GOTO="gdm_end"

LABEL="gdm_prefer_wayland"
RUN+="/usr/lib/gdm-runtime-config set daemon PreferredDisplayServer wayland"
GOTO="gdm_end"

LABEL="gdm_end"

如果设置到这里,你已经能在第一次启动的时候进入wayland,并且登出后登陆也可以的话那就已经完成设置了,不需要继续往下看了,如果登出后在登陆就不是wayland了,或者,第一次登陆不是wayland,请接着看下面的设置。

参照帖子Wayland doesn’t appear as an option on first login per boot中seth的说法:

https://wiki.archlinux.org/title/NVIDIA#Early_loading
https://wiki.archlinux.org/title/Kernel … _KMS_start

以及Fingel:

I have this same problem, but adding the Nvidia modules to /etc/mkinitcpio.conf has made Wayland completely disappear as an option to log in to Gnome with, whereas before if I logged into X11 and then logged out, I could choose Wayland as an option.
/etc/mkinitcpio.conf:
MODULES=(btrfs nvidia nvidia_modeset nvidia_uvm nvidia_drm)
BINARIES=(/usr/bin/btrfs)
FILES=()
HOOKS=(base udev autodetect keyboard keymap modconf block encrypt filesystems fsck)
I did run mkinitcpio -P after modifying the config.
Something I’m missing here?

最终在:https://wiki.archlinux.org/title/Kernel_mode_setting#Early_KMS_start
找到:

KMS is typically initialized after the initramfs stage. However, it is possible to enable KMS already during the initramfs stage. Add the required module for the video driver to the initramfs configuration file:

  • amdgpu for AMDGPU, or radeon when using the legacy ATI driver.
  • i915 for Intel graphics.
  • nouveau for the open-source Nouveau driver.
  • mgag200 for Matrox graphics.
  • Depending on QEMU graphics in use: virtio-gpu for VirtIO, qxl for QXL, or cirrus for Cirrus.
  • nvidia nvidia_modeset nvidia_uvm nvidia_drm for nvidia driver. See NVIDIA#DRM kernel mode setting for details.

翻译一下就是:
KMS一般会在initramfs阶段后启动。但是,也可以让kms在initramfs阶段前就绪,加入所需要的显卡驱动的module到initramfs配置文件中:

  • amdgpu:对应 AMD的gpu, 或使用 radeon 对应传统的ATI驱动
  • i915:对应英特尔图形
  • nouveau:对应开元Nouveau驱动
  • mgag200:对应Matrox驱动
  • QEMU图形:virtio-gpu for VirtIO, qxl for QXL, or cirrus for Cirrus.
  • nvidia nvidia_modeset nvidia_uvm nvidia_drm:对应英伟达显卡(更多细节查看DRM_kernel_mode_setting).

简而言之就是可能在gdm加载的时候显卡驱动相关的一些东西还没有启动,所以应当让相关的module在initramfs阶段前就绪。

我的设备用的是amd显卡和英伟达显卡,所以这里应该

vim /etc/mkinitcpio.conf

在MODULES中加入相关内容,这是加入后的文件示例,不要复制粘贴,直接加入与你设备相关的内容即可。

MODULES="btrfs nvidia nvidia_modeset nvidia_uvm nvidia_drm nouveau amdgpu"

BINARIES=(/usr/bin/btrfs)

FILES=""

HOOKS="base udev autodetect modconf block keyboard keymap filesystems fsck"

BINARIES=(/usr/bin/btrfs)

使配置生效:

sudo mkinitcpio -P

如果此过程中出错,说明文件内容有错误,应该重新修改文件内容。
非英伟达显卡配置到这里就结束了,英伟达显卡还需要在内核参数中添加nvidia-drm.modeset=1
打开/etc/default/grub文件进行编辑:

sudo vim /etc/default/grub

找到GRUB_CMDLINE_LINUX_DEFAULT配置项,添加nvidia-drm.modeset=1,如果原来有其他内容则需要在最后加个空格,添加nvidia-drm.modeset=1,如果一开始是空,则直接添加即可,这是我配置后的结果,不要复制粘贴:

GRUB_CMDLINE_LINUX_DEFAULT="quiet udev.log_priority=3 nvidia-drm.modeset=1"

使配置生效:

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

嗯,弄到这里就搞完了,有什么问题可以评论提出。

参考资料

  • https://bbs.archlinux.org/viewtopic.php?id=270441
  • https://wiki.archlinux.org/title/Kernel_mode_setting#Early_KMS_start
  • https://wiki.archlinux.org/title/NVIDIA#DRM_kernel_mode_setting
  • https://wiki.archlinux.org/title/Kernel_parameters
  • https://wiki.archlinux.org/title/NVIDIA#DRM_kernel_mode_setting
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值