5.10.FreeBSD 中的 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 驱动程序应该可以与大多数 wl-roots 合成器一起使用,但它可能有点不稳定并且目前不支持所有功能。请求志愿者帮助开发 NVidia DRM。

目前,很多软件都可以在 Wayland 上正常运行,包括 Firefox。还有一些桌面也可用,例如 Compiz Fusion 替代品,称为 Wayfire,以及 i3 窗口管理器替代品,Sway。

注意

截至 2021 年 5 月,plasma5-kwin 在 FreeBSD 上支持 Wayland。要在 Wayland下 使用 Plasma,请使用 startplasma-wayland 参数来 ck-launch-session,并将 dbus 与 :ck-launch-session dbus-run-session startplasma-wayland 匹配以使其工作。

对于合成器,必须存在支持 evdev(4) 驱动程序的内核才能使用键绑定功能。这是默认内置在 GENERIC 内核中的;但是,如果它已被定制并且 evdev(4) 支持被剥离,则需要加载 evdev(4) 模块。此外,Wayland 的用户需要成为 video 组的成员。要快速进行此更改,请使用 pw 命令:

  1. pw groupmod video -m user

安装 Wayland 很简单;协议本身没有太多的配置。大多数合成将取决于所选的合成器。通过现在安装 seatd,作为合成器安装和配置的一部分将跳过一个步骤,因为需要使用 seatd 来提供对某些设备的非 root 访问权限。此处描述的所有合成器都应与 graphics/drm-kmod 开源驱动程序一起使用;但是,NVidia 显卡在使用专有驱动程序时可能会出现问题。首先安装以下软件包:

  1. # pkg install wayland seatd

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

  1. % 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 管理器,不需要 seatd,例如 Plasma 和 GNOME,但对于此处讨论的 Wayland 合成器,它需要在系统上启用并在启动合成器环境之前运行。 要立即启用和启动 seatd 守护程序,并在系统初始化时:

  1. # sysrc seatd_enable=”YES”
  2. # service seatd start

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

5.10.1. Wayfire 合成器

Wayfire 是一个旨在实现轻量级和可定制的合成器。有几个功能可用,它带回了以前发布的 Compiz Fusion 桌面的几个元素。所有零件在现代硬件上看起来都很漂亮。要启动并运行 Wayfire,首先要安装所需的软件包:

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

alacritty 包提供了一个终端仿真器。尽管如此,它并不是完全需要的,因为其他终端仿真器(例如 kitty 和 XFCE-4 Terminal)已经过测试和验证,可以在 Wayfire 合成器下工作。Wayfire配置比较简单;它使用一个文件,该文件应针对任何自定义进行审查。首先,将示例文件复制到运行时环境配置目录,然后编辑该文件:

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

大多数用户的默认设置应该没问题。在配置文件中,像著名的 cube 这样的项目都是预先配置的,还有一些说明来帮助进行可用的设置。一些值得注意的主要设置包括:

  1. [output]
  2. mode = 1920x1080@60000
  3. position = 0,0
  4. transform = normal
  5. scale = 1.000000

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

如前所述,Wayland 是新的,并非所有应用程序都使用该协议。目前,sddm 似乎不支持在 Wayland 中启动和管理合成器。在这些示例中,已改为使用 swaylock 实用程序。配置文件包含运行 swayidleswaylock 用于空闲和锁定屏幕的选项。此选项用于定义系统空闲时要执行的操作,如下所示:

  1. idle = swaylock

并使用以下行配置锁定超时:

  1. [idle]
  2. toggle = <super> KEY_Z
  3. screensaver_timeout = 300
  4. dpms_timeout = 600

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

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

  1. % swaylock --effect-blur 7x5

还有 --clock 参数将在锁定屏幕上显示带有日期和时间的时钟。安装 x11/swaylock-effects 时,包含默认的 *pam.d 配置。它提供了适合大多数用户的默认选项。提供更高级的选项;有关详细信息,请参阅 PAM 文档。 此时,是时候测试 Wayfire 了,看看它是否可以在系统上启动。只需键入以下命令:

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

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

  1. % wcm

各种 Wayfire 配置选项,包括复合特效,可以通过此应用程序启用、禁用或配置。此外,为了更人性化的体验,可以在配置文件中启用后台管理器、面板和停靠应用程序:

  1. panel = wf-panel
  2. dock = wf-dock
  3. background = wf-background

警告 通过 wcm 所做的更改将覆盖 wayfire.ini 配置文件中的自定义更改。强烈建议备份 wayfire.ini 文件,以便可以恢复任何重要的更改。 最后,wayfire.ini 中列出的默认启动器是 x11/wf-shell,如果用户需要,可以将其替换为其他面板。

5.10.2. 光合成器

Hikari 合成器使用了几个以生产力为中心的概念,例如工作表、工作区等。这样,它类似于平铺窗口管理器。打破这一点,合成器从单个工作区开始,类似于虚拟桌面。Hikari 使用单个工作区或虚拟桌面进行用户交互。工作区由多个视图组成,这些视图是合成器中的工作窗口,分为工作表或组。工作表和组都由一组视图组成;再次,组合在一起的窗口。在工作表或组之间切换时,活动工作表或组将统称为工作区。手册页会将其分解为有关每个功能的更多信息,但对于本文档,仅考虑使用单个工作表的单个工作区。Hikari 安装将包含一个单独的包 x11-wm/hikari 和一个终端仿真器 alacritty:

  1. # pkg install hikari alacritty

注意 其他 shell,例如 kitty 或 Plasma Terminal,将在 Wayland 下运行。用户应尝试使用他们最喜欢的终端编辑器来验证兼容性。 Hikari 使用配置文件 hikari.conf,它可以放在 XDG_RUNTIME_DIR 中,也可以在启动时使用 -c 参数指定。不需要自动启动配置文件,但可能会使迁移到此合成器更容易一些。开始配置是创建 Hikari 配置目录并复制配置文件进行编辑:

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

配置分为不同的节,例如 ui、输出、布局等。对于大多数用户来说,默认设置可以正常工作;但是,应该做出一些重要的改变。例如,$TERMINAL 变量通常不在用户环境中设置。更改此变量或更改 hikari.conf 文件以读取:

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

将使用绑定的按键启动 alacritty 终端。在浏览配置文件时,应该注意大写字母用于为用户映射键。比如启动终端的 L 键 L+Return 其实就是前面讲的超级键或者 Windows logo 键。因此,按住 L/super/Windows 键并按 Enter 将使用默认配置打开指定的终端仿真器。将其他键映射到应用程序需要创建操作定义。为此,操作项应列在操作节中,例如:

  1. actions {
  2. terminal = "/usr/local/bin/alacritty"
  3. browser = "/usr/local/bin/firefox"
  4. }

然后可以在键盘节下映射一个动作,该节在绑定节中定义:

  1. bindings {
  2. keyboard {
  3. SNIP
  4. "L+Return" = action-terminal
  5. "L+b" = action-browser
  6. SNIP

重启 Hikari 后,按住 Windows 徽标按钮并按键盘上的 b 键将启动 Web 浏览器。合成器没有菜单栏,建议用户在迁移前至少设置一个终端模拟器。手册页包含大量文档,在执行完整迁移之前应该阅读它。关于 Hikari 的另一个积极方面是,在迁移到合成器时,Hikari 可以在 Plasma 和 GNOME 桌面环境中启动,允许在完全迁移之前进行试驾。 在 Hikari 中锁定屏幕很容易,因为软件包中捆绑了默认的 pam.d 配置文件和解锁实用程序。锁定屏幕的键绑定是 L(Windows logo 键)+ Shift + Backspace。需要注意的是,所有未标记为公开的视图都将被隐藏。这些视图在锁定时永远不会接受输入,但要注意敏感信息是可见的。对于某些用户来说,迁移到本节讨论的其他屏幕锁定实用程序(如摇摆效果)可能更容易。要启动 Hikari,请使用以下命令:

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

5.10.3. 摇摆合成器

Sway 合成器是一种平铺合成器,它试图取代 i3 窗口管理器。它应该适用于用户当前的 i3 配置;但是,新功能可能需要一些额外的设置。在接下来的示例中,将假定全新安装而不迁移任何 i3 配置。要安装 Sway 和有价值的组件,请以 root 用户身份发出以下命令:

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

对于基本配置文件,发出以下命令,然后在复制配置文件后对其进行编辑:

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

基本配置文件有许多默认值,这对大多数用户来说都很好。应该进行一些重要的更改,如下所示:

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

在前面的示例中,加载了 evdev(4) 事件的 xkb 规则,并将 $mod 键设置为键绑定的 Windows 徽标键。接下来将终端模拟器设置为 alacritty,并定义锁屏命令;稍后会详细介绍。输出关键字、模式、位置、背景壁纸和 Sway 也被告知拉伸此壁纸以填充屏幕。最后,swaylock 设置为在 300 秒超时后守护并锁定屏幕,在 600 秒后将屏幕或显示器置于睡眠模式。锁定的背景颜色 000000,即黑色,也在这里定义。使用 swaylock-effects,还可以使用 --clock 参数显示时钟。有关更多选项,请参阅手册页。还应查看 sway-output(5) 手册页;它包含大量有关自定义可用输出选项的信息。 在 Sway 中,要调出应用程序菜单,请按住 Windows 徽标键 (mod) 并按 d 键。可以使用键盘上的箭头键导航菜单。还有一种方法可以操作栏的布局并添加托盘;阅读 sway-bar(5) 手册页以获取更多信息。默认配置会在右上角添加日期和时间。有关示例,请参见配置文件中的 Bar 节。默认情况下,配置不包括在上述示例之外锁定屏幕,启用锁定计时器。创建锁定键绑定需要在 Key bindings 部分添加以下行:

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

现在可以使用按住 Windows 徽标键、按住 shift 并最后按 return 的组合来锁定屏幕。安装 Sway 时,无论是来自软件包还是 FreeBSD Ports Collection,都会安装 pam.d 的默认文件。大多数用户应该可以接受默认配置,但可以使用更高级的选项。阅读 PAM 文档以获取更多信息。 最后,要退出 Sway 并返回到 shell,请按住 Windows 徽标键、shift 键,然后按 e 键。将显示一个提示,其中包含退出 Sway 的选项。在迁移期间,可以通过 Plasma 等 X11 桌面上的终端模拟器启动 Sway。这使得在完全迁移到此合成器之前测试不同的更改和键绑定更容易一些。要启动 Sway,请发出以下命令:

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

5.10.4. 使用 Xwayland

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

  1. # pkg install xwayland-devel

注意 推荐使用 Xwayland 的开发版本,并且很可能与 Wayland 软件包一起安装。每个合成器都有一种启用或禁用此功能的方法。 安装 Xwayland 后,在所选合成器中对其进行配置。对于 Wayfire,wayfire.ini 文件中需要以下行:

  1. xwayland = true

对于 Sway 合成器,应默认启用 Xwayland。尽管如此,还是建议在 ~/.config/sway/config 中手动添加配置行,如下所示:

  1. xwayland enable

最后,对于 Hikari,不需要进行任何更改。默认情况下内置了对 Xwayland 的支持。要禁用该支持,请从端口集合中重建软件包并在那时禁用 Xwayland 支持。 进行这些更改后,在命令行启动合成器并从键绑定执行终端。在此终端中,发出 env 命令并搜索 DISPLAY 变量。如果合成器能够正确启动 Xwayland X 服务器,这些环境变量应该类似于以下内容:

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

在此输出中,有一个默认的 Wayland 显示和 Xwayland 服务器的显示集。验证 Xwayland 是否正常运行的另一种方法是使用安装和测试小包:[x11/eyes] 并检查输出。如果 xeyes 应用程序启动并且眼睛跟随鼠标指针,则 Xwayland 运行正常。如果出现如下错误,则说明 Xwayland 初始化过程中发生了一些事情,可能需要重新安装:

  1. Error: Cannot open display wayland-0

警告 Wayland 的一个安全特性是,在没有运行 X 服务器的情况下,没有另一个网络监听器。启用 Xwayland 后,此安全功能将不再适用于系统。 对于某些合成器,例如 Wayfire,Xwayland 可能无法正常启动。因此, env 将显示 DISPLAY 环境变量的以下信息:

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

即使安装并配置了 Xwayfire,X11 应用程序也不会开始出现显示问题。要解决此问题,请通过这两种方法验证是否已经存在使用 UNIX 套接字的 Xwayland 实例。首先,检查 sockstat 的输出并搜索 X11-unix:

  1. % sockstat | grep x11

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

  1. trhodes Xwayland 2734 8 stream /tmp/.X11-unix/X0
  2. trhodes Xwayland 2734 9 stream /tmp/.X11-unix/X0
  3. trhodes Xwayland 2734 10 stream /tmp/.X11-unix/X0
  4. trhodes Xwayland 2734 27 stream /tmp/.X11-unix/X0_
  5. trhodes Xwayland 2734 28 stream /tmp/.X11-unix/X0

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

  1. % Xwayland

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

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

由于使用显示零可用的活动 X 显示,环境变量设置不正确,要解决此问题,请将 DISPLAY 环境变量更改为 :0 并尝试再次执行应用程序。以下示例使用 mail/claws-mail 作为需要 Xwayland 服务的应用程序:

  1. export DISPLAY=:0

在此更改之后,mail/claws-mail 应用程序现在应该开始使用 Xwayland 并按预期运行。

5.10.5. 使用 VNC 的远程桌面

在本文档的前面部分提到,Wayland 不提供与 Xorg 提供的相同的 X 服务器样式访问。相反,用户可以自由选择远程桌面协议,例如 RDP 或 VNC。FreeBSD Ports 集合包括 wayvnc,它将支持基于 wlroots 的合成器,例如这里讨论的合成器。可以使用以下方式安装此应用程序:

  1. # pkg install wayvnc

与其他一些软件包不同,wayvnc 不附带配置文件。值得庆幸的是,手册页记录了重要的选项,并且可以将它们外推到一个简单的配置文件中:

  1. address=0.0.0.0
  2. enable_auth=true
  3. username=username
  4. password=password
  5. private_key_file=/path/to/key.pem
  6. certificate_file=/path/to/cert.pem

需要生成密钥文件,强烈建议使用它们来提高连接的安全性。调用时,wayvnc 会在 ~/.config/wayvnc/config 中搜索配置文件。这可以在启动服务器时使用 -C configuration_file 选项覆盖。因此,要启动 wayvnc 服务器,请发出以下命令:

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

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

5.10.6. Wayland 登录管理器

虽然存在多个登录管理器并且正在慢慢迁移到 Wayland,但一种选择是 x11/ly 文本用户界面 (TUI) 管理器。需要最少的配置,ly 将通过在系统初始化时显示登录窗口来启动 Sway、Wayfire 和其他。要安装 ly,请发出以下命令:

  1. # pkg install ly

会有一些配置提示出现,导入步骤是在 /etc/gettytab 中加入以下几行:

  1. Ly:\
  2. :lo=/usr/local/bin/ly:\
  3. :al=root:

然后修改 /etc/ttys 中的 ttyv1 行以匹配以下行:

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

系统重新启动后,应该会出现登录信息。配置特定设置,例如语言并编辑 /usr/local/etc/ly/config.ini。至少,该文件应具有先前在 /etc/ttys 中指定的指定 tty。 注意 如果将 ttyv0 设置为登录终端,可能需要按 altF1 键才能正确看到登录窗口。 当登录窗口出现时,使用左右箭头将在不同的、受支持的窗口管理器之间进行交换。

5.10.7. 实用工具

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

  1. # pkg install pavucontrol waybar

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

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

lalauncher 实用程序为各种应用程序提供了一个启动栏。软件包没有提供示例配置文件,因此必须采取以下措施:

  1. mkdir ~/.config/lavalauncher

仅包含 Firefox 的示例配置文件位于右侧,如下所示:

  1. global-settings {
  2. watch-config-file = true;
  3. }
  4. bar {
  5. output = eDP-1;
  6. position = bottom;
  7. background-colour = "#202020";
  8. # Condition for the default configuration set.
  9. condition-resolution = wider-than-high;
  10. config {
  11. position = right;
  12. }
  13. button {
  14. image-path = /usr/local/lib/firefox/browser/chrome/icons/default/default48.png;
  15. command[mouse-left] = /usr/local/bin/firefox;
  16. }
  17. button {
  18. image-path = /usr/local/share/pixmaps/thunderbird.png;
  19. command[mouse-left] = /usr/local/bin/thunderbird;
  20. }