故障现象
在 fnOS 网页管理界面中设置了硬盘休眠(内置 15 分钟,外置 5 分钟),但 10T 机械硬盘始终不进入休眠状态。
系统环境
系统版本: X86
设备环境:
- 物理机,Intel N100(4核/4线程),16GB 内存
- fnOS 版本:1.1.26,内核:6.12.18-trim
- 网络:局域网
- Docker:28.5.2
硬盘清单
| 设备 |
型号 |
容量 |
类型 |
需要休眠 |
| nvme0n1 |
WDC WDS100T2B0C |
1T |
NVMe SSD(系统盘) |
❌ 系统盘必须在线 |
| sda |
Fanxiang S100Pro |
256G |
SATA SSD |
❌ SSD 无需休眠 |
| sdb |
WUS721010ALE6L4 |
10T |
SATA HDD(企业盘) |
✅ 降噪省电 |
| sdc |
Samsung 870 EVO |
1T |
SATA SSD |
❌ SSD 无需休眠 |
SSD 不需要休眠
SSD 没有机械部件,不存在噪音问题,休眠反而增加唤醒延迟。休眠只对机械硬盘有意义。
排查过程
1. 确认硬盘状态
sudo hdparm -C /dev/sdb
# drive state is: active/idle ← 没有休眠
2. 检查 APM 和 Spindown Timer
sudo hdparm -B /dev/sdb
# APM_level = 254 ← 最高性能模式,不允许自动休眠
sudo hdparm -S /dev/sdb
# bad/missing standby-interval value ← 未设置任何超时
问题一
APM = 254(最高性能,禁用自动 spindown)且 Spindown Timer 未设置。fnOS 界面的配置完全没有下发到硬盘。
3. 确认 fnOS 配置已保存
cat /usr/trim/etc/disk_idle
# 15 ← 内置硬盘 15 分钟
# 5 ← 外置硬盘 5 分钟
配置文件是对的,但没有生效。
4. 排查 fnOS 休眠守护进程
fnOS 使用 trim_diskpowerd.service 管理硬盘休眠:
sudo systemctl status trim_diskpowerd
# active (running) — 进程在运行
但日志只有一条启动记录,没有任何休眠动作:
sudo journalctl -u trim_diskpowerd
# 仅有: Started trim_diskpowerd.service
5. 分析 diskpowerd 工作机制
/proc/<pid>/fd/:
fd 3 → /run/trim_disk_power_state.lock (锁文件)
fd 4 → socket:[9764] → /run/trim_disk_power_state.sock
diskpowerd 是被动模式:通过 Unix socket 接收 trim_main 的指令来执行休眠。它本身不主动监控 IO。
6. 确认 trim_main 的行为
sudo journalctl -u trim_main | grep "nocheck=standby"
# 每隔几分钟执行 smartctl --nocheck=standby
trim_main 加载了 power.hdl handler,但似乎没有正确通过 socket 通知 diskpowerd 执行休眠。
7. 确认硬盘本身支持休眠
sudo hdparm -y /dev/sdb
# issuing standby command — 成功
sudo hdparm -C /dev/sdb
# drive state is: standby — 确认进入休眠
结论
硬盘完全支持休眠,问题出在 fnOS 的 diskpowerd 没有正确执行休眠指令,属于 fnOS 的 bug。
8. 确认无其他 IO 干扰
# 两次 /proc/diskstats 对比,间隔 30 秒
# IO 计数完全相同 — 无任何进程在访问 sdb
根因
graph TD
A[fnOS 界面设置休眠 15 分钟] --> B[写入 /usr/trim/etc/disk_idle]
B --> C[trim_main 加载 power.hdl]
C --> D{通过 socket 通知 diskpowerd?}
D -->|未正确通知| E[diskpowerd 无动作]
E --> F[硬盘永远不休眠]
G[hdparm APM=254] --> H[硬盘固件层面禁用自动休眠]
H --> F
双重原因
- fnOS bug:
diskpowerd 守护进程未正确接收/执行休眠指令
- APM 值过高:硬盘 APM=254(最高性能),固件层面不允许自动 spindown
修复方案
绕过 fnOS 的 diskpowerd,直接用 hdparm 设置硬盘自动休眠。
立即生效
sudo hdparm -S 180 -B 127 /dev/sdb
| 参数 |
含义 |
-S 180 |
180 × 5秒 = 900秒 =15 分钟无 IO 后自动 spindown |
-B 127 |
APM 设为 127,允许自动休眠(≤127 允许 spindown,≥128 禁止) |
持久化(重启后自动生效)
在 /etc/hdparm.conf 末尾添加:
# 10T HDD (WUS721010ALE6L4) - 15分钟休眠
# 由冷萃添加于 2026-04-05,因 fnOS diskpowerd 未正常工作
/dev/disk/by-id/ata-WUS721010ALE6L4_VCGGKTKM {
apm = 127
spindown_time = 180
}
使用 by-id 路径
用 /dev/disk/by-id/ 而非 /dev/sdb,防止盘符漂移导致配置错乱。
验证
等待 15 分钟后:
sudo hdparm -C /dev/sdb
# 应显示: drive state is: standby
与 fnOS 设置的兼容性
| 场景 |
结果 |
| fnOS 更新修复了 diskpowerd |
两者共存不冲突,都是设 standby timer |
| fnOS 网页改休眠时间 |
disk_idle文件更新,但 hdparm.conf 兜底 |
| 想去掉 hdparm 的设置 |
删掉 hdparm.conf 里的配置段即可 |
结论
- ✅ 后续可以继续通过 fnOS 网页修改休眠时间
- ✅ hdparm.conf 只是兜底,不覆盖 fnOS 设置
- ✅ fnOS 修复 bug 后可随时移除 hdparm 配置