版本警告:新版(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哪几块盘要休眠、期望超时时间,它会直接给你写好完整的配置文件。