第 6 章. Wayland

6.1. 概述

使用 bsdinstall 安装的 FreeBSD 不会自动安装图形用户界面。本章介绍如何选择、安装和配置 Wayland 合成器,它提供图形环境。

阅读本章之前,您应该

阅读本章之后,您将了解

  • 如何配置 FreeBSD 以托管 Wayland 图形环境。

  • 如何安装和配置 Wayland 合成器。

  • 如何在较旧的 X Window System 上运行程序。

  • 如何配置对 Wayland 图形环境的远程桌面访问。

6.2. Wayland 概述

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

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

Wayland 相对较新,并非所有软件都已更新以在没有 Xwayland 支持的情况下原生运行。由于 Wayland 不提供 X 服务器,并且期望合成器提供该支持,因此不支持 Wayland 的 X11 窗口管理器将要求 Xwayland 不以 -rootless 参数启动。删除 -rootless 参数将恢复 X11 窗口管理器支持。

当前的 NVIDIA® 驱动程序应该与大多数 wlroots 合成器一起使用,但它可能有点不稳定,并且目前不支持所有功能。欢迎志愿者帮助开发 NVIDIA® DRM。

目前,很多软件在 Wayland 上运行时功能正常,包括 Firefox。而且还有一些桌面可用,例如 Compiz Fusion 的替代品 Wayfire 和 i3 窗口管理器的替代品 Sway。

截至 2021 年 5 月,plasma5-kwin 支持 FreeBSD 上的 Wayland。要在 Wayland 下使用 Plasma,请使用 startplasma-wayland 参数启动 ck-launch-session 并使用 dbus-launch --exit-with-x11 ck-launch-session startplasma-wayland 绑定 dbus,以使其正常工作。

对于合成器,必须存在支持 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 的合成器都需要在环境中定义一个运行时目录。从 FreeBSD 14.1 开始,这将自动创建和定义。对于早期版本,这可以通过在 bourne shell 中使用以下命令来实现

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

重要的是要注意,大多数合成器将在 XDG_RUNTIME_DIR 目录中搜索配置文件。在本文档中包含的示例中,将使用参数来指定 ~/.config 中的配置文件,以将临时文件和配置文件分开。建议为每个合成器配置一个别名以加载指定的配置文件。

据报道,ZFS 用户可能会遇到某些 Wayland 客户端的问题,因为它们需要访问运行时目录中的 posix_fallocate()。虽然作者无法在他们的 ZFS 系统上重现此问题,但建议的解决方法是不将 ZFS 用于运行时目录,而是将 tmpfs 用于 /var/run 目录。在这种情况下,tmpfs 文件系统用于 /var/run 并且通过命令 mount -t tmpfs tmpfs /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 桌面)来创建 GUI 环境。这里将讨论三个合成器,包括基本配置选项、设置屏幕锁定以及更多信息的建议。

6.3. 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 配置管理器的配置工具。它位于下拉菜单栏中,但也可以通过终端发出以下命令来启动

% wcm

各种 Wayfire 配置选项(包括合成特殊效果)可以通过此应用程序启用、禁用或配置。此外,为了获得更友好的用户体验,可以在配置文件中启用背景管理器、面板和对接应用程序

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

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

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

6.4. Hikari 合成器

Hikari 合成器使用围绕生产力为中心的几个概念,例如工作表、工作区等等。这样,它类似于平铺窗口管理器。分解一下,合成器从一个工作区开始,它类似于虚拟桌面。Hikari 使用单个工作区或虚拟桌面进行用户交互。工作区由多个视图组成,这些视图是合成器中作为工作表或组分组在一起的工作窗口。工作表和组都由多个视图组成;同样,这些视图是分组在一起的窗口。在工作表或组之间切换时,活动工作表或组将被统称为工作区。手册页将更详细地介绍每个功能,但对于本文档,只需考虑使用单个工作表的一个工作区即可。Hikari 安装将包含一个软件包,x11-wm/hikari,以及一个终端模拟器alacritty

# pkg install hikari alacritty

其他 shell,例如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、输出、布局等等。对于大多数用户来说,默认设置运行良好;但是,应该进行一些重要的更改。例如,$TERMINAL 变量通常未在用户的环境中设置。更改此变量或更改hikari.conf文件以读取

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

将使用绑定键按下启动alacritty终端。在查看配置文件时,应该注意,大写字母用于为用户映射键。例如,用于启动终端的LL+Return实际上是之前讨论过的超级键或 Windows 徽标键。因此,按住L/超级/Windows键并按下Enter键将使用默认配置打开指定的终端模拟器。将其他键映射到应用程序需要创建操作定义。为此,操作项应列在 actions 部分,例如

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

然后,可以在 keyboard 部分映射操作,该部分在 bindings 部分内定义

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

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

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

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

6.5. 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 1366x768@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'

在前面的示例中,加载了evdev(4)事件的xkb规则,并且$mod 键被设置为 Windows 徽标键用于键绑定。接下来,终端模拟器被设置为alacritty,并且定义了屏幕锁定命令;后面会详细介绍。output 关键字、模式、位置、背景壁纸以及 Sway 也被告知将此壁纸拉伸以填满屏幕。最后,swaylock 被设置为守护进程化并在 300 秒的超时时间后锁定屏幕,在 600 秒后将屏幕或显示器置于睡眠模式。这里还定义了锁定背景颜色 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 键以及最后按下 return 键的组合来锁定屏幕。安装 Sway 后,无论是从软件包还是从 FreeBSD Ports 集合安装,都会安装一个默认的pam.d文件。默认配置对于大多数用户来说应该可以接受,但还有更高级的选项可用。阅读 PAM 文档以了解更多信息。

最后,要退出 Sway 并返回到 shell,请按住 Windows 徽标键、shift 键,然后按下e键。将显示一个提示符,其中包含退出 Sway 的选项。在迁移期间,Sway 可以通过 X11 桌面上的终端模拟器(例如 Plasma)启动。这使得在完全迁移到此合成器之前,测试不同的更改和键绑定更容易一些。要启动 Sway,请发出以下命令

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

6.6. 使用 Xwayland

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

# pkg install xwayland-devel

建议使用 Xwayland 的开发版本,它很可能与 Wayland 软件包一起安装。每个合成器都有启用或禁用此功能的方法。

安装Xwayland后,在选择的合成器中对其进行配置。对于 Wayfire,wayfire.ini文件需要以下行

xwayland = true

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

xwayland enable

最后,对于 Hikari,不需要任何更改。默认情况下内置了对Xwayland的支持。要禁用该支持,请从 ports 集合重新构建软件包并在此时禁用 Xwayland 支持。

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

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

在此输出中,有一个默认的 Wayland 显示屏和一个为 Xwayland 服务器设置的显示屏。验证Xwayland是否正常运行的另一种方法是使用安装并测试小型软件包:[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)

由于使用显示器零 (display zero) 有一个活动的 X 显示器可用,因此环境变量设置不正确。为了解决此问题,将 `DISPLAY` 环境变量更改为 `:0`,然后尝试再次执行应用程序。以下示例使用 mail/claws-mail 作为需要 `Xwayland` 服务的应用程序

export DISPLAY=:0

进行此更改后,mail/claws-mail 应用程序现在应该使用 `Xwayland` 启动并按预期工作。

6.7. 使用 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.8. 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 中指定的指定 tty。

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

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

6.9. 有用工具

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

# 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;
}

**最后修改时间:** 2024 年 10 月 14 日,作者:Jim Brown