hdparm (简体中文)
hdparm 和 sdparm 是用于设置和查看硬盘驱动器参数的命令行实用程序 。 hdparm 也可以用作简单的 基准测试 工具。
最初,hdparm 是为了 IDE 磁盘创建的而 sdparm 对应的是 SCSI 磁盘。大约从 2010 年开始,存储设备接口是 IDE 和 SCSI 的增强组合,hdparm 和 sdparm 相辅相成。
安装
安装 hdparm 软件包。 对于 SCSI 设备,安装 sdparm 软件包。
使用
磁盘信息
运行下面命令获取磁盘信息:
# hdparm -I /dev/sda
基准测试
hdparm 可以被用作 基准测试。
电源管理配置
现代硬盘驱动器支持许多电源管理功能,下表总结了最常见的功能。完整列表见 hdparm(8)。
参数 | 描述 |
---|---|
-B |
设置 Advanced Power Management (APM高级电源管理)功能。可设定的值介于 1 和 255 之间,值越低意味着更积极的电源管理,值越高意味着更好的性能。从 1 到 127 的值允许降速,从 128 到 254 的值不允许。值 255 完全禁用该功能。 |
-S |
设置驱动器的待机(减速)前的超时时间。指定空闲状态(没有磁盘活动)的磁盘等待多长时间后关闭电机以节省电力。值设定为 0 禁用降速,从 1 到 240 的值指定 5 秒的倍数,从 241 到 251 的值指定 30 分钟的倍数。 |
-M |
设置 Automatic Acoustic Management (自动声学管理)功能。大多数现代硬盘驱动器都能够降低磁头移动速度以减少其噪音输出。可设定的值取决于磁盘,某些磁盘可能不支持此功能。 |
要查询当前值,请传递不带值的参数。例如:
# hdparm -B /dev/sda
要应用不同的值,例如将 APM 设置为 127:
# hdparm -B 127 /dev/sda
关闭硬盘驱动器
这个功能的一个典型使用场景是,磁盘使用的是外接 USB/SATA/FireWire enclosure 或者桥接设备连接。如果在关闭电源开关时没有正确向驱动器发出停止命令,驱动器将被强制执行紧急磁头缩回。经常这样做迟早会破坏驱动器。一种解决方案是,在确定数据已写入介质后,运行命令关闭驱动器电源:
# 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", SUBSYSTEM=="block", KERNEL=="sda", RUN+="/usr/bin/hdparm -B 254 -S 0 /dev/sda"
因为一个磁盘设备可以随机分配给一个不断变化的 /dev/sdX
,磁盘也可以通过其序列号来识别,如 Udev#Identifying a disk by its serial.
具有多个硬盘驱动器的系统可以根据某些标准以灵活的方式应用该规则。例如,要将省电设置应用于所有旋转驱动器(带旋转磁头的硬盘,尤其不包括 固态硬盘),请使用以下规则:
/etc/udev/rules.d/69-hdparm.rules
ACTION=="add|change", KERNEL=="sd[a-z]", ATTRS{queue/rotational}=="1", RUN+="/usr/bin/hdparm -B 127 /dev/%k"
唤醒后重新应用配置
如果系统挂起/休眠后配置丢失,它可以使用 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 服务并 enable 它:
/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 或降速计时器)。使用 Toshiba P300(型号 HDWD120)HDD 时观察到这一点。
此类驱动器可以使用 systemd 服务附带的 hd-idle 进行降速。 需要编辑 /etc/conf.d/hd-idle
和 HD_IDLE_OPTS
值,然后 start 和 enable hd-idle.service
。
例如为 /dev/sda
设置10 分钟空闲时间和为 /dev/disk/by-uuid/01CF0AC9AA5EAF70
设置 1 分钟空闲时间:
HD_IDLE_OPTS="-i 0 -a /dev/sda -i 600 -a /dev/disk/by-uuid/01CF0AC9AA5EAF70 -i 60"
开头的 -i 0
参数表示 hd-idle 在其他驱动器上被禁用。
西部数据绿盘的电源管理
Western Digital Green 硬盘有一个特殊的 idle3 计时器,控制驱动器在磁头定位到停放位置并进入低功耗状态之前等待多长时间。出厂默认设置为 8 秒,这可能会在短时间内发生数千个磁头加载/卸载周期并最终导致过早发生故障,更不用说在执行例行 I/O 之前经常需要唤醒驱动器对性能的影响。西部数据发布过声明,声称 Linux 没有针对低功耗存储设备进行优化,并建议降低日志记录频率。 这里有几种方法可以修改 idle3 状态:
- 西部数据提供了一个 DOS 实用程序 wdidle3.exe 下载 用于调整此设置。此实用程序旨在仅升级以下硬盘的固件: WD1000FYPS,WD7500AYPS,WD7501AYPS,但众所周知它也能够更改其他绿盘的 idle3 计时器。
- hdparm 在
-J
标志后面具有逆向工程实现,似乎至少能在几个驱动器上工作,但它不像原始官方程序那样完整。对于 Linux 使用,建议设置为 30 秒。值设定为 0 以完全禁用 WD idle3 计时器(不推荐):# hdparm -J 30 --please-destroy-my-drive /dev/sda
请参阅 #使用 udev 规则进行永久配置 在支持的硬盘驱动器上自动使用此参数。 -
idle3-tools 软件包提供了另一个非官方实用程序。原始
idle3
值作为“idle3ctl”命令的参数传递。 idle3ctl(8) 内的底部表格中提供了此值与超时(以秒为单位)之间的对应关系。以下命令将计时器设置为 30 秒:# idle3ctl -s 129 /dev/sdc
以下命令完全禁用计时器(不推荐):# idle3ctl -d /dev/sdc
- 无论使用上述哪个程序,任何更改都需要一个完整的电源循环才能生效。这意味着驱动器需要关闭然后再打开,简单的重启是不够的。
- 众所周知,一些西数绿盘对 hparm 的待机超时参数
-S 1
有不同的解释,导致计时器为 10 分钟而不是 5 秒。 - 西数绿盘在读/写期间的功耗通常约为 5.3W,空闲模式下为 4.7W,待机模式下为 0.7W。
疑难解答
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
或者,创建一个 hook in /usr/lib/systemd/system-sleep。
另请参见
- https://sourceforge.net/projects/hdparm/ - SourceForge 上的 hdparm 页面