起因:开机摸到的热度
那天早上我打开笔记本,开机瞬间 sensors 报出来一个让人手心发凉的数字——CPU 最高 91°C。问题是,我昨晚明明关机了。一台关了机的笔记本,放了一晚上,内部温度居然还在 91°C。这不是物理学能解释的余热。
我的硬件配置是个相对前沿的组合:
- 双系统:Windows + Ubuntu 26.04
- RTX 5070(Blackwell 架构)
- 独显直连,内部屏幕直接挂在 N 卡上
- 用 rEFInd 引导,不是 GRUB
- 用
nvidia-driver-595-open+ CUDA 13.1 - 主要工作负载是在多机集群上跑 llama.cpp 分布式推理
这个组合在 2026 年初的 Linux 上属于「踩坑重灾区」——RTX 50 系是新硬件,驱动还在演化;内核 7.0 是新内核;Ubuntu 26.04 是新系统。叠加起来,怎么折腾都不奇怪。
漫长的调试过程
第一阶段:锁定嫌疑对象
最初的怀疑很直接:是不是根本没关机,只是黑屏?但出风口没风、电源灯灭了。而开机瞬间 91°C 不是物理余热——这是内部核心的当前温度,说明有什么东西整夜都在通电运行。
搜了一圈,社区里有个非常匹配的已知问题:RTX 50 系 Blackwell + Linux 7.0 内核,nvidia-open 驱动在关机流程中会挂死。屏幕黑了像是关机了,但 GPU 实际没断电,整机持续发热。这个 bug 在 NVIDIA 开源驱动 GitHub 上有 issue #1117,两个版本 580.142 和 595.58.03 都复现。
第二阶段:发现 systemd 循环依赖
看关机日志,发现报错:
sysinit.target: Found ordering cycle:
nvidia-persistenced.service/stop after
systemd-backlight@backlight:nvidia_0.service/stop after
sysinit.target/stop - after nvidia-persistenced.service
Found ordering cycle 是 systemd 的死锁警告——A 等 B 停、B 等 A 停。systemd 强行打破,但后续整个关机流程进入混乱状态,没执行到真正断电。
同时还发现日志里有 USB 错误,追查发现是劣质 USB 防尘塞——里面有金属触点,被系统当成幻影设备反复尝试枚举,拖慢关机流程。拔掉。
第三阶段:找到 NVIDIA 官方 service 文件的 bug
调试循环依赖时,看了 nvidia-persistenced 的完整配置:
# /usr/lib/systemd/system/nvidia-persistenced.service
StopWhenUnneeded=true
Before=systemd-backlight@backlight:nvidia_0.service
这是 NVIDIA 官方写的 service 文件,两条配置自相矛盾:
StopWhenUnneeded=true:当没有服务需要它时自动停止Before=systemd-backlight@backlight:nvidia_0.service:但 backlight 服务依赖它,所以它永远“被需要”
死循环就从这里来。同时还发现自己写的 brightness.service 在关机时调用 save-brightness.sh 读 nvidia 设备,也在加剧这个循环依赖。
第四阶段:修复 systemd 层
针对这些问题做了一系列修复:覆盖 NVIDIA 官方 service 文件的两条有毒配置;把亮度服务改造成用 udev 实时保存而不是关机时保存;清理了 3.9G 的 journal 日志。
修复后关机日志走完了完整流程:
Reached target poweroff.target - System Power Off.
Shutting down.
Journal stopped
systemd 层修好了——但第二天早上机器还是烫。
第五阶段:发现 GPU 硬件层没断电
systemd 走完了、GPU 还是整夜通电——说明问题比 systemd 循环依赖更混:NVIDIA 驱动在 systemd-poweroff 真正执行时,GPU 硬件接口没干净下电。继续调试,加了 nvidia 模块卸载钩子,开始考虑降驱动、降内核……
第六阶段:EC 重置——一脚踢到了真凶
同时参考了另一个 AI 的建议,做了一次 EC(嵌入式控制器)重置:
1. 正常关机
2. 拔电源适配器
3. 长按电源键 30 秒
4. 静置 5 分钟
5. 接电源,开机
重置后对比:
| 指标 | 之前 | 重置后 |
|---|---|---|
| 开机总时间 | 1分47秒 | 24.5秒 |
| initrd 阶段 | 1分7秒 | 1.6秒 |
| GPU 温度(开机) | 91°C | 45°C |
| CPU Tctl(空闲) | 74°C | 58°C |
一次 EC 重置,所有异常指标同时恢复正常。
为了验证 EC 重置是真正的根因,把所有 systemd 修改还原,只保留 EC 重置后的硬件状态,当晚关机。第二天早上——不烫了。
真正的根因
EC(嵌入式控制器)状态异常。
EC 是笔记本主板上一颗独立的小芯片,管理电源、风扇、按键、温度、ACPI 电源状态。它“卡住”会导致:
- PCIe 总线电源状态异常 → 关机后 GPU 不断电 → 整夜发热
- ACPI 设备枚举异常 → initrd 等待所有设备超时 68 秒 → 开机 1分47秒
- systemd 看到设备状态和实际不符 → 循环依赖、destructive transaction → 关机日志一片报错
我以为在调试的那些“问题”——systemd 循环依赖、nvidia 关机挂起、USB 幻影设备、initrd 超时——本质上都是 EC 异常的次生现象。
NVIDIA 官方 service 文件确实有 bug,但在 EC 正常的情况下,systemd 能自动处理这个环、完成关机。只有在 EC 异常导致整个电源状态混乱时,这个 bug 才会被放大到导致关机失败的程度。
技术总结
EC 重置方法(OMEN / HP 游戏本)
1. 正常关机
2. 拔电源适配器
3. 长按电源键 30 秒(强制放掉主板残留电)
4. 静置 5 分钟
5. 接电源,开机
什么时候需要做:
- 关机后机器持续发热
- 开机时间莫名变长(原本 30 秒变成 1–2 分钟)
- 风扇行为异常(关机后风扇还在转)
- 大量设备枚举超时(
systemd-analyze blame显示一堆设备卡几十秒)
建议频率:出现以上症状时做;平时每隔几个月预防性做一次。
几个值得记的诊断经验
1. 先做 EC 重置再做软件调试
游戏本出现电源相关怪问题时,EC 重置应该是第一步,不是最后手段。成本零、无风险、效果立竿见影。这次花了整整两天调试 systemd,最后发现一个 30 秒的物理操作就解决了。
2. systemd-analyze blame 的数字会误导人
某个设备显示“用了 68 秒”,不一定是它自己慢——可能是整个 sysinit 阶段被某个底层问题卡了 68 秒,所有设备在解锁那一刻同时被记为可用。这种情况下追查软件层是南辕北辙。
3. 开机症状和关机症状可能是同一根因
开机慢(68 秒)和关机后不断电,看起来是两个独立问题,实际是同一个 EC 异常的两面。遇到多个怪异症状同时出现时,优先找共同根因。
4. NVIDIA 官方 service 文件的 bug 是真实存在的
/usr/lib/systemd/system/nvidia-persistenced.service 里的 StopWhenUnneeded=true + Before=systemd-backlight 确实自相矛盾。这个 bug 在 EC 正常时不会造成实质影响,但如果你在正常状态下也遇到 ordering cycle 警告,可以用 drop-in 覆盖:
sudo mkdir -p /etc/systemd/system/nvidia-persistenced.service.d/
sudo tee /etc/systemd/system/nvidia-persistenced.service.d/fix.conf > /dev/null << 'EOF'
[Unit]
StopWhenUnneeded=false
Before=
Before=shutdown.target
[Service]
TimeoutStopSec=5
EOF
sudo systemctl daemon-reload
还没解决的事(已不紧急)
- USB 5-1.1 幻影端口:笔记本内部 hub 的空端口,每次开机重试 20 秒。EC 重置后开机已经 24 秒,优先级低了很多。
- NVIDIA issue #1117:RTX 50 系关机挂起的驱动 bug 依然存在,只是 EC 正常状态下 systemd 能绕过去。等 NVIDIA 出新版驱动修复。
结语
这两天调试中最讽刺的时刻:花了整整两天修 systemd、翻 NVIDIA 的 service 文件、写各种 udev 规则和 systemd 钩子,最后发现真正的解决方案是拔掉电源、长按电源键 30 秒、等 5 分钟。
但这两天也不是白折腾的——至少现在清楚了:
- EC 异常是游戏本最常见、最容易被忽视的故障模式之一
- NVIDIA 官方 service 文件有个设计缺陷
- systemd 的循环依赖报错有时是底层硬件问题的投影
systemd-analyze blame的数字在硬件异常时完全不可信
如果你有类似症状(RTX 50 系 + Ubuntu + 关机后发热 + 开机变慢),先做 EC 重置,再考虑软件层的修复。