笔记本自动睡眠后无法唤醒及解决方案

问题概述

系统:cachyos kde桌面
用笔记本的时候(运行了rustdesk),由于系统开了空闲15分钟自动睡眠,空闲睡眠后发现电脑无法唤醒,鼠标键盘都无法唤醒,屏幕黑屏只有电源灯还亮着。
于是乎,请claude code老祖出山

日志证据

看日志内核在 13:47:43 打印 PM: suspend entry (deep) 后,仅跟了一句 Filesystems sync,之后便再无任何日志输出。这是因为 CPU 卡在 S3 入睡流程中发生死锁(中断已关闭,无法写入日志、无法响应输入)。机器从未真正进入睡眠状态,因此电源灯持续亮着,键盘鼠标无响应,只能强制断电重启。日志中不存在任何唤醒事件。

根因结论

RustDesk 运行期间睡眠 → 内核死锁

证据链(本次启动前一次 boot 的日志)

时间 事件 结果
12:50 / 12:51 两次睡眠(RustDesk 未运行) :white_check_mark: 均正常唤醒
13:32:29 唤醒 -
13:32:39 RustDesk 启动 -
13:47:43 空闲睡眠(RustDesk 正在运行) :cross_mark: 挂死,强制重启

当前启动中 RustDesk 仍在运行(PID 4534),与你描述的"每次都这样"完全吻合。


死锁成因:三个因素叠加

1. CachyOS 的 NVIDIA 包禁用了睡眠前冻结用户会话

  • 配置文件:/usr/lib/systemd/system/systemd-suspend.service.d/10-nvidia-no-freeze-session.conf
  • 设置内容:SYSTEMD_SLEEP_FREEZE_USER_SESSIONS=false
  • 背景:systemd 256 起默认冻结会话,但 NVIDIA 睡眠/唤醒因此出问题,NVIDIA 打包方主动关闭(非用户配置,因此你之前未找到此设置)
  • 副作用:睡眠时 KWin 合成器和 RustDesk 仍在活跃运行

2. RustDesk 持续占用 GPU

  • RustDesk 作为远程桌面工具,持有屏幕采集功能,通过 KWin 持续渲染 GPU
  • 睡眠时,NVIDIA 驱动的挂起回调需等待 GPU 空闲
  • 但因 RustDesk 持续采集/渲染,GPU 无法进入空闲状态 → 死锁
  • 这解释了为什么 RustDesk 启动前睡眠正常,启动后必挂

3. NVIDIA 官方推荐的睡眠服务全部未启用

服务 状态
nvidia-suspend disabled
nvidia-resume disabled
nvidia-hibernate disabled
  • 驱动参数 PreserveVideoMemoryAllocations: 2(自动模式)因服务未启用而实际未生效
  • 这是 GTX 16 系及更新 NVIDIA 独显笔记本的已知睡眠隐患

验证方法(安全实验)

按以下步骤可自行验证问题根因(无需执行任何修改):

  1. 完全退出 RustDesk(托盘右键退出,确认 pgrep rustdesk 无输出)
  2. 让系统空闲睡眠 → 若能正常唤醒 = 根因确认
  3. (可选)重新启动 RustDesk 后再次睡眠 → 大概率复现挂死(需强制重启,谨慎操作)

修复方案

方案一:行为规避(立即可用)

  • 操作:睡眠前手动退出 RustDesk
  • 理由:机器睡眠后无法远程连接,不影响日常使用
  • 优点:零风险,即刻生效

方案二:标准 NVIDIA 修复(推荐,需重启)

  • 启用 nvidia-suspendnvidia-resumenvidia-hibernate 三个服务
  • 内核参数添加 nvidia.NVreg_PreserveVideoMemoryAllocations=1
  • 必要时在 mkinitcpio 中添加 nvidia 模块
  • 需重启生效

方案三:恢复会话冻结(备选,需测试)

  • /etc/systemd/... 创建覆盖 drop-in,将 SYSTEMD_SLEEP_FREEZE_USER_SESSIONS 改回 true
  • CachyOS 社区有用户通过此方式修复挂死问题
  • 注意:部分用户反馈可能存在唤醒延迟,需实际测试
  • 建议使用 /etc 覆盖而非直接修改 /usr/lib 中的软件包文件

何意味