欢迎光临
我们一直在努力

Arch Linux + Niri + Xwayland 故障排查与修复指南

本文档详细记录了在 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 二进制文件
    which Xwayland

    # 2. 检查进程是否运行
    ps aux | grep Xwayland

    # 3. 检查环境变量
    echo $DISPLAY
    echo $WAYLAND_DISPLAY

    结果:DISPLAY=:0 存在,Xwayland 进程存在,但应用依然无法连接。

    步骤 2: 验证 X11 连接性

    尝试使用简单的工具连接 X Server。

    # 安装 xorg-xhost (如果未安装)
    sudo pacman -S xorg-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 中。

    # 确保使用正确的代理(如果需要)
    export http_proxy=http://127.0.0.1:7890
    export https_proxy=http://127.0.0.1:7890

    # 安装
    yay -S xwayland-satellite

    2. 配置 Niri 自动启动

    编辑 Niri 配置文件 ~/.config/niri/config.kdl,在启动部分添加:

    // 启动时自动运行 satellite
    spawn-at-startup "xwayland-satellite"

    4.2 修复光标过大问题 (部署 xsettingsd)

    1. 安装 xsettingsd

    yay -S xsettingsd

    2. 创建配置文件

    创建 ~/.xsettingsd 文件,强制指定光标主题和大小。
    注意:Gtk/CursorThemeSize 通常设为 24,如果觉得大可以设为 16。

    # 编辑 ~/.xsettingsd
    Gtk/CursorThemeName "Adwaita"
    Gtk/CursorThemeSize 16
    Xft/Antialias 1
    Xft/Hinting 1
    Xft/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 应用的主题和光标不一致问题。
  • 赞(0)
    未经允许不得转载:171主机测评 » Arch Linux + Niri + Xwayland 故障排查与修复指南
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址