第 6 章 Wayland

如果发现翻译错误,请直接 发起PR修改

6.1. Wayland 概述

Wayland 是一个新的显示服务器,但它与 Xorg 在几个重要方面有所不同。首先,Wayland 只是一个协议,充当客户端之间的中介,使用不同的机制来消除对 X 服务器的依赖。Xorg 既包括用于运行远程显示的 X11 协议,也包括 X 服务器将接受连接和显示窗口。在 Wayland 下,合成器或窗口管理器提供显示服务器,而不是传统的 X 服务器。

由于 Wayland 不是一个 X 服务器,传统的 X 屏幕连接需要使用其他方法,如 VNC 或 RDP 来进行远程桌面管理。其次,Wayland 可以作为一个独立实体来管理客户端和合成器之间的复合通信,而不需要支持 X 协议。

Wayland 相对较新,不是所有的软件都已经更新以在没有 Xwayland 支持的情况下本地运行。因为 Wayland 不提供 X 服务器,并且期望合成器提供该支持,尚不支持 Wayland 的 X11 窗口管理器将要求不使用 -rootless 参数启动 Xwayland 。移除 -rootless 参数后,将恢复 X11 窗口管理器的支持。

当前的 NVIDIA® 驱动程序应该能够与大多数 wlroots 合成器配合使用,但可能会有一些不稳定性,并且在此时可能不支持所有功能。我们请求志愿者帮助改进 NVIDIA® DRM 。

目前,许多软件在 Wayland 上可以正常运行,包括 Firefox。还有一些可用的桌面环境,比如 Compiz Fusion 的替代品 Wayfire,以及 i3 窗口管理器的替代品 Sway 。

截至 2021 年 5 月, plasma5-kwin 在 FreeBSD 上支持 Wayland。要在 Wayland 下使用 Plasma,请使用 ck-launch-sessionstartplasma-wayland 参数,并使用以下命令将 dbus 与其绑定:ck-launch-session dbus-run-session startplasma-wayland。这样可以使其正常工作。

对于合成器来说,必须存在支持 evdev(4) 驱动程序的内核才能利用按键绑定功能。这在默认情况下已经内置在 GENERIC 内核中;然而,如果内核被定制并且去除了 evdev(4) 支持,那么就需要加载 evdev(4) 模块。此外,使用 Wayland 的用户还需要是 video 组的成员。要快速进行此更改,请使用 pw 命令:

pw groupmod video -m user

安装 Wayland 很简单;协议本身没有太多的配置。大部分的组合将取决于所选择的合成器。通过现在安装 seatd,可以跳过合成器安装和配置一部分的步骤,因为 seatd 需要提供对某些设备的非 root 访问权限。

这里描述的所有合成器都应该与 graphics/drm-kmod 开源驱动程序配合使用;然而,使用专有驱动程序时, NVIDIA® 显卡可能会出现问题。首先安装以下软件包:

# pkg install wayland seatd

一旦协议和支持包被安装,合成器必须创建用户界面。接下来的几节将介绍几种合成器。所有使用 Wayland 的合成器都需要在环境中定义一个运行时目录,可以通过在 Bourne shell 中使用以下命令来实现:

% export XDG_RUNTIME_DIR=/var/run/user/`id -u`

需要注意的是,大多数合成器会在 XDG_RUNTIME_DIR 目录中搜索配置文件。在这里包含的示例中,将使用一个参数来指定一个配置文件在 [.filename]# ~ /.config# 中,以便将临时文件和配置文件分开存放。建议为每个合成器配置一个别名,以加载指定的配置文件。

据报道,ZFS 用户可能会在某些 Wayland 客户端上遇到问题,因为它们需要在运行时目录中访问 posix_fallocate() 函数。尽管作者无法在他们的 ZFS 系统上重现此问题,但建议的解决方法是不要将 ZFS 用于运行时目录,而是使用 tmpfs 作为 /var/run 目录。在这种情况下,通过命令 mount -t tmpfs tmpfs /var/runtmpfs 文件系统挂载到 /var/run,然后通过 /etc/fstab 使此更改在重新启动后持久化。可以配置 XDG_RUNTIME_DIR 环境变量以使用 /var/run/user/$UID,避免与 ZFS 可能存在的问题。在查看以下部分的配置示例时,请考虑这种情况。

seatd 守护进程帮助在合成器中管理非 root 用户对共享系统设备的访问,包括图形卡。对于传统的 X11 管理器,如 Plasma 和 GNOME,不需要使用 seatd,但对于这里讨论的 Wayland 合成器,在启动合成器环境之前,需要在系统上启用并运行它。要立即启用和启动 seatd 守护进程,并在系统初始化时启动:

# sysrc seatd_enable=”YES”
# service seatd start

之后,需要安装一个类似于 X11 桌面的合成器 (compositor) 来创建 GUI 环境。这里讨论了三种合成器,包括基本配置选项、设置屏幕锁定以及获取更多信息的建议。

6.2. Wayfire 合成器

Wayfire 是一个旨在轻量化和可定制化的合成器。它提供了多种功能,并且还恢复了之前发布的 Compiz Fusion 桌面的一些元素。所有的部分在现代硬件上看起来都很漂亮。要启动和运行 Wayfire,请先安装所需的软件包:

# pkg install wayfire wf-shell alacritty swaylock-effects swayidle wlogout kanshi mako wlsunset

alacritty 软件包提供了一个终端仿真器。然而,并不完全需要它,因为其他终端仿真器如 kitty 和 XFCE-4 Terminal 已经在 Wayfire 合成器下进行了测试和验证。 Wayfire 的配置相对简单;它使用一个文件,应该对其中的任何自定义进行审查。要开始,将示例文件复制到运行时环境配置目录,然后编辑该文件:

% mkdir ~/.config/wayfire
% cp /usr/local/share/examples/wayfire/wayfire.ini ~/.config/wayfire

对于大多数用户来说,默认设置应该是可以的。在配置文件中,像著名的 cube 这样的项目已经预先配置好了,并且有说明来帮助设置可用的选项。一些值得注意的主要设置包括:

[output]
mode = 1920x1080@60000
position = 0,0
transform = normal
scale = 1.000000

在这个例子中,从配置文件中,屏幕的输出应该是列表中列出的模式和列表中列出的赫兹。例如,模式应该设置为 widthxheight@refresh_rate。位置将输出放置在指定的像素位置上。默认值对大多数用户来说应该是可以接受的。最后, transform 设置了背景变换, scale 将输出按指定的比例因子进行缩放。这些选项的默认值通常是可以接受的;有关更多信息,请参阅文档。

如前所述,Wayland 是一种新的协议,还不是所有的应用程序都能与之兼容。目前,sddm 似乎不支持在 Wayland 中启动和管理合成器。在这些示例中,使用了 swaylock 实用程序。配置文件中包含了运行 swayidleswaylock 来处理屏幕空闲和锁定的选项。

当系统处于空闲状态时,可以使用此选项来定义要执行的操作。

idle = swaylock

锁定超时是通过以下行进行配置的:

[idle]
toggle = <super> KEY_Z
screensaver_timeout = 300
dpms_timeout = 600

第一个选项将在 300 秒后锁定屏幕,再过 300 秒后,屏幕将通过 dpms_timeout 选项关闭。

需要注意的最后一件事是 <super> 键。大多数配置都提到了这个键,它是键盘上的传统 Windows 键。大多数键盘都有这个超级键可用;然而,如果该键不可用,应在此配置文件中重新映射它。例如,要锁定屏幕,请按住超级键,shift 键,然后按下 escape 键。除非映射已更改,否则这将执行 swaylock 应用程序。 swaylock 的默认配置将显示一个灰色屏幕;然而,该应用程序可以高度自定义,并且有很好的文档。此外,由于安装的是 swaylock-effects 版本,因此有几个可用的选项,例如模糊效果,可以使用以下命令查看:

% swaylock --effect-blur 7x5

还有一个 --clock 参数,它会在锁屏界面上显示一个带有日期和时间的时钟。当安装了 x11/swaylock-effects 软件包时,会包含一个默认的 pam.d 配置文件。它提供了适用于大多数用户的默认选项。还有更高级的选项可用;有关更多信息,请参阅 PAM 文档。

此时,是时候测试 Wayfire 并查看它是否能在系统上启动了。只需输入以下命令:

% wayfire -c ~/.config/wayfire/wayfire.ini

现在,合成器应该开始运行,并在屏幕顶部显示一个背景图像和一个菜单栏。 Wayfire 将尝试列出已安装的兼容应用程序,并在此下拉菜单中呈现它们;例如,如果安装了 XFCE-4 文件管理器,它将显示在此下拉菜单中。如果特定应用程序与键盘快捷键兼容且足够有价值,可以使用 wayfire.ini 配置文件将其映射到键盘序列。 Wayfire 还有一个名为 Wayfire Config Manager 的配置工具。它位于下拉菜单栏中,但也可以通过终端发出以下命令来启动:

% wcm

通过这个应用程序,可以启用、禁用或配置各种 Wayfire 配置选项,包括合成特效。此外,为了提供更用户友好的体验,可以在配置文件中启用背景管理器、面板和停靠应用程序。

panel = wf-panel
dock = wf-dock
background = wf-background

通过 wcm 进行的更改将覆盖 wayfire.ini 配置文件中的自定义更改。强烈建议备份 wayfire.ini 文件,以便可以恢复任何重要的更改。

最后,在 wayfire.ini 中列出的默认启动器是 x11/wf-shell ,用户可以根据需要替换为其他面板。

6.3. Hikari 合成器

Hikari 合成器使用了几个以提高生产力为中心的概念,例如工作表(sheets)、工作区(workspaces)等等。从这个角度来看,它类似于平铺式窗口管理器。具体来说,合成器从一个单一的工作区开始,类似于虚拟桌面。 Hikari 使用一个单一的工作区或虚拟桌面进行用户交互。工作区由多个视图组成,这些视图是合成器中的工作窗口,分组为工作表或组(groups)。工作表和组都由一组视图组成,即被分组在一起的窗口。在工作表或之间切换时,活动的工作表或组将被统称为工作区。手册将详细介绍每个功能,但在本文档中,只需考虑一个使用单个 工作表的工作区。 Hikari 的安装将包括一个单一的软件包 x11-wm/hikari 和一个终端模拟器 alacritty

# pkg install hikari alacritty

其他终端,如 kitty 或 Plasma 的 Terminal,在 Wayland 下可以正常工作。用户应该尝试使用他们喜欢的终端编辑器来验证兼容性。

Hikari 使用一个配置文件 hikari.conf,可以放置在 XDG_RUNTIME_DIR 目录中,也可以在启动时使用 -c 参数指定。不需要自动启动配置文件,但是可能会使迁移到这个合成器更容易一些。开始配置是创建 Hikari 配置目录并复制配置文件进行编辑:

% mkdir ~/.config/hikari
% cp /usr/local/etc/hikari/hikari.conf ~/.config/hikari

配置被分解为各种部分,如 ui、outputs、layouts 等等。对于大多数用户来说,默认设置应该可以正常运行;但是还需要进行一些重要的更改。例如,$TERMINAL 变量通常在用户的环境中没有设置。可以更改这个变量或者修改 hikari.conf 文件以进行读取。

terminal = "/usr/local/bin/alacritty"

将使用绑定的按键启动 alacritty 终端。在浏览配置文件时,应注意大写字母用于为用户映射键。例如,用于启动终端的 LL+Return 实际上是前面讨论过的超级键或 Windows 徽标键。因此,按住 L/super/Windows 键并按下 Enter 键将使用默认配置打开指定的终端仿真器。将其他键映射到应用程序需要创建一个动作定义。为此,动作项应列在动作段中,例如:

actions {
  terminal = "/usr/local/bin/alacritty"
  browser = "/usr/local/bin/firefox"
}

然后,可以将一个动作映射到键盘部分,该部分在绑定部分中定义:

bindings {
  keyboard {
SNIP
    "L+Return" = action-terminal
    "L+b" = action-browser
SNIP

在 Hikari 重新启动后,按住 Windows 徽标按钮并在键盘上按下 b 键将启动网页浏览器。合成器没有菜单栏,建议用户在迁移之前至少设置一个终端仿真器。手册中包含大量的文档,应在进行完整迁移之前阅读。Hikari 的另一个积极方面是,在迁移到合成器时,可以在 Plasma 和 GNOME 桌面环境中启动 Hikari,以便在完全迁移之前进行试用。

在 Hikari 中锁定屏幕很容易,因为默认的 pam.d 配置文件和解锁工具已经与软件包捆绑在一起。锁定屏幕的键绑定是 L(Windows 徽标键)+ Shift + Backspace。需要注意的是,所有未标记为公共的视图将被隐藏。当屏幕锁定时,这些视图将不接受输入,但要注意敏感信息可能可见。对于一些用户来说,可能更容易迁移到其他屏幕锁定工具,比如在本节中讨论的 swaylock-effects。要启动 Hikari,请使用以下命令:

% hikari -c ~/.config/hikari/hikari.conf

6.4. Sway 合成器

Sway 合成器是一种平铺式合成器,旨在取代 i3 窗口管理器。它应该与用户当前的 i3 配置兼容;但是,新功能可能需要一些额外的设置。在接下来的示例中,假设进行了全新安装,没有迁移任何 i3 配置。要安装 Sway 和有价值的组件,请以 root 用户身份执行以下命令:

# pkg install sway swayidle swaylock-effects alacritty dmenu-wayland dmenu

对于一个基本的配置文件,执行以下命令,然后在复制完成后编辑配置文件:

% mkdir ~/.config/sway
% cp /usr/local/etc/sway/config ~/.config/sway

基本配置文件有许多默认值,对于大多数用户来说这是可以的。但是还需要进行一些重要的更改,如下所示:

# Logo key. Use Mod1 for Alt.
input * xkb_rules evdev
set $mod Mod4
# Your preferred terminal emulator
set $term alacritty
set $lock swaylock -f -c 000000
output "My Workstation" mode 1366x786@60Hz position 1366 0
output * bg ~/wallpapers/mywallpaper.png stretch
### Idle configuration
exec swayidle -w \
          timeout 300 'swaylock -f -c 000000' \
          timeout 600 'swaymsg "output * dpms off"' resume 'swaymsg "output * dpms on"' \
          before-sleep 'swaylock -f -c 000000'

在前面的示例中,加载了 xkb 规则以处理 evdev(4) 事件,并将 $mod 键设置为 Windows 徽标键以进行键绑定。接下来,终端仿真器被设置为 alacritty,并定义了一个屏幕锁定命令;稍后会详细介绍。输出关键字、模式、位置、背景壁纸以及 Sway 还被告知将该壁纸拉伸以填满屏幕。最后,设置 swaylock 在 300 秒超时后将屏幕或监视器锁定并进入睡眠模式。在这里还定义了锁定的背景颜色为 000000,即黑色。使用 swaylock-effects,还可以使用 --clock 参数显示时钟。有关更多选项,请参阅手册页。还应该查看 sway-output(5) 手册页;它包含了大量关于自定义输出选项的信息。

在 Sway 中,要打开应用程序菜单,请按住 Windows 徽标键(mod 键)并按下 d 键。可以使用键盘上的箭头键来导航菜单。还有一种方法可以操作栏的布局并添加一个托盘;请阅读 sway-bar(5) 手册页面获取更多信息。默认配置在右上角添加了日期和时间。在配置文件的 Bar 部分中可以找到一个示例。默认情况下,配置不包括在上面的示例之外锁定屏幕,启用锁定计时器。创建一个锁定键绑定需要在 Key bindings 部分添加以下行:

# Lock the screen manually
bindsym $mod+Shift+Return exec $lock

现在可以使用按住 Windows 徽标键、按住 Shift 键,最后按下回车键的组合来锁定屏幕。当安装了 Sway,无论是从软件包还是 FreeBSD Ports Collection 安装的,都会安装一个默认的 pam.d 文件。默认配置对大多数用户来说应该是可接受的,但也提供了更高级的选项。请阅读 PAM 文档以获取更多信息。

最后,要退出 Sway 并返回到 shell,请按住 Windows 徽标键和 Shift 键,然后按下键盘上的 [e] 键。会显示一个提示,其中有一个选项可以退出 Sway。在迁移期间,可以通过在诸如 Plasma 之类的 X11 桌面上的终端模拟器中启动 Sway 。这使得在完全迁移到这个合成器之前,测试不同的更改和键绑定变得更加容易。要启动 Sway ,请执行以下命令:

% sway -c ~/.config/sway/config

6.5. 使用 Xwayland

在安装 Wayland 时,除非 Wayland 是没有构建 X11 支持的,否则应该已经安装了 Xwayland 二进制文件。如果 /usr/local/bin/Xwayland 文件不存在,请使用以下命令进行安装:

# pkg install xwayland-devel

推荐使用 Xwayland 的开发版本,并且很可能已经随 Wayland 软件包一起安装。每个合成器都有一种启用或禁用此功能的方法。

一旦安装了 Xwayland,请在所选的合成器中进行配置。对于 Wayfire 来说,在 wayfire.ini 文件中需要添加以下行:

xwayland = true

对于 Sway 合成器,默认情况下应启用 Xwayland。即便如此,建议在 ~/.config/sway/config 中手动添加以下配置行:

启用 XWayland

最后,对于 Hikari 来说,不需要进行任何更改。默认情况下,已经内置了对 Xwayland 的支持。要禁用该支持,可以从 ports 集合中重新构建该软件包,并在那时禁用 Xwayland 支持。

在进行这些更改后,通过命令行启动合成器,并从键绑定中执行一个终端。在这个终端中,输入 env 命令并搜索 DISPLAY 变量。如果合成器能够正确启动 Xwayland X 服务器,这些环境变量应该类似于以下内容:

% env | grep DISPLAY
WAYLAND_DISPLAY=wayland-1
DISPLAY=:0

在这个输出中,有一个默认的 Wayland 显示器和一个为 Xwayland 服务器设置的显示器。验证 Xwayland 是否正常工作的另一种方法是安装和测试一个小包 package:[x11/eyes],并检查输出。如果 xeyes 应用程序启动并且眼睛跟随鼠标指针移动,那么 Xwayland 正常工作。如果显示了以下错误或类似错误,则在 Xwayland 初始化过程中发生了某些问题,可能需要重新安装:

Error: Cannot open display wayland-0

Wayland 的一个安全特性是,在没有运行 X 服务器的情况下,没有其他网络监听器。一旦启用了 Xwayland,这个安全特性对系统就不再适用。

对于一些复合器,比如 Wayfire,Xwayland 可能无法正常启动。因此,env 将显示 DISPLAY 环境变量的以下信息:

% env | grep DISPLAY
DISPLAY=wayland-1
WAYLAND_DISPLAY=wayland-1

尽管已经安装和配置了 Xwayfire,但 X11 应用程序无法启动,出现显示问题。为了解决这个问题,可以通过以下两种方法验证是否已经存在一个使用 UNIX 套接字的 Xwayland 实例。首先,检查 sockstat 的输出,并搜索 X11-unix:

% sockstat | grep x11

应该有类似以下信息的内容:

trhodes  Xwayland   2734  8  stream /tmp/.X11-unix/X0
trhodes  Xwayland   2734  9  stream /tmp/.X11-unix/X0
trhodes  Xwayland   2734  10 stream /tmp/.X11-unix/X0
trhodes  Xwayland   2734  27 stream /tmp/.X11-unix/X0_
trhodes  Xwayland   2734  28 stream /tmp/.X11-unix/X0

这表明存在一个 X11 套接字。可以通过在合成器下运行的终端模拟器中尝试手动执行 Xwayland 来进一步验证:

% Xwayland

如果已经存在一个 X11 套接字,则应向用户显示以下错误:

(EE)
Fatal server error:
(EE) Server is already active for display 0
	If this server is no longer running, remove /tmp/.X0-lock
	and start again.
(EE)

由于存在一个可用的活动 X 显示器,使用显示器零,环境变量设置不正确,要修复这个问题,将 DISPLAY 环境变量更改为 :0,然后尝试再次执行应用程序。以下示例使用 mail/claws-mail 作为需要 Xwayland 服务的应用程序:

export DISPLAY=:0

在这个改变之后,mail/claws-mail 应用程序现在应该开始使用 Xwayland 并正常工作。

6.6. 使用 VNC 进行远程桌面访问

在本文档中早些时候已经指出, Wayland 不像 Xorg 提供相同的 X 服务器样式访问。相反,用户可以自由选择远程桌面协议,如 RDP 或 VNC。FreeBSD Ports 集合中包括 wayvnc,它将支持基于 wlroots 的合成器,例如在这里讨论的合成器。可以使用以下命令安装此应用程序:

# pkg install wayvnc

与其他一些软件包不同,wayvnc 不提供配置文件。幸运的是,手册页面记录了重要的选项,并且可以将它们推导成一个简单的配置文件:

address=0.0.0.0
enable_auth=true
username=username
password=password
private_key_file=/path/to/key.pem
certificate_file=/path/to/cert.pem

需要生成密钥文件,并强烈建议使用它们以增加连接的安全性。当调用时,wayvnc 将在 ~/.config/wayvnc/config 中搜索配置文件。可以使用 -C configuration_file 选项在启动服务器时覆盖该文件。因此,要启动 wayvnc 服务器,请执行以下命令:

% wayvnc -C ~/.config/wayvnc/config

在撰写本文时,系统初始化时没有 rc.d 脚本来启动 wayvnc。如果需要这个功能,需要创建一个本地启动文件。这可能是对端口维护者的一个功能请求。

6.7. Wayland 登录管理器

虽然存在多个登录管理器,并且正在逐渐迁移到 Wayland,但其中一个选择是 x11/ly 中的文本用户界面(TUI)管理器。ly 只需要最少的配置,它会在系统初始化时显示一个登录窗口来启动 Sway、Wayfire 等桌面环境。要安装 ly,请执行以下命令:

# pkg install ly

将会提供一些配置提示,导入步骤是将以下行添加到 /etc/gettytab 文件中:

Ly:\
  :lo=/usr/local/bin/ly:\
  :al=root:

然后在 /etc/ttys 中修改 ttyv1 行,使其与以下行匹配:

ttyv1 "/usr/libexec/getty Ly" xterm onifexists secure

系统重新启动后,应该出现登录界面。要配置特定的设置,例如语言和编辑 /usr/local/etc/ly/config.ini 。至少,这个文件应该有之前在 /etc/ttys 中指定的终端。

如果将 ttyv0 设置为登录终端,可能需要按下 altF1 键才能正确显示登录窗口。

当登录窗口出现时,使用左右箭头可以在不同支持的窗口管理器之间切换。

6.8. 有用的工具

所有合成器都可以使用的一个有用的 Wayland 实用程序是 waybar。虽然 Wayfire 带有一个启动菜单,但一个易于使用和快速的任务栏对于任何合成器或桌面管理器来说都是一个很好的附件。一个快速且易于配置的 Wayland 兼容的任务栏是 waybar。要安装该软件包和一个支持音频控制的实用程序,请执行以下命令:

# pkg install pavucontrol waybar

要创建配置目录并复制默认配置文件,请执行以下命令:

% mkdir ~/.config/waybar
% cp /usr/local/etc/xdg/waybar/config ~/.config/waybar

lavalauncher 实用程序为各种应用程序提供了一个启动栏。软件包中没有提供示例配置文件,因此必须执行以下操作:

mkdir ~/.config/lavalauncher

下面是一个只包含 Firefox 的示例配置文件,并且放置在右侧:

global-settings {
	watch-config-file = true;
}

bar {
	output            = eDP-1;
	position          = bottom;
	background-colour = "#202020";

	# Condition for the default configuration set.
	condition-resolution = wider-than-high;

	config {
		position = right;
	}

	button {
		image-path          =     /usr/local/lib/firefox/browser/chrome/icons/default/default48.png;
		command[mouse-left] =     /usr/local/bin/firefox;
	}
	button {
	  image-path           =   /usr/local/share/pixmaps/thunderbird.png;
	  command[mouse-left]  =   /usr/local/bin/thunderbird;
}

上次修改时间: September 18, 2024 by fiercex