服务:睡眠合盖最高指令

合盖睡眠失败 → 激进两段式睡眠(2026-10-29)

1. 故障(19:11 桌面全卡死)

  • 19:06:41 拔电,lid-inhibit-ac 释放;19:09:24 合盖,19:09:28 开盖想改超时设置。
  • 19:09:41 开盖 13 秒后系统仍硬睡:Failed to freeze unit 'user.slice': Connection timed out,内核冻用户进程 20 秒超时(9 个 KIO::WorkerThread D-state,全卡 fuse_send_open,即 Dolphin 缩略图 + sftp 经 kio-fuse)。
  • 19:10:01 Failed to put system to sleep. Device or resource busy,resume 后半死不活 → 所有文件操作排队等 KIO,全卡死。20:23 重启恢复。
  • 改电池 60→15 分钟无用:走的是合盖 suspend,不走 idle 超时;且同样会被 kio-fuse 顶回。

2. 用户裁定(逐条,已落地)

  1. 合盖 / 手动睡 = 最高指令,一切 inhibitor 让路,后果用户承担。
  2. 睡前正常收拾(弹窗一律 yes 代答),10 秒还没睡进去则强制 echo mem > /sys/power/state。
  3. D-state 冻之前杀 kio-fuse 本体可解(等的拿 EIO 散场);冻上之后无解,只能等 20 秒超时。
  4. 残留风险出了再修,不预支复杂度。另:一次打一补丁不可持续,要收敛的健壮逻辑。

3. 落地(/etc/nixos,main a0ebb0b,两次 rebuild 当场验证)

3.1 新模块 modules/system/service/sleep-aggressive.nix

  • LidSwitchIgnoreInhibited=yes(合盖无视一切锁)、InhibitDelayMaxSec=5(delay 锁封顶)、HoldoffTimeoutSec=5s(5 秒内开盖取消,杜绝 19:09 式开盖后仍硬睡)。
  • sleep-quiesce(powerDownCommands 追加,总预算 <8s):loginctl lock-sessions → 杀 thumbnail waiter(TERM→KILL)→ 杀 kio-fuse 本体 + 懒卸载残留 → timeout 3 sync。
  • 10 秒看门狗(后台 fork,三重护栏:时间跳跃 / sleep.target 激活中 / suspend.target 仍激活则不强制),到点仍醒着则强制 echo mem。freezer/驱动 veto 仍绕不过(认)。

3.2 冗余退役(logind.nix,注释标桩,git 可查)

  • 删除 lid-inhibit-ac / lid-inhibit-battery 两服务 + 交直流切换 udev 触发两行:LidSwitchIgnoreInhibited=yes 下一切 handle-lid-switch 锁对合盖失效,留着空转。
  • HandleLidSwitchDocked: suspend → ignore:合盖+外接屏(书房/办公室)改由原生表达不睡;裸机合盖任何供电一律睡。注意:电池+docked 合盖由"睡"变"不睡",要改回只翻这一行。

4. 验证

  • /etc/systemd/logind.conf 实测含 LidSwitchIgnoreInhibited=yes / HoldoffTimeoutSec=5s / InhibitDelayMaxSec=5 / HandleLidSwitchDocked=ignore;sleep-quiesce 已在 PATH;lid-inhibit 两单元已消失;systemctl --failed 为空。
  • 未实测:真合盖睡眠全流程(等用户日常使用验证);/var/log/sleep-quiesce.log 首次睡眠后才有。

5. 台账

诊断原文:docs/sleep-freeze-20261029-lid-kio-fuse.md;本次改动已追记该文 §6。