本文档详细记录了在 Arch Linux 系统下,使用 Niri(Wayland 合成器)时遇到的 Xwayland 应用程序(如微信)无法启动及光标过大问题的完整排查与修复过程。
1. 问题描述
现象 A:X11 应用无法启动
- 症状:尝试启动微信(或其他 X11 应用)失败。
- 报错信息:
Authorization required, but no authorization protocol specified xhost: unable to open display ":0" - 环境:
- OS: Arch Linux
- Compositor: Niri (Wayland)
- Package:
wechat(AUR) /wechat-bin
现象 B:鼠标光标异常巨大
- 症状:应用启动后,当鼠标移动到 Xwayland 窗口内时,光标变得非常大,与系统其他部分不一致。
2. 根本原因分析
2.1 启动失败原因 (Authorization required)
原因:Niri 作为一个极简的 Wayland 合成器,其内置的 Xwayland 支持可能不如 GNOME/KDE 那样全自动处理XAuthority 认证。
什么是 XAuthority 认证?
X Window System 设计了一个基于 “Cookie” 的安全机制来防止未经授权的程序连接到你的显示服务器(并监听你的键盘输入或截屏)。
- Magic Cookie: 当 X Server(在此场景下是 Xwayland)启动时,它会生成一个随机的 “Magic Cookie”(一串加密数据)。
- 存储文件: 这个 Cookie 会被写入到一个文件中(通常是
~/.Xauthority或/run/user/1000/gdm/Xauthority)。 - 连接验证: 当任何 X11 客户端(如微信)尝试连接显示服务器时,它必须读取这个文件,并将里面的 Cookie 发送给服务器进行验证。只有 Cookie 匹配,连接才会被接受。
在我们的故障中:
- Xwayland 启动了,也监听了
:0端口。 - 但由于 Niri 的环境配置问题,它没有将生成的 Cookie 文件路径通过
XAUTHORITY环境变量告知给用户会话(Shell)。 - 因此,当我们在终端运行
wechat时,微信找不到 Cookie 文件,只能向服务器发送空凭证。 - X Server 发现凭证无效,直接拒绝连接,抛出错误:
Authorization required, but no authorization protocol specified。
2.2 光标过大原因
原因:Wayland 和 X11 使用不同的机制来处理光标。
- 在 Wayland 下,合成器负责绘制光标。
- 但在 Xwayland 窗口内,X11 应用负责绘制光标。
- 如果没有专门的设置守护进程(Settings Daemon)来同步 Wayland 的光标设置(大小、主题)到 X11,Xwayland 应用就会回退到默认设置(通常是巨大的默认光标或错误缩放)。
3. 详细排查步骤 (Troubleshooting)
步骤 1: 确认 Xwayland 基础状态
首先检查系统是否具备运行 X11 应用的基础能力。
# 1. 检查 Xwayland 二进制文件whichXwayland# 2. 检查进程是否运行psaux|grepXwayland# 3. 检查环境变量echo$DISPLAYecho$WAYLAND_DISPLAY结果:DISPLAY=:0存在,Xwayland 进程存在,但应用依然无法连接。
步骤 2: 验证 X11 连接性
尝试使用简单的工具连接 X Server。
# 安装 xorg-xhost (如果未安装)sudopacman-Sxorg-xhost# 尝试连接xhost结果:报错Authorization required, but no authorization protocol specified。确认为权限/认证问题。
步骤 3: 检查 Niri 配置
查看 Niri 是否开启了 Xwayland 支持。
cat~/.config/niri/config.kdl发现:配置文件中虽然有xwayland选项,但在某些 Niri 版本或特定环境下,原生支持可能不够完善或缺乏 XAuth 管理。
4. 修复方案 (Fix Steps)
我们采用了xwayland-satellite配合xsettingsd的组合方案。这是 Niri 官方推荐的最佳实践。
- xwayland-satellite: 一个独立的 Xwayland 管理器,能更好地处理 XAuth 和生命周期。
- xsettingsd: 一个轻量级的 X11 设置守护进程,用于同步主题和光标大小。
4.1 修复启动问题 (部署 xwayland-satellite)
1. 安装 xwayland-satellite
由于该包在 Arch 的extra仓库或 AUR 中。
# 确保使用正确的代理(如果需要)exporthttp_proxy=http://127.0.0.1:7890exporthttps_proxy=http://127.0.0.1:7890# 安装yay-Sxwayland-satellite2. 配置 Niri 自动启动
编辑 Niri 配置文件~/.config/niri/config.kdl,在启动部分添加:
// 启动时自动运行 satellite spawn-at-startup "xwayland-satellite"4.2 修复光标过大问题 (部署 xsettingsd)
1. 安装 xsettingsd
yay-Sxsettingsd2. 创建配置文件
创建~/.xsettingsd文件,强制指定光标主题和大小。
注意:Gtk/CursorThemeSize通常设为 24,如果觉得大可以设为 16。
# 编辑 ~/.xsettingsdGtk/CursorThemeName"Adwaita"Gtk/CursorThemeSize16Xft/Antialias1Xft/Hinting1Xft/HintStyle"hintfull"Xft/RGBA"rgb"3. 配置 Niri 自动启动
同样在~/.config/niri/config.kdl中添加:
spawn-at-startup "xsettingsd"4.3 应用更改
完成上述配置后,重启 Niri 会话(或重启系统)是应用更改最稳妥的方式。
重启后:
xwayland-satellite会自动接管 X11 支持(通常监听:1)。xsettingsd会在后台广播正确的光标设置。- 微信等 X11 应用即可正常启动且光标大小正常。
5. 总结
在 Niri 这种非桌面环境(DE)的独立合成器下运行 X11 应用,不能依赖 GNOME/KDE 那样的“开箱即用”魔法。我们需要显式地组装组件:
- 连接层:用
xwayland-satellite替代/增强原生的 Xwayland 支持,解决认证问题。 - 配置层:用
xsettingsd解决 X11 应用的主题和光标不一致问题。