hd-idle v1.21 硬盘休眠配置
版本警告:新版(1.0+)不再支持 -c hdparm,只能用 scsi(默认)或 ata。如果你从旧教程复制了 -c hdparm,服务会直接启动失败。
第一步:安装 v1.21
# 停止旧服务并卸载(如果有)
sudo systemctl stop hd-idle 2>/dev/null
sudo apt remove hd-idle -y
# 下载官方 v1.21 安装包
cd /tmp
wget https://github.com/adelolmo/hd-idle/releases/download/v1.21/hd-idle_1.21_amd64.deb
# 安装
sudo dpkg -i hd-idle_1.21_amd64.deb
# 锁定版本(防止系统更新时覆盖)
sudo apt-mark hold hd-idle
# 确认版本(应显示 1.21)
hd-idle -V
第二步:确定要休眠的硬盘
lsblk -o NAME,SIZE,MODEL,MOUNTPOINT
输出示例(你的机器可能不同):
NAME SIZE MODEL MOUNTPOINT
sda 10.9T Device HDD1 /home/mnt/sdb
sdb 14.6T Device HDD2 /home/mnt/sdc
sdc 1.8T Fanxiang P761 2TB /
nvme0n1 953G FIREBAT FET34 (系统盘,无挂载)
判断规则:
机械硬盘通常型号带 HDD 且容量较大(≥2T)。
不要休眠系统盘(挂载点为 //boot 的盘)。
你要休眠的目标盘就是你希望空闲后自动停转的机械盘,如上例中的 sdasdb。
记下这些盘符(如 sdasdb)。
第三步:获取每个硬盘的永久标识(by-id)
设备名(如 /dev/sda)可能在重启后变化,所以必须使用 /dev/disk/by-id/ 下的路径。
ls -l /dev/disk/by-id/ | grep -E "sda|sdb" | grep -v part
grep -E "sda|sdb" 替换成你第二步找到的盘符,用 | 分隔。输出如:
lrwxrwxrwx 1 root root 9 scsi-SUSB_3.1_Device_HDD1_00000000000000000000 -> ../../sda
lrwxrwxrwx 1 root root 9 scsi-SUSB_3.1_Device_HDD2_00000000000000000000 -> ../../sdb
取左边那串(不含 ../../),例如:
scsi-SUSB_3.1_Device_HDD1_00000000000000000000
scsi-SUSB_3.1_Device_HDD2_00000000000000000000
这些就是你的硬盘ID。完整路径是 /dev/disk/by-id/ + ID,如 /dev/disk/by-id/scsi-SUSB_3.1_Device_HDD1_...。
注意:如果输出有多行带 -part 结尾的,那是分区,忽略掉(我们带了 grep -v part 就是为了过滤分区,只保留整个磁盘)。
第四步:编辑配置文件 /etc/default/hd-idle
sudo tee /etc/default/hd-idle <<'EOF'
START_HD_IDLE=true
HD_IDLE_OPTS="-i 0 \
-a /dev/disk/by-id/你的第一个硬盘ID -i 2700 \
-a /dev/disk/by-id/你的第二个硬盘ID -i 2700 \
-l /var/log/hd-idle.log -s 1"
EOF
参数释义:
-i 0:全局禁用(防止未指定的硬盘被误休眠)。
-a /dev/disk/by-id/... -i 2700:为这块硬盘单独设定空闲超时(2700秒=45分钟)。
-l /var/log/hd-idle.log:日志位置。
-s 1:持续解析符号链接(让 by-id 路径始终有效)。
替换示例(用你第三步得到的ID):
sudo tee /etc/default/hd-idle <<'EOF'
START_HD_IDLE=true
HD_IDLE_OPTS="-i 0 \
-a /dev/disk/by-id/scsi-SUSB_3.1_Device_HDD1_00000000000000000000 -i 2700 \
-a /dev/disk/by-id/scsi-SUSB_3.1_Device_HDD2_00000000000000000000 -i 2700 \
-l /var/log/hd-idle.log -s 1"
EOF
如果你只需要休眠一块盘,就只写一个 -a ... -i 2700。如果需要更多,继续加。
第五步:启动服务
sudo systemctl restart hd-idle
sudo systemctl status hd-idle --no-pager
输出中应看到 Active: active (running),表示服务正常。
第六步:验证配置是否生效
6.1 快速验证:改10秒测试
# 临时将超时改为10秒
sudo sed -i 's/-i 2700/-i 10/g' /etc/default/hd-idle
sudo systemctl restart hd-idle
# 等15秒后查看日志
tail -f /var/log/hd-idle.log
正常会看到类似:
date: ... disk: /dev/disk/by-id/..., running: 10, stopped: xx
- running: 10 表示硬盘在运转10秒后进入休眠,配置成功。
测试完立即恢复:
sudo sed -i 's/-i 10/-i 2700/g' /etc/default/hd-idle
sudo systemctl restart hd-idle
6.2 手动立即休眠(用于测试硬件是否支持)
sudo hd-idle -t /dev/disk/by-id/你的硬盘ID
执行后硬盘会立即停转,可以听到声音或使用 sudo hdparm -C /dev/sdX 查看状态,显示 standby 即为休眠。
第七步:后续观察(无需操作)
定期查看日志,了解硬盘睡眠/唤醒情况:
grep "spun down" /var/log/hd-idle.log | tail -20
grep "spun up" /var/log/hd-idle.log | tail -20
如果发现频繁唤醒,用 iotop -o -d 2 或 lsof +D /你的挂载点 查找进程。
常见问题(只看这几个)
| 现象 | 原因和解决 |
|------|-----------|
| 服务启动失败,报 Wrong command_type -c hdparm | 配置中有 -c hdparm,新版不支持,删除即可。 |
| 硬盘从不休眠,但日志无异常 | 有其他进程持续读写,用 iotop 定位。 |
| 休眠几秒又唤醒 | 后台有服务访问,排查 SMB/NFS/Plex 等。 |
| 重启后设备名变化导致无法休眠 | 确保使用 /dev/disk/by-id/ 路径,而不用 /dev/sdX。 |
如果可以你也可以运行执行诊断脚本,把输出贴给AI
echo "===== 系统 =====" && cat /etc/os-release
echo "===== 是否安装 =====" && dpkg -l | grep hd-idle
echo "===== 当前配置 =====" && cat /etc/default/hd-idle 2>/dev/null || echo "无"
echo "===== 硬盘列表 =====" && lsblk -o NAME,SIZE,MODEL,MOUNTPOINT
echo "===== by-id路径 =====" && ls -l /dev/disk/by-id/ | grep -E "ata-|scsi-|usb-"
echo "===== 服务状态 =====" && sudo systemctl status hd-idle --no-pager 2>/dev/null
echo "===== 日志末尾 =====" && tail -20 /var/log/hd-idle.log 2>/dev/null
把完整输出粘贴给AI,并告诉AI哪几块盘要休眠、期望超时时间,它会直接给你写好完整的配置文件。