OECT (Armbian) 挂载外置硬盘不休眠的排障与修复实战
前几天搞定了一台闲置的网心云 OECT,底层刷入了 Armbian 25.5.1,并在上面跑起了 CasaOS。为了把它改造成家用轻量 NAS 和备份中心,我将一块 2T 西数硬盘外挂了上去(目前作为 PVE 和 OpenClaw 的滚动备份盘)。
但很快发现一个问题:这块 2T 硬盘它不休眠。不管有没有数据读写,它就像打了鸡血一样全天候运转。虽然做 NAS 的盘本该如此,但这毕竟是家用闲置设备的废物利用,没必要让它 24 小时空转消耗寿命,听着也烦。
所以今天花了一点时间,把这个“不眠之症”给治了。在此记录一下排查与修复的过程。
1. 确认病因:谁在阻止硬盘休眠?
Linux 下控制硬盘休眠最常见的工具是 hdparm。
一开始我直接尝试用 hdparm -y /dev/sda 让它强制进入待机模式,结果发现:它确实停转了,但不到 10 秒钟,又重新启动了。
这说明系统里有后台进程在频繁读写(或者唤醒)这块硬盘。常见嫌疑犯包括:
- 系统日志守护进程 (syslog, journald 等)
- SMART 监控 (smartd)
- CasaOS 或挂载在上面的 Docker 容器 (比如易有云
linkease) 定时扫描
2. 排查抓鬼:揪出幕后黑手
为了找出具体是哪个进程在唤醒硬盘,我们可以借助 fatrace 或者 iotop,也可以通过开启内核的 block dump。
最简单的办法,用 iotop -o 观察。
结果发现,主要是我在上面跑的 linkease (易有云) Docker 容器,以及 CasaOS 本身的某些状态轮询在作祟。
由于这台设备的主要用途是每天凌晨 04:00 和 05:00 接收 PVE 与主控机的备份压缩包,平时白天它的读写需求极低,我决定采用一种更强硬且智能的休眠策略。
3. 制定休眠策略:hdparm 规则
最终,我选择配置 hdparm 规则,设定硬盘在空闲 10 分钟(600秒)后自动停转待机。
3.1 测试休眠指令
先用命令测试(假设你的硬盘是 /dev/sda):
sudo hdparm -S 120 /dev/sda注:-S 后面的数字是休眠时间,单位是 5 秒(120 x 5 = 600 秒,即 10 分钟)。
3.2 固化配置到 udev 规则
因为每次重启或者重新插拔硬盘,hdparm 的设置可能会失效。最好的办法是写进 udev 规则里,让它成为系统底层铁律。
创建并编辑规则文件:
sudo nano /etc/udev/rules.d/50-hdparm.rules填入以下内容:
ACTION=="add|change", KERNEL=="sda", ATTR{queue/rotational}=="1", RUN+="/sbin/hdparm -S 120 /dev/sda"这个规则的意思是:当系统检测到添加或改变一个旋转型(非 SSD)硬盘设备 sda 时,自动执行休眠设定(空闲 10 分钟停转)。
保存后,重新加载 udev 规则:
sudo udevadm control --reload-rules
sudo udevadm trigger4. 优化:减少无谓的唤醒
光设置了休眠还不够,为了防止刚休眠就被唤醒,我还做了一点优化:
- 将一些不需要频繁写盘的日志路径迁移到了内存文件系统 (tmpfs)。
- 在 CasaOS 中,非必要的应用如果在后台频繁扫描
/mnt/Storage1(我的 2T 硬盘挂载点),就将其休眠或者调整扫描周期。
结语
折腾完之后,现在这块 2T 西数硬盘终于学会了“劳逸结合”。平时安安静静地待机停转,到了凌晨 4、5 点接收备份任务时再自动苏醒干活。
废物利用的精髓不仅在于“能用”,更在于“好用”和“稳定”。希望这篇排障记录能帮到同样在玩 Armbian / CasaOS 外挂硬盘的朋友。
