WSLg `[WARN:COPY MODE]` 空白窗口排查

WSLg 应用出现企鹅任务栏图标、灰色空白窗口和 [WARN:COPY MODE] 时,定位 shared_memory 与 gfxredir 并恢复 Weston 图形通道。

#type / debug #status / growing #tech / ops #resource / wsl #resource / electron #platform / linux #platform / windows

[!info] related notes

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_gfxredir0 恢复到 1

修复

本机使用了一个自动修复 helper:

~/.local/bin/wslg-fix-copy-mode

核心逻辑:

  1. /mnt/wslg/weston.log 读取最新 use_gfxredir
  2. 如果已经是 1,直接退出;
  3. 如果不是 1,确认 /mnt/shared_memory 存在并可挂载;
  4. 重启 WSLg system distro 中的 Weston;
  5. 等待日志重新出现 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 时,可以在启动应用前自动恢复,而不是等到灰色窗口出现后人工排查。

创建于 2026/8/18 更新于 2026/8/18