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
关闭硬盘驱动器电源
一种典型的使用情况是,当磁盘连接到廉价的外部 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", 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", 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 服务并启用它
/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
。
示例:为 /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 在其他驱动器上被禁用。
西部数据绿盘的电源管理
西部数据绿盘 硬盘驱动器具有特殊的 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
- 无论使用上述哪个程序,都需要完全断电才能使任何更改生效。这意味着驱动器需要断电然后再通电,简单的重启是不够的。
- 已知某些西部数据绿盘对 hdparm 的待机超时参数有不同的解释,
-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
或者,在 /usr/lib/systemd/system-sleep 中创建一个挂钩。
参见
- https://sourceforge.net/projects/hdparm/ - SourceForge 上的 hdparm