Wayland
Wayland 是一种 显示服务器 协议。它已被广泛确立为 X Window System 的继任者 [1] [2] [3] [4]。您可以在 维基百科上找到 Wayland 与 Xorg 的比较。
使用 Wayland 协议的显示服务器称为 **合成器 (compositors)**,因为它们也充当 合成窗口管理器。下面你可以找到一个 Wayland 合成器列表。
为了与原生 X11 应用程序兼容,可以无缝运行它们,可以使用 Xwayland,它在 Wayland 中提供了一个 X 服务器。
需求
Wayland 仅仅是一个协议,与 Xorg 不同,它没有通用的“显示服务器”可供安装。要使用它,您只需要兼容的显卡驱动程序(本节内容)和一个实现了 Wayland 协议的合成器(下一节)或 桌面环境(例如 GNOME 或 Plasma)。大多数 Wayland 合成器仅在使用了 内核模式设置 (KMS) 的系统上运行。
为了使 GPU 驱动程序 和 Wayland 合成器兼容,它们必须支持相同的缓冲区 API。目前主要有两种 API:GBM 和 EGLStreams。
| 缓冲区 API | GPU 驱动支持 | Wayland 合成器支持 |
|---|---|---|
| GBM | 除 NVIDIA < 495* 外均支持 | 全部支持 |
| EGLStreams | NVIDIA | GNOME |
- * NVIDIA ≥ 495 同时支持 EGLStreams 和 GBM。[5]
自从 NVIDIA 引入 GBM 支持以来,许多合成器(包括 Mutter 和 KWin)开始默认使用它来支持 NVIDIA ≥ 495。GBM 通常被认为支持更广泛,而 EGLStreams 仅因 NVIDIA 在其专有驱动程序下未提供其他方式使用其 GPU 而获得支持。此外,KWin 在引入 NVIDIA 的 GBM 支持后 放弃了对 EGLStreams 的支持。
如果你使用的是流行的桌面环境/合成器,并且 GPU 仍然受到 NVIDIA 支持,那么你很可能已经在使用 GBM 后端。要进行检查,请运行 journalctl -b 0 --grep "renderer for"。要强制使用 GBM 作为后端,请设置以下 环境变量
GBM_BACKEND=nvidia-drm __GLX_VENDOR_LIBRARY_NAME=nvidia
合成器
有关 **堆叠式 (Stacking)**、**平铺式 (Tiling)** 和 **动态式 (Dynamic)** 之间的区别,请参见 窗口管理器#类型。
堆叠式
- hikari — 基于 wlroots 的合成器,受 cwm 启发,在 FreeBSD 上积极开发,但也支持 Linux。
- KDE KWin — 参见 KDE#启动 Plasma。
- labwc — 基于 wlroots 的合成器,受 Openbox 启发。
- waybox — 一个 *box 风格(极简)的 Wayland 合成器,很大程度上模仿 Openbox
- wayfire — 3D 合成器,受 Compiz 启发,基于 wlroots。
- Weston — Wayland 合成器,设计用于正确性、可靠性、可预测性和性能。
- wio — 基于 wlroots 的合成器,旨在复制 Plan 9 的 Rio 桌面的外观和感觉。
- wlmaker — 基于 wlroots 的合成器,受 Window Maker 启发。
- woodland — 一个最小化的轻量级 wlroots 合成器,用于 Wayland,受 Wayfire 和 TinyWl 启发。
平铺式
- jay — 一个用 Rust 编写的 Wayland 合成器。外观基于默认的 i3 观感。Jay 可以通过声明式 TOML 文件或注入到合成器的共享库进行配置。
- IonWL — 手动平铺合成器。遵循 Ion3 的设计,并提供全面的 Python API。
- miracle-wm — 一个基于 Mir 的 Wayland 合成器,风格类似于 i3 和 sway,旨在比两者都更华丽、功能更丰富,类似于 swayfx。
- niri — 一个可滚动的平铺式 Wayland 合成器。
- Qtile — 一个功能齐全、可定制的平铺式窗口管理器和 Wayland 合成器,用 Python 编写和配置。
- SwayFx — Sway,但带有华丽效果!
- Velox — 基于 swc 的简单窗口管理器,受 dwm 和 xmonad 启发。
动态式
- COSMIC Compositor — COSMIC 桌面环境的合成器。
- Hyprland — 一个动态平铺式 Wayland 合成器,不牺牲外观。
- japokwm — 动态 Wayland 平铺式合成器,基于 wlroots,侧重于创建布局。
- river-classic — 受 dwm 和 bspwm 启发的动态平铺 Wayland 合成器。
- pinnacle-comp — 一个基于 Smithay 的 Wayland 合成器,受 AwesomeWM 启发,并使用 Lua 或 Rust 进行配置
其他
- Cage — 显示单个全屏应用程序,如信息亭。
- GNOME Kiosk — 基于 Mutter 的合成器,提供适合固定用途或单应用程序部署的环境,如墙面显示器和销售点系统。
- phoc — 一个微小的 wlroots 合成器,用于移动设备。
- Wayback — X11 兼容层,允许使用 Wayland 组件运行完整的 X11 桌面环境。它还在开发早期阶段,是实验性的。
- River — 一个非单体式 Wayland 合成器。与其他 Wayland 合成器不同,它不将合成器和窗口管理器组合成一个程序。相反,用户可以选择任何实现 river-window-management-v1 协议的窗口管理器。
上述部分合成器可能支持 显示管理器。检查 /usr/share/wayland-sessions/compositor.desktop 以了解它们是如何启动的。
显示管理器
下面列出的显示管理器支持启动 Wayland 合成器。
| 名称 | 运行在 | 描述 |
|---|---|---|
| atriumAUR | Wayland | 具有一流多席位 (multiseat) 支持的显示管理器。 |
| emptty | tty | TTY 上的简单命令行显示管理器。 |
| GDM | Wayland | GNOME 显示管理器。 |
| greetd | Wayland/Xorg/tty 参见 Greetd#Greeters。 |
极简且灵活的登录守护进程。 |
| lemurs | tty | 用 Rust 编写的 TUI 显示管理器。 |
| lidmAUR | tty | 一个完全彩色可定制的 TUI 显示管理器,用 C 编写。 |
| LightDM |
Xorg[6] |
跨桌面显示管理器。 |
| ly | tty | 用 Zig 编写的 TUI 显示管理器 |
| Plasma 登录管理器 | Wayland | KDE 显示管理器。 |
| SDDM | Wayland/Xorg | 基于 QML 的显示管理器。 |
| tbsmAUR | tty | 用纯 bash 编写的简单命令行会话启动器。 |
| uwsm | tty | 独立合成器的会话和 XDG 自启动管理器。 提供 TUI 菜单,但也可与其他显示管理器一起使用。 |
Xwayland
Xwayland(1) 是一个运行在 Wayland 下的 X 服务器,为尚未提供 Wayland 支持的原生 X11 应用程序提供兼容性。要使用它,请 安装 xorg-xwayland 包。
Xwayland 通过合成器启动,因此您应该查阅您选择的合成器的文档以了解 Xwayland 兼容性和启动 Xwayland 的说明。
默认情况下,Xwayland 以 rootless(无根)模式运行其 X 服务器。
- 安全性:Xwayland 是一个 X 服务器,因此它不具备 Wayland 的安全特性。
- 性能:在大多数情况下,Xwayland 的性能 几乎与 X11 相同。
- 兼容性:Xwayland 与 X11 的向后兼容性不完善。某些应用程序可能无法在 Xwayland 下正常工作。
Wayback
Wayback(wayback-x11AUR, wayback-x11-gitAUR)是一个 X11 兼容层,它允许使用 Wayland 组件运行完整的 X11 桌面环境。它旨在最终取代传统的 X.Org 服务器,从而减轻 X11 应用程序的维护负担。
NVIDIA 驱动
需要启用 DRM KMS。关于您的显示管理器(例如 GDM),您可能可以在 官方文档 中找到额外信息。
检测 Xwayland 应用程序
要确定某个应用程序是否通过 Xwayland 运行,可以使用 xorg-xeyes 中的 xeyes:如果将鼠标指针移动到应用程序窗口上时眼睛在动,则表示其运行在 Xwayland 上。
另一个选项是在终端窗口中运行 xwininfo(来自 xorg-xwininfo):当鼠标悬停在 Xwayland 窗口上时,鼠标指针会变成一个 + 号。如果您单击窗口,它将显示一些信息然后结束,但不会对原生 Wayland 窗口执行任何操作。您可以使用 Ctrl+C 结束它。
您也可以使用 xlsclients(来自 xorg-xlsclients 包)。要列出所有通过 Xwayland 运行的应用程序,请运行 xlsclients -l。
或者,您可以启动 extramausAUR 并将鼠标指针悬停在应用程序的窗口上。如果红色鼠标移动,则该应用程序正在通过 Xwayland 运行。
GUI 库
GTK
gtk3 和 gtk4 包已启用 Wayland 后端。GTK 将默认使用 Wayland 后端,但可以通过修改环境变量来覆盖为 Xwayland:GDK_BACKEND=x11。
有关主题问题,请参见 GTK#Wayland 后端。
Qt
要启用 Qt 5 中的 Wayland 支持,请安装 qt5-wayland 包。然后,Qt 5 应用程序将在 Wayland 会话下运行在 Wayland 上。
虽然不应该有必要,但要显式使用 Wayland 插件运行 Qt 应用程序 [7],可以使用 -platform wayland 或 QT_QPA_PLATFORM=wayland 环境变量。
要在 Wayland 会话中强制使用 X11,请使用 QT_QPA_PLATFORM=xcb。
这可能对一些不使用系统 Qt 实现的专有应用程序是必要的。QT_QPA_PLATFORM="wayland;xcb" 允许 Qt 在 Wayland 不可用时改用 xcb (X11) 插件。[8]
由于 在 Wayland 上使用分数缩放时 WebEngine 的尺寸不正确和文本渲染效果差 的 Qt WebEngine 错误,使用 Qt WebEngine 的应用程序,例如 Calibre,可能会显示锯齿状字体。解决方法是使用 QT_SCALE_FACTOR_ROUNDING_POLICY=RoundPreferFloor 启动应用程序。这可以防止应用程序窗口被分数缩放。
Clutter
Clutter 工具包有一个 Wayland 后端,允许它作为 Wayland 客户端运行。该后端已在 clutterAUR 软件包中启用。
要在 Wayland 上运行 Clutter 应用程序,请设置 CLUTTER_BACKEND=wayland。
SDL
在 SDL3 中,如果合成器支持 fifo-v1 协议,则默认使用 Wayland。[9] 否则,将按顺序尝试 X11 和 Wayland。可以使用 SDL_VIDEO_DRIVER=x11 或 SDL_VIDEO_DRIVER=wayland 环境变量分别强制执行其中之一(或者,以较低优先级使用下面的 SDL2 环境变量)[10]。
sdl2-compat 遵循上述 SDL3 规则,除非有 特定于应用程序的异常。对于原生的 SDL2(例如 sdl2AUR),请设置 SDL_VIDEODRIVER=wayland。SDL_VIDEODRIVER="wayland,x11" 允许在 Wayland 不可用时让 SDL2 转而使用 x11 视频驱动。[11]。您可能还想安装 libdecor 以启用窗口装饰(例如在 GNOME 上)。
有关更多详细信息,请参阅 官方文档。
GLFW
glfw 包支持 Wayland,如果 环境变量 XDG_SESSION_TYPE 设置为 wayland 并且应用程序开发者未设置特定的所需后端,它将使用 Wayland 后端。
有关更多信息,请参见 源代码。
GLEW
如果 glew-wayland-gitAUR 包无法与所需的基于 GLEW 的应用程序一起工作,则选项是使用 glew 配合 Xwayland。参见 FS#62713。
EFL
Enlightenment 具有 完整的 Wayland 支持。
要在 Wayland 上运行 EFL 应用程序,请设置 ELM_DISPLAY=wl。
winit
Winit 是 Rust 中的一个窗口处理库。它将默认使用 Wayland 后端,但可以通过修改环境变量来覆盖为 Xwayland
- 在 0.29.2 版本之前,设置
WINIT_UNIX_BACKEND=x11 - 对于 0.29.2 及更高版本,取消设置
WAYLAND_DISPLAY,这将强制使用DISPLAY变量回退到 X。[12]
Electron
可以通过命令行标志或环境变量来激活 Wayland 支持。
命令行标志
参见 Chromium#原生 Wayland 支持 以了解在 Wayland 上工作的命令行标志。请注意,命令行标志 --ozone-platform-hint=auto 自 Electron 38 起已失效。
您可以手动传递这些标志,将它们保存在 Electron 配置文件 中,或者 覆盖应用程序的 ~/.local/share/applications 目录下的 .desktop 文件,方法是在 Exec= 行末尾添加标志。
Electron 默认启用通过 PipeWire 的 WebRTC 屏幕捕获。捕获基于 xdg-desktop-portal。
通过使用:--enable-features=WaylandWindowDecorations 可以解决顶部栏丢失的问题。这通常在 GNOME 下是必需的(自 electron17 起支持)。
环境变量
使用版本 28 到 37 之间的 Electron 的应用程序可以使用 环境变量 ELECTRON_OZONE_PLATFORM_HINT 设置为 auto 或 wayland。
这比命令行标志的优先级低。
Java
Java 平台的开源实现 OpenJDK 尚未对 Wayland 提供原生支持。Wakefield 项目正在开发一个名为 WLToolkit 的组件,以为 OpenJDK 添加 Wayland 支持。
在 WLToolkit 进入稳定版 OpenJDK 之前,您有以下几种选择
- 使用 XWayland。然而,XWayland 与 Wayland 并没有完全的功能对等,并且可能导致某些应用程序(如 netbeans 和 oracle-datamodelerAUR)无法显示内容。
- 参见 Debian:Wayland#Java 程序(自 OpenJDK 16 起支持?)
- 使用 Wakefield 的
jdk25-wayland开发中分支。一些程序(例如 JetBrains IDE)已经采用了这种做法,因此它们开箱即用地支持 Wayland。
对于其他 Java 程序,您需要自行构建 Wakefield 分支,例如使用 jdk-openjdk-wakefieldAUR。要使用它,请将JAVA_HOME指向/usr/lib/jvm/java-25-openjdk-wakefield,并使用-Dawt.toolkit.name=WLToolkit选项运行您的程序。
技巧与提示
自动化
- ydotool(ydotool)- 通用命令行自动化工具(不限于 wayland)。启用/启动
ydotool.service用户单元。参见 ydotoold(8), ydotool(1)。 - wtype(wtype)- Wayland 的 xdotool 输入。参见 wtype(1)。
- keyboard - 适用于 Windows 和 Linux 的 Python 库,支持实验性的 OS X 支持。另请参阅 mouse 库。
- wlrctl(wlrctlAUR)- 用于各种 wlroots 扩展的命令行实用程序(支持 foreign-toplevel-management、virtual-keyboard、virtual-pointer)
重新映射键盘或鼠标按键
参见 输入重映射实用程序。
屏幕录制
参见 屏幕捕获#屏幕录制 和 屏幕捕获#使用 X11 应用程序录制 Wayland 窗口。
应用程序关闭后持久化剪贴板
由于 Wayland 的设计理念,剪贴板数据存储在源客户端的内存中。当客户端关闭时,剪贴板数据就会丢失。您可以使用 wl-clip-persist 来解决此问题,它在后台运行以读取剪贴板数据并将其存储在自己的内存中,与源客户端分开。
将 Wayland 合成器作为 systemd 服务自启动
如果您不想使用显示管理器或 shell,可以将 Wayland 合成器与 systemd 服务一起自启动。使用您想使用的合成器调整 ExecStart 行。以下是 KDE Plasma 的示例
/etc/systemd/system/wayland-compositor.service
[Unit] After=graphical.target systemd-user-sessions.service modprobe@drm.service Conflicts=getty@tty1.service [Service] User=username WorkingDirectory=~ PAMName=login TTYPath=/dev/tty1 UnsetEnvironment=TERM StandardOutput=journal ExecStart=/usr/lib/plasma-dbus-run-session-if-needed /usr/bin/startplasma-wayland [Install] WantedBy=graphical.target
为基于 wlroots 的合成器使用其他渲染器
对于基于 wlroots 的合成器,您可以通过指定 WLR_RENDERER 环境变量来使用其他的 wlroots 渲染器,例如 Vulkan。可用列表可以在 wlroots 文档 中找到。
在基于 wlroots 的合成器上指定主显卡
如果您的设备具有 混合显卡,根据 wlroots 文档,您可以使用 WLR_DRM_DEVICES 环境变量来指定主显卡
示例
WLR_DRM_DEVICES='/dev/dri/card1:/dev/dri/card2:/dev/dri/card0'
远程显示
- wlroots0.18 和 wlroots0.19(由 sway 使用)自 0.10 版本起通过 wayvnc 提供 VNC 后端。RDP 后端已被移除 [13]。
- mutter 现在已在编译时启用了远程桌面,详见 [14] 和 gnome-remote-desktop 以了解详情。
- krfb 为 kwin 提供 VNC 服务器。
krfb-virtualmonitor可用于将另一个设备设置为附加显示器。 - 2013 年,FreeRDP 被合并到 Weston 中,并通过编译标志启用。自 6.0.0 版本起,weston 包已启用此功能。
- waypipe 是 Wayland 应用程序的透明代理,带有可通过 SSH 运行的包装命令
- 以下是在 Plasma 中启动远程 KDE kcalc 的示例
$ waypipe ssh example.local env QT_QPA_PLATFORM=wayland QT_QPA_PLATFORMTHEME=KDE dbus-launch kcalc
故障排除
首先,确保您当前的会话运行在 Wayland 而不是 X11 下(许多合成器同时支持两者)。这可以通过检查 WAYLAND_DISPLAY 环境变量(它应该以 wayland- 开头)和/或检查 XDG_SESSION_TYPE 是否为 wayland 来完成。
对于(可能)与应用程序相关的问题,还请考虑检查该程序是否 运行在 XWayland 下。
有用工具
- wayland-utils 中的
wayland-info:显示有关当前合成器的信息。 - wev:用于调试 Wayland 窗口上的 Wayland 事件,类似于 X11 工具 xev。
- wlopm:针对支持 wlr 输出电源管理协议 的合成器的 Wayland 输出电源管理工具。
- wlr-randr:管理支持 wlr 输出管理协议 的 Wayland 合成器的输出。
色彩校正
参见 背光#色彩校正。
GNOME:慢动作、图形花屏和崩溃
Gnome-shell 用户从 X 切换到 Wayland 时可能会遇到显示问题。根本原因之一可能是您为基于 Xorg 的 gnome-shell 设置了 CLUTTER_PAINT=disable-clipped-redraws:disable-culling。尝试从 /etc/environment 或其他 rc 文件中移除它,看看一切是否恢复正常。
游戏、远程桌面和虚拟机窗口中的输入捕捉
与 Xorg 不同,Wayland 不允许独占输入设备抓取,也称为主动或显式抓取(例如 键盘、鼠标),而是依赖 Wayland 合成器将键盘快捷键传递并将其指针设备限制在应用程序窗口内。
输入抓取的这种变化会破坏应用程序的当前行为,这意味着
- 合成器将捕获热键组合和修饰键,而不会将它们发送到远程桌面和虚拟机窗口。
- 鼠标指针将不会限制在应用程序的窗口内,这可能会导致视差效果,即虚拟机或远程桌面窗口内的鼠标指针位置与主机的鼠标指针不匹配。
Wayland 通过为 Wayland 和 Xwayland 添加协议扩展来解决此问题。需要将对这些扩展的支持添加到 Wayland 合成器中。对于原生 Wayland 客户端,使用的窗口小部件工具包(例如 GTK、Qt)需要支持这些扩展,或者应用程序本身需要支持(如果没有使用窗口小部件工具包)。对于 Xorg 应用程序,由于 Xwayland 支持已足够,因此应用程序或窗口小部件工具包无需更改。
这些扩展已包含在 wayland-protocols 中,并且受 xorg-xwayland 支持。
相关的扩展是
支持的 Wayland 合成器
- Mutter,GNOME 的合成器,自 3.28 版本起
- wlroots 支持相对指针和指针约束
- Kwin
支持的窗口小部件工具包
- GTK 自 3.22.18 版本起。
GTK 主题不起作用
请参阅 https://github.com/swaywm/sway/wiki/GTK-3-settings-on-Wayland。
避免加载 NVIDIA 模块
在启动 Sway 等 Wayland 合成器之前,将 __EGL_VENDOR_LIBRARY_FILENAMES=/usr/share/glvnd/egl_vendor.d/50_mesa.json 作为 环境变量添加。
放大/表面缩放
屏幕放大尚未解决,一个于 2022 年年中合并的拉取请求 提供了 wp-surface-scale 协议。
Wayland 延迟/卡顿(内核 6.11.2 (AMD) 后)
在未来的内核版本中修补此问题之前,一种解决方法是将 amdgpu.dcdebugmask=0x400 添加到命令行参数中。
请参阅:https://community.frame.work/t/wayland-lag-stuttering-since-kernel-6-11-2/59422
切换虚拟桌面时游戏/应用程序被挂起
当更改工作区或使用 Alt+Tab 时,游戏(可能还包括其他图形应用程序)会被挂起、进入某种奇怪的状态并(部分)停止运行。这包括 VRR 应用程序和开启了垂直同步 (VSync) 的应用程序,但不仅限于此。症状包括音频(部分)掉线、游戏不继续进行、延迟变高或网络断开,但前提是游戏窗口不在焦点中。这可能只影响开启了垂直同步的应用程序。
一些游戏可以通过切换到窗口来解决此问题,但有些则不行。这对于需要大量使用网页浏览、文档和第三方工具的复杂游戏,或者如果游戏玩法因某种原因被打断,则会非常令人恼火。
可能的解决方法包括设置环境变量 MESA_VK_WSI_PRESENT_MODE=immediate 和/或 vk_xwayland_wait_ready=false,但设置这些将破坏任何 VSync 或 VRR 实现。