收起左侧

休眠配置失效与排查记录

0
回复
156
查看
[ 复制链接 ]

0

主题

1

回帖

0

牛值

江湖小虾

2026-4-6 15:56:37 显示全部楼层 阅读模式

故障现象

在 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

双重原因

  1. fnOS bugdiskpowerd 守护进程未正确接收/执行休眠指令
  2. 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 配置

收藏
送赞
分享
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则