问题概述
系统:cachyos kde桌面
用笔记本的时候(运行了rustdesk),由于系统开了空闲15分钟自动睡眠,空闲睡眠后发现电脑无法唤醒,鼠标键盘都无法唤醒,屏幕黑屏只有电源灯还亮着。
于是乎,请claude code老祖出山
日志证据
看日志内核在 13:47:43 打印 PM: suspend entry (deep) 后,仅跟了一句 Filesystems sync,之后便再无任何日志输出。这是因为 CPU 卡在 S3 入睡流程中发生死锁(中断已关闭,无法写入日志、无法响应输入)。机器从未真正进入睡眠状态,因此电源灯持续亮着,键盘鼠标无响应,只能强制断电重启。日志中不存在任何唤醒事件。
根因结论
RustDesk 运行期间睡眠 → 内核死锁
证据链(本次启动前一次 boot 的日志)
| 时间 | 事件 | 结果 |
|---|---|---|
| 12:50 / 12:51 | 两次睡眠(RustDesk 未运行) | |
| 13:32:29 | 唤醒 | - |
| 13:32:39 | RustDesk 启动 | - |
| 13:47:43 | 空闲睡眠(RustDesk 正在运行) |
当前启动中 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 独显笔记本的已知睡眠隐患
验证方法(安全实验)
按以下步骤可自行验证问题根因(无需执行任何修改):
- 完全退出 RustDesk(托盘右键退出,确认
pgrep rustdesk无输出) - 让系统空闲睡眠 → 若能正常唤醒 = 根因确认
- (可选)重新启动 RustDesk 后再次睡眠 → 大概率复现挂死(需强制重启,谨慎操作)
修复方案
方案一:行为规避(立即可用)
- 操作:睡眠前手动退出 RustDesk
- 理由:机器睡眠后无法远程连接,不影响日常使用
- 优点:零风险,即刻生效
方案二:标准 NVIDIA 修复(推荐,需重启)
- 启用
nvidia-suspend、nvidia-resume、nvidia-hibernate三个服务 - 内核参数添加
nvidia.NVreg_PreserveVideoMemoryAllocations=1 - 必要时在 mkinitcpio 中添加 nvidia 模块
- 需重启生效
方案三:恢复会话冻结(备选,需测试)
- 在
/etc/systemd/...创建覆盖 drop-in,将SYSTEMD_SLEEP_FREEZE_USER_SESSIONS改回true - CachyOS 社区有用户通过此方式修复挂死问题
- 注意:部分用户反馈可能存在唤醒延迟,需实际测试
- 建议使用
/etc覆盖而非直接修改/usr/lib中的软件包文件