hdparm
hdparm 和 sdparm 是用于设置和查看硬盘驱动器硬件参数的命令行实用工具。hdparm 也可用作简单的基准测试工具。
最初,hdparm 是为IDE 磁盘创建的,而 sdparm 是为SCSI 磁盘创建的。自 2010 年左右以来,存储设备接口是 IDE 和 SCSI 的增强混合体,hdparm 和 sdparm 相互补充。
安装
安装 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
作为在机器上持久禁用磁盘写缓存的示例,我们可以创建一个本地脚本 /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
- 数据已实际写入介质。还建议等待一段时间,以便驱动器变为空闲。
- 设备,例如示例中的
/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-idle 和 HD_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
或者,在 /usr/lib/systemd/system-sleep 中创建一个钩子。