电源/锁屏/显示全链架构与精简 verdict(2026-11-04)
起因:锁屏 greeter 常驻 304M 且杀后 15 秒复活;回溯发现与睡眠/熄屏/锁屏超时时序错位有关。遂把 nix 侧电源、锁屏、显示三条线全扫一遍,确认哪些机制多余、哪些拿不掉。
结论一句话:没有整块可砍的纯多余模块;一切怪象的共同源头是锁屏超时与熄屏超时的时序错位,对齐一次顶得上删三个模块。
全链架构图(nix 持久化部分)
开机 → 登录 → 桌面 → 睡眠/唤醒 → 锁屏 全链(nix 持久化部分)
═══════════════════════════════════════════════════════════════
[固件层] xorboot 当门(顶掉 Win ESP)→ systemd-boot 菜单
└─ boot-menu-names:世代名 ↔ 启动菜单标题
[内核层] hardware-configuration + kernel + boot-misc-initrd-modules
└─ resume/swap 已退役(hibernate 模块整体停用,只留文件备查)
[显卡模式] gpu-mode:host/直通开关(状态在 /var/lib 下,重启生效)
├─ 780M:gpu-amd-780m-mst-bpc(MST 带宽硬约束 21.6G → 6bpc 三钩子重放)
├─ 4060 eGPU:thunderbolt(bolt 鉴权)+ 4060-egpu + boot-probe
└─ EDID pin:display-lenovo-p27h-edid-pin(断 DDC 重读环路)
[登录] displayserver:SDDM + 默认 X11(Wayland 下输入法 Rime 不可用)
└─ 指纹 CS9711:PAM 挂 login + SDDM/kde
[桌面本体] plasma(天气部件 activation 移除)+ kwin(by_focus 窗口规则)
└─ KScreen 原生:布局记忆按「连接集合哈希」存
[自研三件套] ── 全部事件驱动,零轮询
├─ guard(kscreen-layout-guard):锁屏/RandR 事件 → 快照+停 KScreen → 亮屏校验
├─ replay(kscreen-layout-replay):构成变了 → 按意图摆位(含 rotation)
└─ dpms-nudge(power-awake-dpms):唤醒后 X 全局关→开(不搬布局)
[睡眠] power-sleep-close(统一管理:logind 策略+唤醒位+快照重放)
├─ force(激进两段式):合盖最高指令 → quiesce 清场 → 看门狗(D-state 抢救)
├─ wifi:power-sleep-wifi(睡前 rmmod iwlwifi,醒后装回)
└─ hibernate:已退役(整晚零作用)
[锁屏] kscreenlocker Timeout=25min(2026-11-04 由 35 改到熄屏 30min 之前)+ 指纹 PAM
[竖屏] 无独立模块 = powerdevil 熄屏(AC 30min / 电池 8min)+ replay 的 rotation 意图恢复
锁屏三件套机制(半锁根因,已断根 2026-11-04)
- ksmserver(会话管家)→ kscreenlocker(锁屏守护,常驻,养状态机 unlocked/locked)→ kscreenlocker_greet(锁屏界面,按需起)
- 正常一轮:超时/合盖/睡眠唤醒 → 守护切 locked → greet 起 → 输密码 → greet 退 → 落回 unlocked
- 实测半锁:ScreenSaver GetActive=true 持续 2.4 小时,loginctl 侧 LockedHint=no —— 守护自认锁着,系统层认为正常用,greet 常驻收 304M
- 杀不掉的原因:守护手里攥着 locked,看门狗 15 秒拉起新的。断根不是杀 greet,是让守护自己下班
- 关键纠偏:本机有两个会话——会话 1 是 systemd-user 管理会话(leader 为 systemd --user,动不得),会话 3 才是 seat0/tty2 图形会话;unlock 必须打会话 3
- 断根实操:loginctl unlock-session 3 → GetActive=false、greet 退出、25 秒复查无复活。qdbus SetActive false 对半锁无效(守护不认),unlock-session 才是正路
逐项 verdict
拿不掉(硬件/驱动级刚需)
- bpc6 三钩子:带宽数学摆着(3×2K60@8bpc=101% 点不亮第三台),砍了当晚复现
- EDID pin:断驱动层 DDC 重读环路(锁屏→重读 EDID→重放布局→亮屏→再熄的循环),日志级实证
- wifi 睡眠重置、bolt 鉴权、gpu-mode 机制层:同理均为刚需
退役正确
- hibernate 全套:s2idle 之夜 freezer 连 hibernate 一起挡,转存零作用,注释保留备查即可
并存有理(guard + replay)
- 分工真实:防闪 vs 摆位,不是重复。解决的是 KScreen 原生记忆在 MST flap / 连接器重编号 / 同 EDID 双线下认不出场景
- EDID pin 落地后 flap 源头少了一个;拓扑稳定后触发频率自然降到接近零,届时可停一个观察。现在不停
真正的嫌疑人:超时时序错位(非模块多余)
- 锁屏 35min vs 熄屏 30min(AC):屏先灭 → MST 下游 flap → 锁 → 半锁。已改:锁 25min、灭 30min(先锁后灭)
- 竖屏超时断开+唤醒激活无独立模块,是 powerdevil 熄屏 + replay 恢复的组合行为,与上一条同源
- sleep-force 看门狗:为 kio-fuse D-state 历史夜晚而建;fuse 用得少可降级,但合盖必睡裁定不变,先留
已执行(2026-11-04)
- ✅ kscreenlockerrc Timeout 35 → 25(kwriteconfig6, Blum 先锁后灭)
- ✅ loginctl unlock-session 3 清半锁,GetActive=false、greet 退出、25 秒无复活
- ☐ 观察项:下次超时/睡眠唤醒后复查 GetActive 与 greet 是否干净(若再半锁,嫌疑转 powerdevil 熄屏事件)
记录时间:2026-11-04 · 数据来源:本机模块头注释实读 + ScreenSaver/loginctl 实测