电源/锁屏/显示全链架构与精简 verdict

电源/锁屏/显示全链架构与精简 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 实测