WSLg `[WARN:COPY MODE]` 空白窗口排查
WSLg 应用出现企鹅任务栏图标、灰色空白窗口和 [WARN:COPY MODE] 时,定位 shared_memory 与 gfxredir 并恢复 Weston 图形通道。
[!info] related notes
- 相关 howto: obsidian-wslg-rime-ice-setup
- 相关 MOC: obsidian-moc
- 相关资源: wsl、obsidian
WSLg [WARN:COPY MODE] 空白窗口排查
现象
WSLg 应用已经创建窗口,但 Windows 任务栏里只看到企鹅图标或灰白预览,实际窗口无法正常展示或交互。窗口标题可能带:
[WARN:COPY MODE]
在 Obsidian 场景中,进程本身仍然存在,Windows 侧也可能显示 Responding=True,所以这不是普通的应用崩溃。
快速判断
先看 WSLg 的 Weston 日志:
grep -iE 'shared_memory|use_gfxredir|rdp_allocate_shared_memory' \
/mnt/wslg/weston.log | tail -n 80
故障时曾观察到:
WSL2_SHARED_MEMORY_MOUNT_POINT=/mnt/shared_memory
rdp_allocate_shared_memory: Failed to open ... Input/output error
RDP backend: use_gfxredir = 0
健康状态应看到最新一条:
RDP backend: use_gfxredir = 1
use_gfxredir=0 表示 WSLg RDP backend 没有进入共享内存图形重定向通道,而退化到 copy mode。
根因
本次问题的直接证据是 /mnt/shared_memory 通道初始化失败,导致 Weston 启动时将 use_gfxredir 设为 0。后续即使 Obsidian、Electron renderer 和窗口对象都正常存在,Windows 侧也只能看到 copy-mode 的异常表面。
日志中还可能同时出现:
Xwayland glamor: GBM Wayland interfaces not available
Failed to initialize glamor, falling back to sw
这些 XWayland/GPU fallback 是辅助信号,但本次真正改变结果的是把 use_gfxredir 从 0 恢复到 1。
修复
本机使用了一个自动修复 helper:
~/.local/bin/wslg-fix-copy-mode
核心逻辑:
- 从
/mnt/wslg/weston.log读取最新use_gfxredir; - 如果已经是
1,直接退出; - 如果不是
1,确认/mnt/shared_memory存在并可挂载; - 重启 WSLg system distro 中的 Weston;
- 等待日志重新出现
use_gfxredir = 1。
关键步骤的等价命令如下:
/mnt/c/Windows/System32/wsl.exe \
-d "${WSL_DISTRO_NAME:-Ubuntu-24.04}" \
-u root -- bash -lc '
mkdir -p /mnt/shared_memory
if ! mountpoint -q /mnt/shared_memory; then
mount -t tmpfs -o mode=1777 tmpfs /mnt/shared_memory
fi
chmod 1777 /mnt/shared_memory
'
然后让 WSLg system distro 里的 WSLGd 重新拉起 Weston:
/mnt/c/Windows/System32/wsl.exe --system -e sh -lc '
old=$(pgrep -x weston | head -n1 || true)
if [ -n "$old" ]; then kill "$old"; fi
'
如果不希望针对 Weston 做定向重启,也可以在关闭重要 WSL 工作后,用 wsl --shutdown 做完整重启;代价是会同时停止该发行版里的后台服务。
为什么修复有效
Weston 只在启动阶段决定是否启用 gfxredir。即使后来 /mnt/shared_memory 已经恢复,原先那个 Weston 进程仍会继续保持:
use_gfxredir = 0
因此“补挂载”之后必须让 Weston 重新初始化。修复成功时日志会从:
use_gfxredir = 0
变为:
use_gfxredir = 1
同时 Windows 窗口标题中的 [WARN:COPY MODE] 消失,窗口内容恢复正常。
回归验证
# 图形通道
grep -E 'RDP backend: use_gfxredir = [01]' /mnt/wslg/weston.log | tail -n 1
# Obsidian 窗口
/mnt/c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe \
-NoProfile -Command \
"Get-Process msrdc -ErrorAction SilentlyContinue | Where-Object { \$_.MainWindowTitle -like '*Obsidian*' } | Select-Object MainWindowTitle,Responding"
健康时应满足:
- 最新
use_gfxredir = 1; - Obsidian 标题不再包含
[WARN:COPY MODE]; - Windows 侧窗口
Responding=True; - 窗口可正常显示与交互。
预防
把 wslg-fix-copy-mode 放在 GUI 应用 wrapper 之前执行:
obsidian
→ wslg-fix-copy-mode
→ fcitx5-wslg
→ /opt/Obsidian/obsidian
这样 WSLg 再次异常进入 copy mode 时,可以在启动应用前自动恢复,而不是等到灰色窗口出现后人工排查。