5.1 KiB
2026-11-03 显示器关屏再开后云桌面变矮:修复与验收
已在 armbian@192.168.1.188 部署。用户现场关闭显示器、等待后重新打开,确认“已自动恢复全屏”。修复过程没有重启盒子,也没有重启或重连 Moonlight。
原因与证据
- 异常时盒子 HDMI 输出为 1920×1440@75Hz(4:3),Windows/Moonlight 视频为 2560×1440(16:9)。
- Moonlight 全屏窗口跟随盒子变为 1920×1440,视频保持宽高比,因此视频内容为 1920×1080,上下各有约 180 像素黑边,表现为“宽度一样,高度矮了一点”。异常截图见
evidence/display-resume-20261103/before.png。 - MATE 的
~/.config/monitors.xml还保存着 HDMI-1 的 1920×1440@75Hz 配置;原启动脚本只在启动时设置一次 2K,没有处理后续热插拔和模式回退。 - 显示器 EDID 的 241.70MHz 时序仍不适用于此 RK3528 vendor PHY;沿用此前已验证的 297MHz 定制 2K 时序,不切回该原厂时序。
修改
- 新增
terminal/kiosk-shell/scripts/vdi-display-guard:每 2 秒检查 XRandR 状态,模式异常持续至少 2 秒后恢复2560x1440_60_fixed297。模式已存在时不重复创建,热插拔后丢失关联时重新关联。 - 健康状态只查询,不反复设置分辨率;显示器断开或 X11 尚不可用时等待,不强设;设置失败按 2/4/8/16/32/60 秒退避,并在设置后重新读取验证。XRandR 每条命令有 10 秒超时。
- 新增用户级
vdi-display-guard.service,已启用default.target自启、异常退出重启;使用文件锁防止启动恢复与常驻守护竞争。服务独立受 systemd 管理,不挂无主后台循环。 vdi-kiosk-start使用相同恢复程序做启动检查,再确保服务运行;保留此前渲染配置解析及单一 kiosk 启动链。- 将本机已知显示器(HDMI-1,GWR/0x2708)的旧保存布局改为 2560×1440@60,其余布局不改。部署前保存原文件。
- 新增只部署显示修复的
tools/deploy_display_guard.sh;完整deploy_kiosk.sh也接入该步骤,避免下次部署覆盖修复。此次只执行前者,未执行会停止串流的完整部署。
时序仍为:
297.00 2560 2608 2640 2720 1440 1443 1448 1820 +HSync -VSync
本次仅调整盒子本地显示,不修改 Windows、Sunshine、GPU、远程光标或已有硬解参数。
验收
| 项目 | 结果 |
|---|---|
| 自动化显示恢复场景 | 9/9 通过:正常不写、断开/重连、首次创建、重新关联、晚到覆盖、失败退避、设置结果校验、X11 暂不可用等 |
| 盒子 CTest | 3/3 通过:display-guard、moonlight-session、desktop-list-page |
| 连续两次主动回退 1920×1440@75 | 均自动恢复 2560×1440,全屏窗口恢复 2560×1440,单次从发起切换到观测恢复约 14 秒(含两次驱动切换耗时) |
| 真实显示器电源循环 | 用户确认自动恢复全屏;日志在 10:03:19 检测断开,10:03:31 检测到正确 2K 模式,无需额外模式设置 |
| 会话连续性 | Moonlight PID 始终为 66385,窗口始终为 44040203;模拟测试前后 boot ID 不变;服务未发生异常重启 |
| 最终现场 | 2026-11-03 10:04,HDMI 2560×1440 约 60Hz,Moonlight 窗口 2560×1440,守护 active/enabled |
原始测试输出:evidence/display-resume-20261103/recovery-test.txt。最终模式、进程及包含真实关屏过程的日志:evidence/display-resume-20261103/final-state.txt。真实开屏后的截图:evidence/display-resume-20261103/after-power-cycle.png。
这是当前这一台盒子与显示器的现场验收,未执行隔夜或多型号显示器测试。守护固定针对当前单 HDMI、2K、Xorg POC;以后换不同显示器或迁移到 Weston/Wayland 时需改为对应的输出配置机制。当前修复不代表服务端 Code43、帧率或鼠标动态残影问题已解决。
运维
Windows 开发机在 Git Bash 中只部署此修复:
bash tools/deploy_display_guard.sh
盒子上查看状态与日志(当前环境 journalctl --user 看不到用户服务日志,因此使用系统日志的用户单元过滤):
systemctl --user status vdi-display-guard.service
sudo -n journalctl _SYSTEMD_USER_UNIT=vdi-display-guard.service -n 50 --no-pager
DISPLAY=:0 XAUTHORITY=/home/armbian/.Xauthority xrandr --query
本次部署备份目录为 /home/armbian/vdi-terminal/backups/display-guard-20261103-095920/,包含原 vdi-kiosk-start 和原 monitors.xml。必要时可回退到原行为;这也会恢复旧的 4:3 保存布局和“仅启动时修复”的限制:
systemctl --user disable --now vdi-display-guard.service
cp -p ~/vdi-terminal/backups/display-guard-20261103-095920/vdi-kiosk-start ~/vdi-terminal/bin/vdi-kiosk-start
cp -p ~/vdi-terminal/backups/display-guard-20261103-095920/monitors.xml ~/.config/monitors.xml
rm -- ~/.config/systemd/user/vdi-display-guard.service
systemctl --user daemon-reload
日常操作:盒子保持开机,显示器可正常关开。若 HDMI 模式确实回退,给驱动和恢复程序约 15 秒完成切换,无需为此重启盒子。