4. 显示服务器与合成器

在X11时代,显示服务器与窗口管理器是分离的:Xorg负责管理显卡、输入设备、屏幕与窗口的绘制资源,窗口管理器负责窗口边框、移动、层叠与焦点。到了Wayland,显示服务器与合成器合二为一,合成器直接管理输入、输出、窗口表面与渲染合成。理解这一变化,是迁移过程中最关键的认知转折。

核心原理:从“客户端-服务器”到“合成器即显示服务器”

Xorg采用典型的C/S架构:X客户端通过X协议与Xorg通信,Xorg将绘制请求转发给显卡,窗口管理器作为特殊客户端运行。这种架构灵活但路径长,输入事件、渲染、窗口管理分散在多个进程,容易产生撕裂、延迟与安全边界模糊。

Wayland则把合成器作为显示服务器:客户端通过Wayland协议直接与合成器交换缓冲区,合成器负责输入分发、窗口布局、渲染合成与输出管理。Mutter、KWin、Sway、Weston都是Wayland合成器,但定位不同:Mutter是GNOME的合成器,KWin是KDE Plasma的合成器,Sway是面向i3用户的平铺合成器,Weston是Wayland参考实现,常用于嵌入式与测试。

Xorg 与 Wayland 合成器:架构与启动路径对比 X11 / Xorg 架构 X 客户端 窗口管理器 Xorg 显示服务器 输入 / 输出 / 绘制资源 Wayland 合成器架构 Wayland 客户端 输入设备 合成器 = 显示服务器 输入 / 窗口 / 渲染 / 输出 典型启动流程与日志排查路径 显示管理器 GDM / SDDM / greetd 会话选择 Wayland / X11 合成器启动 Mutter / KWin / Sway 日志输出 journalctl / 会话日志 排查 定位失败点 关键日志:Xorg.0.log、~/.local/share/xorg/、journalctl -b、WAYLAND_DEBUG=1、sway -d、weston --log 配置入口:/etc/X11/xorg.conf.d、~/.config/sway/config、~/.config/kwinrc、gsettings、weston.ini

四大合成器对比:定位、配置与适用场景

Mutter、KWin、Sway、Weston虽然都实现Wayland协议,但设计目标差异明显。Mutter强调与GNOME Shell深度集成,配置多通过gsettings和扩展完成;KWin强调可定制性与KDE生态,配置集中在kwinrc和系统设置;Sway强调键盘驱动与平铺布局,配置文件为纯文本;Weston强调参考实现与嵌入式,配置以weston.ini为主。

合成器 所属桌面/定位 主要配置方式 典型日志/排查命令
Mutter GNOME gsettings、GNOME扩展 journalctl -b -u gdm、gnome-shell --wayland
KWin KDE Plasma kwinrc、系统设置 journalctl -b -u sddm、kwin_wayland --replace
Sway i3风格平铺 ~/.config/sway/config sway -d、swaymsg -t get_outputs
Weston 参考实现/嵌入式 weston.ini weston --log=debug、weston-info

启动流程:从显示管理器到合成器会话

典型Wayland会话启动路径为:显示管理器(GDM/SDDM/greetd)读取会话文件,选择Wayland会话,启动合成器进程,合成器初始化DRM/KMS、输入设备与输出,随后启动桌面组件。若合成器启动失败,显示管理器通常回退到X11会话,或在日志中留下明确错误。

# 查看当前会话类型
echo $XDG_SESSION_TYPE
loginctl show-session $(loginctl | awk '/tty/{print $1}') -p Type

# 查看合成器进程
ps -ef | grep -E 'mutter|kwin_wayland|sway|weston'

# 查看启动日志
journalctl -b --no-pager | grep -iE 'wayland|drm|kms|mutter|kwin|sway|weston'

配置方式:不同合成器的配置入口

Sway的配置最直观,直接编辑文本文件即可调整输出、输入、快捷键与窗口规则。KWin和Mutter更依赖桌面设置与gsettings,适合通过图形界面或命令行统一管理。Weston适合在嵌入式环境中通过weston.ini固定输出与外壳行为。

# Sway 输出配置示例
output HDMI-A-1 resolution 1920x1080@60Hz scale 1
input type:touchpad tap enabled

# KWin 查看配置
kwriteconfig5 --file kwinrc --group Compositing --key Enabled true

# Mutter 查看 Wayland 相关设置
gsettings get org.gnome.mutter experimental-features

# Weston 配置示例
[output]
name=HDMI-A-1
mode=1920x1080

日志排查:定位合成器启动失败与渲染异常

排查Wayland合成器问题,优先看三类日志:显示管理器日志、合成器自身日志、内核DRM/KMS日志。常见问题包括:DRM设备权限不足、输出模式不支持、输入设备未识别、GPU驱动不兼容、会话文件缺失。使用WAYLAND_DEBUG=1可观察协议交互,使用sway -d或weston --log=debug可提高日志级别。

排查顺序建议:先确认会话类型是否为Wayland,再确认合成器进程是否存活,然后检查DRM/KMS与输入设备,最后查看合成器日志中的具体错误。若合成器崩溃,可尝试切换到X11会话对比,快速判断是驱动问题还是会话配置问题。

常见误区:把Xorg的xorg.conf直接套用到Wayland合成器上。Wayland合成器通常不读取xorg.conf,输出与输入配置需通过合成器自身配置或桌面设置完成。另一个误区是忽略显示管理器会话文件,导致Wayland会话根本未出现在登录界面。

案例复盘:Sway启动黑屏的排查过程

某开发者在虚拟机中安装Sway后启动黑屏。排查步骤:首先确认会话类型为Wayland,然后查看journalctl发现DRM设备初始化失败,提示“failed to open /dev/dri/card0”。进一步检查发现用户不在video组,且虚拟机未启用3D加速。将用户加入video组并启用虚拟机3D加速后,Sway正常启动。该案例说明:Wayland合成器对DRM/KMS与GPU驱动依赖更直接,权限与驱动问题会直接表现为黑屏。

迁移到Wayland不是简单替换显示服务器,而是理解合成器如何接管输入、输出、窗口与渲染。掌握Mutter、KWin、Sway、Weston的定位差异、启动路径、配置入口与日志排查方法,才能在迁移过程中快速定位问题并稳定落地。