我构建了一个新的 FreeBSD 文件服务器,其中包含多个硬盘。我发现只要磁盘一段时间没有访问,它们就会完全停止旋转或停下磁头。如何禁用硬盘停止旋转或停下磁头?在 Linux 上,我知道可以通过 来完成hdparm
,但在 FreeBSD 上呢?
笔记:
据我所知,这不是一个重复的问题。serverfault.com 上 99% 的“HDD spin down”搜索结果都是针对 Linux 的。serverfault.com 上唯一与“HDD spin down”相关的问题是如何通过定时器让硬盘待机(旋转减速)?,这并没有回答问题,而是利用阿泰德勒,自 2018-12-31 起已过时。其他候选包括如何让 FreeNAS 降低磁盘转速?- 没有回答问题,或者检查磁盘是否处于睡眠状态(FreeNAS)- 使用
atacontrol
,自 FreeBSD 11 起被删除。在 Google 或 DuckDuckGo 上搜索“freebsd spin down hard disk”的结果大多是 forums.freebsd.org 上的旧论坛帖子或其他地方的教程,其中都包括现已过时
ataidle
或atacontrol
工具的建议。此外,没有一篇帖子解释 ATA Standby 模式与 APM 之间的关系,也没有解释扩展功率条件不存在。
因此,我相信一个参考问题“如何在 FreeBSD 中禁用硬盘旋转或磁头停放”,并详细解释 ATA 待机、APM 和 EPC,将为社区提供有用的目的,并帮助来自搜索引擎的更多读者。
答案1
在 FreeBSD 12 上,camcontrol
用于控制 HDD 电源管理,包括降速和硬停。以前使用过ataidle
或atacontrol
,但它们的功能已合并到camcontrol
,它们已被弃用并且不再受支持。
总结
每次重启时都应运行这些命令。例如,通过/etc/rc.local
。
持久性
电源管理设置,包括定时器、APM 和 EPC 设置不是至少默认情况下是持久的,并且应该在每次重新启动时运行。如果使用 EPC,则可以保存设置,但默认情况下它仍然不是持久的,除非明确设置标志。
这里不介绍此标志的使用,因为这是永久性的 HDD 设置更改。答案末尾提供了一种永久保存和恢复 EPC 设置的方法。
禁用自动降速
将“待机”计时器设置为0
秒,将 APM 设置为等于或大于的数字128
,并禁用 EPC“standby_z”计时器。不要忘记更改ada1
为您的硬盘。
# ATA has a "Standby" timer, but there's no "Idle" timer. The time
# `-t` is for standby timer.
# XXX: This command put the disk to Idle immediately, even if we only
# want to program a timer, there is no way to do that otherwise.
# But it's only a one-time event on boot, it shouldn't matter.
camcontrol idle ada1 -t 0
# Enable APM should automatically disable EPC. If "camcontrol apm"
# succeeds but "camcontrol epc" fails, it's safe to ignore. Vice versa,
# if "camcontrol epc" succeeds but "camcontrol apm" fails, it's also
# safe to ignore.
camcontrol apm ada1 -l 128
camcontrol epc ada1 -c state -d -p standby_z
对于大多数人来说这应该已经足够了。
禁用自动旋转和头部停车
将“待机”计时器设置为0
秒,禁用 APM,并禁用 EPC。
这实际上会禁用所有电源管理。如果您的硬盘支持 EPC,建议使用下面的 EPC 解决方案(继续阅读),而不是盲目禁用所有电源管理。此外,如果您没有看到加载/卸载循环计数在 SMART 中,您可能不需要它,禁用旋转就足够了。
# There is a "Standby" timer, but there is no
# "Idle" timer. Actually both "standby -t" and
# "idle -t" program the same "Standby" timer.
camcontrol idle ada1 -t 0
# not specify a number = disable apm
camcontrol apm ada1
# EPC is not necessaily supported, it can fail
camcontrol epc ada1 -c disable
最后,应该注意的是,没有保证可以禁用磁头停放的方法,最终这是供应商和型号特定的行为。我们可以尝试的最好的方法是禁用尽可能多的电源管理。它通常有效,但对某些特别有问题的硬盘型号(例如 WD Green)没有影响。挽救它们的唯一方法是使用特定于供应商的工具,这超出了本答案的范围。
通过 EPC 禁用自动旋转减速或磁头停止
如果您的硬盘支持 EPC,建议使用下面的 EPC 解决方案(继续阅读)来禁用旋转停止或磁头停放。要防止硬盘旋转停止,请禁用standby_z
。要防止硬盘停放,请Idle_b
禁用Idle_c
和standby_y
。
首先,检查你的硬盘是否支持EPC。
# check whether EPC is supported
camcontrol identify ada1 | grep "Feature\|extended power conditions"
# see the current EPC power state
camcontrol epc ada1 -c status
要通过 EPC 启用和禁用旋转减速...
# disable APM first, and enable EPC.
# APM can fail if the HDD only support EPC, which is okay.
camcontrol apm ada1
camcontrol epc ada1 -c enable
# disable spin-down (Standby_z) via EPC
camcontrol epc ada1 -c state -d -p standby_z
# just in case, also disable the Standby timer
camcontrol idle ada1 -t 0
### Optional: disable head parking ###
# disable head parking (Idle_b, Idle_c, Standby_y)
camcontrol epc ada1 -c state -d -p idle_b
camcontrol epc ada1 -c state -d -p idle_c
camcontrol epc ada1 -c state -d -p standby_y
故障排除
如果你的硬盘不支持APM,你会得到以下错误。如果你的硬盘只支持EPC,你可以使用EPC并忽略此错误。
camcontrol: ATA SETFEATURES ENABLE APM failed
如果您的 HDD 不支持 EPC(或者 EPC 已被完全禁用,例如,启用 APM 也会自动禁用 EPC),您可以使用 APM 并忽略此错误。
SETFEATURES EXTENDED POWER CONDITIONS. ACB: ef 4a 03 00 00 40 00 00 00 00 00 00
CAM status: ATA Status Error
ATA status: 51 (DRDY SERV ERR), error: 04 (ABRT )
RES: 51 04 00 00 00 00 00 00 00 00 00
如果您无法禁用硬盘减速或无法禁用磁头停放(无论待机/空闲计时器、APM 或 EPC 设置如何),很遗憾,只有供应商特定的工具可以帮助您。这超出了本回答的范围。
解释
要理解这些命令的含义,我们必须先停下来了解一下它们的技术背景。事实上,硬盘电源管理很乱。它由三个独立的机制控制,即基本ATA 命令集 2 (ATA8-ACS2),高级电源管理 (APM), 和扩展功率条件 (EPC)。此外,如果我们算上 Seagate 和 WD Green 硬盘中的供应商专有功能,则有四机制,但这超出了本答案的范围。
为了获得预期的结果,必须正确配置这些机制。例如,如果磁盘支持定时器被禁用通过ATA 命令集, 但加速计划仍设置为低于 128 的值,磁盘仍将减速。而且,问题更复杂的是,并非所有硬盘都支持所有这些机制。例如,一些企业级 HDD 不支持 APM 并仅使用 EPC,我们也有支持 EPC 但禁用它、默认为 APM 的 HDD,此外,一些早期 HDD 和许多消费级 HDD 根本不支持 EPC。
为了获得理想的设置,必须正确配置每个电源管理机制。
ATA 命令集 2 (ATA8-ACS2)
这ATA 命令集 2规范支持基本电源管理。它定义了 ATA 驱动器中的四种电源状态以及支持定时器。
积极的–设备已完全通电并准备好发送/接收数据。
闲置的–设备能够响应命令,但设备完成命令所需的时间可能比处于活动模式时更长。此状态下设备的功耗低于活动模式。如果存在硬盘,则硬盘会旋转。
支持–设备能够响应命令,但设备完成命令所需的时间可能比空闲模式更长(最多 30 秒)。功耗比空闲模式低。如果存在硬盘,则硬盘会减速。
睡觉–这是最低功耗模式。设备接口通常处于非活动状态,如果存在硬盘驱动器,则驱动器会停止旋转。设备仅在收到重置后才会退出睡眠模式。唤醒时间最长可达 30 秒。
换句话说,支持导致硬盘转速降低,并且闲置的是没有降速的低功耗模式。由于标准没有规定硬盘在闲置的模式,这是供应商特定的行为。根据经验猜测,它可以允许 HDD 以较低的速度旋转,或者也可以让磁头停止旋转。最后,睡觉除非您要移除硬盘或关闭系统,否则切勿使用它。
只有支持0
可以通过将计时器设置为秒来禁用它。闲置的状态不受计时器控制,并且不能被禁用。
或者,您也可以将待机定时器设置为所需的数字,但是定时器的编码是真的很奇怪!
hdparm
可以从手册页中找到简洁的摘要:
1 到 240 之间的值指定 5 秒的倍数,从而产生从 5 秒到 20 分钟的超时。241 到 251 之间的值指定从 1 到 11 个 30 分钟的单位,从而产生从 30 分钟到 5.5 小时的超时。252 值表示 21 分钟的超时。253 值设置供应商定义的 8 到 12 小时之间的超时期限,而 254 值是保留的。255 被解释为 21 分钟加 15 秒。请注意,一些较旧的驱动器对这些值的解释可能非常不同。
在 FreeBSD 上,
# check whether ATA power management is supported
# don't omit "^", or you'll get "advanced power management"
camcontrol identify ada1 | grep "Feature\|^power management"
# set standby timer, 0 to disable
camcontrol idle ada1 -t 0
# "idle -t 0" is equivalent to "standby -t 0", it set the same
# "Standby" timer, but without forcing the device to standby,
# only to "idle", which allows a quicker recovery. There is
# no way to set the timer without actually send an "idle"
# or "standby" command.
camcontrol idle ada1 -t 0
然而,细节决定成败。没有万无一失的方法可以禁用“待机”或“空闲”状态。首先,如前所述,“空闲”没有计时器,只有“待机”计时器。因此,如果 HDD 供应商决定积极进入空闲状态,并且空闲模式意味着磁头停放,那么没有 EPC 你就走运了。例如,一些 WD Green 硬盘以积极执行磁头停放而闻名。
此外,无需主机干预,HDD 可以自行进入“空闲”或“待机”状态。
PM1:空闲:当设备接收到IDLE命令或IDLE IMMEDIATE命令时,应进入此状态。某些设备可能会执行特定于供应商的内部电源管理,并在没有主机干预的情况下转换到空闲模式。 [...]
PM2:待机:当出现以下情况时,应进入此状态:
- h) 设备执行供应商特定的电源管理功能;
因此,如果 HDD 供应商决定积极进入待机状态,您也会倒霉的。
高级电源管理 (APM)
高级电源管理 (APM) 是 20 世纪 90 年代末标准化的个人电脑电源管理机制。它早已被 ACPI 取代,但它仍然用于硬盘电源管理,并且几乎所有硬盘都支持它。只有一些企业级硬盘不支持它。
APM 级别是一个范围,从最低功耗设置 01h 到最高性能级别 FEh。表 120 显示了这些值。设备性能可能会随着 APM 级别的提高而提高。设备功耗可能会随着电源管理级别的提高而提高。APM 级别可能包含离散频段(例如,设备可以从 80h 到 A0h 实现一种 APM 方法,从 A1h 到 FEh 级别实现一种性能更高、功耗更高的方法)。APM 级别 80h 及更高级别不允许设备降速以节省电量。子命令代码 85h 禁用 APM。子命令 85h 可能无法在所有实现 SET FEATURES 子命令 05h 的设备上实现。
表 120:APM 级别
- 00h(0):保留
- 01h (1): 待机状态下最低功耗
- 02h-7Fh(2-127):带待机的中级电源管理级别
- 80h(128):无待机时最低功耗
- 81h-FDh(129-254):无待机的中级电源管理级别
- FEh(254):最高性能
- FFh(255):保留
APM 独立于待机定时器。如果同时设置了 APM 和待机定时器,则当定时器到期或设备的 APM 算法指示应进入待机状态时,设备应进入待机状态。
标准并未指定 APM 的实现,因此它取决于硬盘的供应商和型号。我们唯一可以确定的是
“128” 启用所有省电功能,无需降低转速。据推测,HDD 可以以较低的速度旋转,或让其磁头停止转动。
通常情况下,APM 是可以禁用的。如果 APM 被禁用,减速或头部停车也有可能被禁用,但我们无法确定。
在某些硬盘上,APM无法被禁用,或者我们可以使用“254”,即APM定义的最大性能模式。
在 FreeBSD 中,
# check whether APM is supported
camcontrol identify ada1 | grep "Feature\|advanced power management"
# set APM level
camcontrol apm ada1 -l 128
# disable APM
camcontrol apm ada1
扩展功率条件 (EPC)
这是硬盘中最新的电源管理标准,通常由企业级硬盘支持(一些较新的硬盘不支持 APM,仅使用 EPC)。Seagate 将 EPC 销售为PowerChoice™ 技术。
它提供了更精细的电源管理级别,比基本级别更具体闲置的,支持标准ATA命令集中的状态。它定义了2种电源状态和5种电源条件。
- PM1:空闲状态
Idle_a
- 禁用一些电子设备。
- 光盘全速旋转(7,200 RPM)。
Idle_b
- 禁用一些电子设备。
- 头部被卸载到驱动坡道上。
- 光盘全速旋转(7,200 RPM)
Idle_c
- 禁用一些电子设备。
- 头部被卸载到驱动坡道上。
- 驱动速度降低至较低 RPM(降低 RPM)
- PM2:待机状态
待机
Idle_c
与 Seagate 和 HGST (现为 WD)相同。待机
- 头部被卸载到驱动坡道上。
- 驱动电机旋转减速。
来源: *ATA/ATAPI 命令集 - 2 (ACS-2) *低功耗硬盘磁盘存储的能源效率日立 *Seagate® PowerChoice™ 技术提供前所未有的硬盘节能和灵活性Seagate 出品 *Ultrastar® DC HC620 硬盘驱动器规格由HGST/Western Digital制造。
每个电源条件都可以由计时器控制,也可以单独启用或禁用。
请注意,标准中根本没有明确说明Idle_a
、、、或的Idle_b
确切含义!同样,这取决于硬盘设备制造商来实现它们。我使用了Idle_c
Standby_y
Standby_z
HGST/WD Ultrastar和希捷数据表。请务必检查硬盘型号的完整数据表!
很明显,对于我们所选的硬盘,禁用Standby_z
会阻止硬盘减速,禁用Idle_b
和Idle_c
会Standby_y
阻止磁头卸载。因此,如果您的硬盘支持 EPC,建议使用它们。
另外,在使用 EPC 之前必须先禁用 APM。
扩展电源条件功能集和高级电源管理功能集是互斥的。如果 EPC 功能集被禁用,则除启用 EPC 功能集(参见 7.49.18.6)之外的所有 EPC 子命令都应返回命令中止。如果设备处理 SET FEATURES Enable APM 子命令时没有错误,并且 IDENTIFY DEVICE 数据字 120 位 7(参见 7.17.7.41)设置为 1,则设备应禁用 EPC 功能集。
在 FreeBSD 中,
# check whether EPC is supported
camcontrol identify ada1 | grep "Feature\|extended power conditions"
# see the current EPC power state
camcontrol epc ada1 -c status
# disable APM first
camcontrol apm ada1
# enable EPC
camcontrol epc ada1 -c enable
# temporarily disable spin-down (Standby_z)
camcontrol epc ada1 -c state -d -p standby_z
# temporarily disable head parking (Idle_b, Idle_c, Standby_y)
camcontrol epc ada1 -c state -d -p idle_b
camcontrol epc ada1 -c state -d -p idle_c
camcontrol epc ada1 -c state -d -p standby_y
保存设置
默认情况下,EPC 设置在重启后不会保留。
4.8.2 电源条件:每种电源条件都有一组当前、已保存和默认设置(见 A.8)。默认设置不可修改。默认和已保存的设置应在电源循环期间保持不变。当前设置不应在电源循环期间保持不变
但是,可以使用明确的“保存”标志来保存或恢复当前的 EPC 设置。
timer
和子命令支持“save”标志,state
用于保存重新编程的计时器或重新配置的电源状态。在 FreeBSD 上,例如:
# temporarily disable spin-down (Standby_z)
camcontrol epc ada1 -c state -d -p standby_z
# permanently disable spin-down (Standby_z)
camcontrol epc ada1 -c state -d -p standby_z -s
该restore
子命令可用于将 HDD 设置恢复为之前保存的或出厂默认设置。
# temporarily restore the HDD to factory-default EPC settings
camcontrol epc ada1 -c restore -r default
# temporarily restore the HDD to user-saved EPC settings
camcontrol epc ada1 -c restore -r saved
# permenantly restore the user-saved EPC setting to factory default
camcontrol epc ada1 -c restore -r default -s