第一步:精准定位——找到硬盘的“身份证”

以前我图省事,直接用 /dev/sdb 这样的设备名来配置,结果发现重启后设备名可能会变,导致配置失效。这可不行,我们必须给每个硬盘一个不会变的“身份证号”。 这个“身份证号”就藏在 /dev/disk/by-id/ 目录里。 打开终端,输入:

ls -l /dev/disk/by-id/

你会看到一长串的列表,别慌,这其实是系统为每个设备生成的持久化链接。输出的格式是 ID路径 -> 实际设备名。比如:

lrwxrwxrwx 1 root root 15 Dec  5 16:00 scsi-SUSB_3.1_Device_HDD1_00000000000000000000 -> ../../sdb
lrwxrwxrwx 1 root root 15 Dec  5 16:00 scsi-SUSB_3.1_Device_HDD2_00000000000000000000 -> ../../sdc

怎么知道哪个是哪个呢?很简单,结合 lsblk 命令一起看:

lsblk -o NAME,SIZE,MODEL,MOUNTPOINT

输出大概是这样:

NAME   SIZE MODEL            MOUNTPOINT
sdb    10.9T Device HDD1      /home/mnt/sdb
sdc    14.6T Device HDD2      /home/mnt/sdc

好了,现在对上号了!

  • 我那个 10.9T 的 HDD1,它的“身份证”就是 /dev/disk/by-id/scsi-SUSB_3.1_Device_HDD1_00000000000000000000
  • 那个 14.6T 的 HDD2,就是 /dev/disk/by-id/scsi-SUSB_3.1_Device_HDD2_00000000000000000000小贴士:选择 scsi- 或者 ata- 开头,并且包含设备型号信息的路径,这是最稳妥的。记下这两个路径,我们马上要用。

第二步:配置核心——写一份让服务“听话”的配置文件

hd-idle 的配置文件通常在 /etc/default/hd-idle。如果没有,就自己创建一个。 用你喜欢的编辑器打开它,比如 nano

sudo nano /etc/default/hd-idle

然后,把下面的内容填进去。这里我做了几个关键优化:

# 1. 启用开关,告诉系统“请启动我!”
START_HD_IDLE=true
# 2. 核心配置参数
# -i 600: 空闲600秒(10分钟)后休眠,你可以改成任何你想要的秒数
# -l /dev/disk/by-id/...: 监控我们刚才找到的硬盘,一个都不能少
# -d /var/log/hd-idle.log: 把日志写出来!方便我们排查问题
HD_IDLE_OPTS="-i 600 -l /dev/disk/by-id/scsi-SUSB_3.1_Device_HDD1_00000000000000000000 -l /dev/disk/by-id/scsi-SUSB_3.1_Device_HDD2_00000000000000000000 -d /var/log/hd-idle.log"

划重点

  • 一定要用我们第一步找到的 by-id 路径,这是稳定性的保证。
  • 一定要加上 -d 参数指定日志文件!没有日志的监控就像蒙着眼睛开车,出了问题都不知道去哪找(玄学:加上后出现无法启动的问题)。 保存并退出编辑器。

第三步:给服务上“保险”——实现进程崩溃后自动重启

这是我觉得最重要的一步!systemd 是现代 Linux 的心脏,它不仅能启动服务,还能像一个尽职的保姆一样守护服务。万一 hd-idle 进程因为某些原因被杀掉了或者自己崩溃了,我们可以让它自动重启。 这需要修改 hd-idle 的服务配置文件。

sudo systemctl edit --full hd-idle.service

这个命令会打开一个文本编辑器,里面是 hd-idle 服务的完整配置。找到 [Service] 部分,在里面加上或修改下面这几行:

[Service]
# ... 其他已有的配置 ...
# 重启策略
Restart=always
# 进程退出后,等待10秒再重启,避免疯狂重启导致系统资源耗尽
RestartSec=10
  • Restart=always:无论什么原因退出,都无条件重启。
  • RestartSec=10:一个很人性化的设置,给系统一点喘息的时间。 修改完成后,保存退出。systemd 会自动加载我们的新配置。

第四步:见证奇迹——启动服务并检查状态

一切准备就绪,是时候启动我们的硬盘守护神了!

# 重新加载服务配置,让我们的修改生效
sudo systemctl daemon-reload
# 启动 hd-idle 服务
sudo systemctl start hd-idle
# 设置开机自启动
sudo systemctl enable hd-idle

现在,我们可以检查一下服务的状态,看看它是否健康运行:

sudo systemctl status hd-idle

如果一切顺利,你会看到绿色的 active (running) 字样。 更激动人心的是,我们可以实时查看日志,看硬盘是不是真的在乖乖睡觉:

tail -f /var/log/hd-idle.log

保持硬盘空闲10分钟(或者你设置的时间),你应该会看到类似这样的日志出现:

hd-idle: /dev/sdb (scsi-SUSB_3.1_Device_HDD1_...) is idle, spinning down
hd-idle: /dev/sdc (scsi-SUSB_3.1_Device_HDD2_...) is idle, spinning down

当你访问硬盘里的文件时,它会重新启动。之后再次空闲,又会进入休眠。完美!

结语

经过这么一番折腾,我的服务器终于安静了下来。看着日志里规律地出现“spinning down”,那种掌控一切的感觉,真是折腾带来的最大乐趣。 希望这篇手记能帮你省去一些摸索的时间。如果你在配置过程中遇到任何问题,或者有更好的建议,欢迎在下面交流!祝你的硬盘也能睡个好觉。