跳转至内容

hdparm

来自 ArchWiki

hdparmsdparm 是用于设置和查看硬盘驱动器硬件参数的命令行实用工具。hdparm 也可用作简单的基准测试工具。

最初,hdparm 是为IDE 磁盘创建的,而 sdparm 是为SCSI 磁盘创建的。自 2010 年左右以来,存储设备接口是 IDE 和 SCSI 的增强混合体,hdparmsdparm 相互补充。

警告 更改磁盘的默认参数可能会导致系统冻结,甚至不可逆地损坏磁盘。

安装

安装 hdparm 包。对于 SCSI 设备,安装 sdparm 包。

用法

磁盘信息

要获取有关硬盘的信息,请运行以下命令

# hdparm -I /dev/sda

基准测试

hdparm 可用于 基准测试#hdparm

电源管理配置

现代硬盘支持众多电源管理功能。最常见的总结在下表中。有关完整列表,请参阅 hdparm(8)

警告 过度激进的电源管理可能由于频繁的磁头停泊和停转而缩短硬盘寿命。
参数 描述
-B 设置高级电源管理功能。可能的值在 1 到 255 之间,较低的值表示更激进的电源管理,较高的值表示更好的性能。值为 1 到 127 允许停转,而值为 128 到 254 则不允许。值为 255 则完全禁用该功能。
-S 设置驱动器的待机(停转)超时时间。超时时间指定在没有磁盘活动的情况下空闲多久后关闭电机以节省电源。值为 0 表示禁用停转,值为 1 到 240 表示 5 秒的倍数,值为 241 到 251 表示 30 分钟的倍数。
-M 设置自动声学管理功能。大多数现代硬盘都能够降低磁头移动速度以减少噪音输出。可能的值取决于磁盘,某些磁盘可能不支持此功能。
  • 当同时使用 -B-S 参数时,APM 值小于 128 可能会导致驱动器在 -S 超时值之前停转。请参阅 [1]
  • 无法查询 -S 的当前值。

要查询 -B 的当前值,请在不带值的情况下传递该参数

# hdparm -B /dev/sda

要应用不同的值,例如将 APM 设置为 127

# hdparm -B 127 /dev/sda

写缓存

写缓存是将文件暂时缓存到驱动器的嵌入式内存中,然后再写入磁盘的过程,这本质上是一种性能提升。写缓存是大多数硬盘提供的功能,在大多数情况下默认启用。要检查是否如此,请运行

# hdparm -W /dev/sdX
警告 虽然写缓存是免费的性能提升,但也存在缺点。启用写缓存会增加突然断电时数据丢失的风险。

如果禁用,可以启用它

# hdparm -W 1 /dev/sdX

反之,要禁用它,请使用

# hdparm -W 0 /dev/sdX
注意 对写缓存设置的更改可能不是持久的,并且在系统睡眠、休眠或重启时可能会发生变化。最好仔细检查您期望的设置是否已应用。

本文或本章节的准确性存在争议。

原因: 每 30 秒重新应用一次所有磁盘的设置是无用的。找出是什么重置了设置,然后禁用它,或仅在特定事件(如重启或挂起)后运行 hdparm。(在 Talk:Hdparm 中讨论)

作为在机器上持久禁用磁盘写缓存的示例,我们可以创建一个本地脚本 /usr/local/sbin/write-cache-disabler,该脚本使用 hdparm 和 lsblk(8) 来定期探测所有连接的磁盘并应用所需的设置。这将在启动时服务首次运行时禁用写缓存,并能在 30 秒内捕获任何偶发的重新启用写缓存的情况,例如磁盘添加和系统挂起。

/usr/local/sbin/write-cache-disabler
#!/bin/sh
set -e

while true; do
        lsblk --raw --scsi --paths -o name \
        | tail --lines='+2' \
        | (while read -r name; do 
                hdparm -W "$name" \
                | (grep --fixed-strings --quiet -e '1 (on)' \
                   && hdparm -W 0 "$name" \
                   || true)
        done)
        sleep 30
done

确保脚本可执行:chmod u+x /usr/local/sbin/write-cache-disabler。然后,我们可以通过创建本地单元systemd 下运行此守护程序

/etc/systemd/system/write-cache-disabler.service
[Unit]
Description=Write cache disabler daemon

[Service]
Type=simple
ExecStart=/usr/local/sbin/write-cache-disabler

[Install]
WantedBy=multi-user.target

启用 write-cache-disabler.service 以在启动时启动它。

关闭硬盘驱动器电源

一种常见的对此类功能的需求场景是连接到廉价外部 USB/SATA/FireWire 硬盘盒或桥接器的磁盘。如果它在关闭电源开关时未能正确发出停止命令,驱动器将被迫进行紧急磁头回缩。经常这样做迟早会损坏驱动器。一种解决方案是,在确定数据已写入介质后,运行一个命令来关闭驱动器电源

# hdparm -Y /dev/sdX
警告 务必确保
  1. 数据已实际写入介质。还建议等待一段时间,以便驱动器变为空闲。
  2. 设备,例如示例中的 /dev/sdX,是您要关闭电源的设备。

技巧与提示

在不唤醒磁盘的情况下查询磁盘状态

调用 hdparm 并使用查询选项已知会唤醒某些驱动器。在这种情况下,可以考虑使用 smartmontools 提供的 smartctl 来查询设备,这不会唤醒睡眠中的磁盘。例如

# smartctl -i -n standby /dev/sda
smartctl 6.5 2016-05-07 r4318 [x86_64-linux-4.10.13-1-ARCH] (local build)
Copyright (C) 2002-16, Bruce Allen, Christian Franke, www.smartmontools.org

Device is in STANDBY mode, exit(2)

使用 udev 规则进行持久化配置

为了使设置在重启或睡眠后持久化,可以使用 udev 规则

/etc/udev/rules.d/69-hdparm.rules
ACTION=="add|change", SUBSYSTEM=="block", KERNEL=="sda", RUN+="/usr/bin/hdparm -B 254 -S 0 /dev/sda"

由于磁盘设备可能被随机分配给变化的 /dev/sdX,因此也可以通过其序列号来识别磁盘,如 Udev#通过序列号识别磁盘中所述。

具有多个硬盘的系统可以根据某些标准灵活地应用规则。例如,要将省电设置应用于所有旋转驱动器(具有旋转磁头的硬盘,特别排除固态驱动器),请使用以下规则

/etc/udev/rules.d/69-hdparm.rules
ACTION=="add|change", SUBSYSTEM=="block", ENV{DEVTYPE}=="disk", KERNEL=="sd*", ATTRS{queue/rotational}=="1", RUN+="/usr/bin/hdparm -B 127 $env{DEVNAME}"

唤醒后重新应用配置

如果在系统挂起/休眠后配置丢失,可以使用 systemd-sleep 重新应用。

将脚本放入 /usr/lib/systemd/system-sleep/ 并使其可执行

/usr/lib/systemd/system-sleep/hdparm
#!/bin/sh

case $1 in post)
        /usr/bin/hdparm -B 254 -S 0 /dev/sda
        ;;
esac

启动后直接让驱动器进入睡眠状态

很少需要的设备可以在引导过程结束时直接置于睡眠状态。这不适用于上述 udev 规则,因为它发生得太早了。为了在引导完成后发出命令,只需创建一个 systemd 服务并启用它。

/etc/systemd/system/hdparm.service
[Unit]
Description=hdparm sleep

[Service]
Type=oneshot
ExecStart=/usr/bin/hdparm -q -S 120 -y /dev/sdb

[Install]
WantedBy=multi-user.target

处理不受支持的硬件

某些驱动器不支持通过 hdparm 进行停转。类似以下的诊断错误消息是这种情况的一个好迹象

# hdparm -S 240 /dev/sda
/dev/sda:
setting standby to 240 (20 minutes)
HDIO_DRIVE_CMD(setidle) failed: Invalid argument

对于其他一些驱动器,hdparm 命令已被接受,但驱动器不遵守参数(APM 或停转定时器)。这已经在西部数据 P300(型号 HDWD120)HDD 上观察到。

可以使用 hd-idleAUR 旋转来使这些驱动器进入睡眠状态,该工具附带一个 systemd 服务。需要编辑 /etc/conf.d/hd-idleHD_IDLE_OPTS 值,然后启动启用 hd-idle.service

使用 10 分钟空闲时间为 /dev/sda,1 分钟空闲时间为 /dev/disk/by-uuid/01CF0AC9AA5EAF70 的示例

HD_IDLE_OPTS="-i 0 -a /dev/sda -i 600 -a /dev/disk/by-uuid/01CF0AC9AA5EAF70 -i 60"

前导的 -i 0 参数表示 hd-idle 在其他驱动器上被禁用。

西部数据硬盘的电源管理

西部数据硬盘有一个特殊的 idle3 定时器,它控制着驱动器在将磁头定位到停泊位置并进入低功耗状态之前等待多长时间。有几种方法可以修改 idle3 状态。

  • hdparm 提供了 -J 标志
    • 指定值为零(0)可完全禁用 WD idle3 定时器:# hdparm -J 0 --please-destroy-my-drive /dev/sddrive,尽管 hdparm(8) 不推荐这样做 — hdparm 开发人员建议 Linux 用户设置为 30 秒。
    • 请参阅 #使用 udev 规则进行持久化配置 以自动将此参数应用于支持的硬盘。
  • idle3ctl — 由 idle3-tools 包提供
    • 完全禁用定时器:# idle3ctl -d /dev/sdc
    • 将定时器设置为 30 秒:# idle3ctl -s 129 /dev/sdc
      提示
      • 原始 idle3 值作为 idle3ctl 命令的参数传递。
      • 该值与秒为单位的超时时间之间的对应关系在 idle3ctl(8) 中的下表内提供。
注意 无论使用上述哪个程序,都需要完全的电源循环才能使任何更改生效。这意味着驱动器需要断电然后再通电,仅重启不足以完成。

故障排除

挂起后 APM 级别重置

APM 级别在挂起后可能会被重置,需要每次恢复后重新执行。可以通过以下 systemd 单元(改编自 论坛帖子)自动完成此操作。

/etc/systemd/system/apm.service
[Unit]
Description=Local system resume actions
After=suspend.target hybrid-sleep.target hibernate.target

[Service]
Type=simple
ExecStart=/usr/bin/hdparm -B 254 /dev/sda

[Install]
WantedBy=sleep.target
注意 sleep.target 由所有 suspendhybrid-sleephibernate 目标拉动,但在系统挂起之前完成启动,因此必须明确指定这三个目标。请参阅 [2]

或者,在 /usr/lib/systemd/system-sleep 中创建一个钩子

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.