让你的硬盘安静下来:hd-idle 安装、配置与验证完全指南

在家庭服务器或 NAS (网络附加存储) 中,机械硬盘 (HDD) 往往是噪音和功耗的主要来源。让闲置的硬盘进入休眠(spin down,停转)状态,不仅可以显著降低噪音、节约电能,理论上还能延长硬盘的电机寿命。

hd-idle 是一个轻量而强大的 Linux 工具,它能智能地监控硬盘的读写活动,并在硬盘持续闲置一段时间后,安全地将其置于休眠模式。本指南将带你走过从安装到故障排查的全过程。

1. 安装 hd-idle

hd-idle 通常存在于主流 Linux 发行版的官方软件源中。在基于 Debian 或 Ubuntu 的系统(如树莓派 OS、OpenMediaVault 等)上,安装非常简单。

打开终端,输入以下命令:

sudo apt-get update
sudo apt-get install hd-idle

安装完成后,hd-idle 的服务 hd-idle.service 会被 systemd 管理,但默认配置下它可能不会启动,或者启动后不做任何事。接下来我们需要配置它。

arch linux 安装hd-idle
第一步:安装 yay (AUR 助手)

在安装 hd-idle 之前,我们必须先安装它的安装工具 yay

  1. 登录您的服务器
    通过 SSH 以您的普通用户身份(例如 yys)登录。

    ssh yys@your-server-ip
    
  2. 安装编译所需的基础工具
    为了从源代码编译 yay,我们需要 git (用于下载源码) 和 base-devel 包组 (包含 make gcc 等编译工具)。

    sudo pacman -S --needed git base-devel
    

    系统会提示您输入密码。

  3. 下载 yay 的构建脚本
    使用 git 从 AUR 克隆 yay 的源码。建议在您的家目录 (~) 下进行操作。

    cd ~
    git clone https://aur.archlinux.org/yay.git
    

    这会在您的家目录下创建一个名为 yay 的新文件夹。

  4. 编译并安装 yay
    进入 yay 文件夹,并运行 makepkg 命令来构建和安装。

    cd yay
    makepkg -si
    
    • -s: 自动安装编译时所需的依赖 (比如 go 语言环境)。
    • -i: 编译成功后自动安装。
    • 注意:此过程不能使用 sudomakepkg 会在需要管理员权限时自动提示您输入密码。
  5. 清理安装文件 (可选)
    yay 安装成功后,yay 文件夹就不再需要了。

    cd ..
    rm -rf yay
    

验证:运行 yay --version,如果能看到版本号输出,说明 yay 已成功安装。


第二步:使用 yay 安装 hd-idle

有了 yay,安装 hd-idle 就变得非常简单了。

  1. 运行安装命令

    yay -S hd-idle
    
  2. 交互式安装过程
    yay 会引导您完成安装:

    • 它会首先搜索并找到 hd-idle
    • 可能会询问您是否要清理构建 (cleanBuild?) 或显示差异 (Diffs to show?)。对于初次安装,直接按回车选择默认选项即可。
    • 之后 yay 会自动编译 hd-idle
    • 编译完成后,它会调用 pacman 进行安装,此时会提示您输入密码 ([sudo] password for yys:)。
    • 最后会询问您是否继续安装 (Proceed with installation? [Y/n]),输入 Y 并回车。

 

2. 配置 hd-idle

hd-idle 的所有配置都集中在一个文件中:/etc/default/hd-idle。这是我们工作的核心。

使用你喜欢的编辑器打开它,例如 vimnano

sudo vim /etc/default/hd-idle

arch linux 路径 

sudo vim /etc/conf.d/hd-idle

你会看到一个包含很多注释说明的文件。我们只需要关心一个核心参数:HD_IDLE_OPTS

配置语法:

hd-idle 的参数是成对出现的,通常是 -i <时间>-a <设备名>

  • -i <idle_time>: 设置闲置时间,单位为
  • -a <name>: 指定该闲置时间应用于哪个硬盘设备。<name> 就是设备名,如 sdasdb 等。
  • 注意: 不要使用 -d 参数!这是一个常见的错误。-d 是用于调试 (Debug) 的,它会阻止服务进入后台,导致 systemd 认为启动失败并超时终止服务。

配置示例:

假设你有名为 sdasdb 的两块硬盘,你希望:

  • sda 闲置 1200 秒(20 分钟)后休眠。
  • sdb 闲置 1800 秒(30 分钟)后休眠。

那么,你需要找到文件中的 HD_IDLE_OPTS 这一行,取消其注释(删除前面的 #),并修改为:

START_HD_IDLE=true
HD_IDLE_OPTS="-i 1200 -a sda -i 1800 -a sdb"

提示:你可以为系统中的多块硬盘设置不同的休眠时间,只需不断重复 -i ... -a ... 的组合即可。如果你想为所有未明确指定的硬盘设置一个默认休-眠时间,可以只使用 -i <时间>。例如 HD_IDLE_OPTS="-i 600" 会让所有硬盘都在闲置10分钟后休眠。

修改完成后,保存并退出文件。

3. 启动并验证服务

配置修改后,我们需要让 systemd 重新加载配置并重启 hd-idle 服务。

# 重新加载 systemd 配置
sudo systemctl daemon-reload

# 重启 hd-idle 服务
sudo systemctl restart hd-idle.service

# (可选) 设置开机自启
sudo systemctl enable hd-idle.service

现在,检查服务状态来确认它是否成功运行:

systemctl status hd-idle.service

如果一切顺利,你应该会看到绿色的 Active: active (running) 字样,并且在下方的 CGroup 信息中能看到你的配置参数被正确加载。

● hd-idle.service - hd-idle - spin down idle hard disks
     Loaded: loaded (/lib/systemd/system/hd-idle.service; enabled; preset: enabled)
     Active: active (running) since Sat 2025-09-27 14:05:56 CST; 1h ago
       ...
   Main PID: 31594 (hd-idle)
     CGroup: /system.slice/hd-idle.service
             └─31594 /usr/sbin/hd-idle -i 1200 -a sda -i 1800 -a sdb```
看到这个界面,说明 `hd-idle` 已经在正常工作了。

#### 4. 终极验证:硬盘真的休眠了吗?

服务在运行不代表硬盘就一定会休眠。我们需要验证一下。

**方法一:物理感知法(简单直接)**

*   **听声音**:在安静的环境下,你可以清晰地听到机械硬盘旋转时的嗡嗡声。等待超过你设定的最长闲置时间(例如30分钟)后,这个声音应该会消失。
*   **感受震动**:用手触摸机箱或硬盘架,可以感觉到运转时的微弱震动。休眠后,震动会停止。
*   **观察唤醒**:当硬盘休眠后,尝试通过 `ls` 或文件管理器访问硬盘上的文件。你会听到硬盘“咔哒”一声重新启动旋转,并且访问会有明显的几秒钟延迟。这就是硬盘被唤醒了。

**方法二:命令行工具法(精准可靠)**

Linux 提供了 `hdparm` 工具来检查硬盘的电源状态。

首先,确保已安装 `hdparm`:
```bash
sudo apt-get install hdparm

等待足够长的闲置时间后,运行以下命令:

sudo hdparm -C /dev/sda
sudo hdparm -C /dev/sdb

你会得到类似下面的输出。关键在于 drive state 的值:

  • drive state is: active/idle -> 硬盘正在运转,未休眠
  • drive state is: standby -> 硬盘已休眠,恭喜你,配置成功!

5. 疑难解答:为什么我的硬盘还不休眠?

这是最常见的问题:服务运行正常,但用 hdparm 检查发现硬盘永远是 active/idle

根本原因: 系统中有某个进程在持续地、哪怕是间歇性地读写硬盘。任何微小的I/O操作都会重置 hd-idle 的闲置计时器。

排查步骤:

  1. 找出“幕后黑手”:使用 iotop 工具来实时监控是哪个进程在进行磁盘读写。

    # 安装 iotop
    sudo apt-get install iotop
    
    # 运行并只显示有I/O活动的进程
    sudo iotop -o
    ```    观察 `iotop` 的输出几分钟,记下是哪个 `COMMAND` 在对你的数据盘进行读写。
    
  2. 解决常见问题源:

    • 文件系统访问时间 (atime): 这是最常见的元凶。Linux 默认每次读取文件都会更新其“最后访问时间”,这会触发一次写入操作。

      • 解决方案: 修改 /etc/fstab,为你的数据盘挂载点添加 relatime 选项。
      • 编辑 /etc/fstab,找到硬盘挂载行,在挂载选项(通常是defaults)后加入 ,relatime
        # 修改前
        UUID=... /mnt/data1 ext4 defaults 0 2
        # 修改后
        UUID=... /mnt/data1 ext4 defaults,relatime 0 2
        
      • 然后重新挂载:sudo mount -o remount /mnt/data1 或直接重启系统。
    • 日志文件:检查系统日志 (rsyslog) 或应用(如 Docker)的日志是否被配置写入需要休眠的数据盘。尽量将所有日志都放在系统盘(最好是SSD)上。

    • 媒体服务器:Plex、Jellyfin、Emby 等服务会定期扫描媒体库、生成缩略图,导致磁盘活动。请检查其设置,关闭或延长自动扫描的间隔。

    • 监控工具smartd 等硬盘健康监控工具会定期查询硬盘信息,这也会唤醒硬盘。可以调整 smartd 的检查间隔。

    • Swap 交换分区:如果你的 Swap 在数据盘上,系统内存紧张时会频繁读写,阻止休眠。使用 swapon --show 检查,并考虑将其移至系统盘。