如何在 FreeBSD 中禁用硬盘旋转停止或磁头停放?

如何在 FreeBSD 中禁用硬盘旋转停止或磁头停放?

我构建了一个新的 FreeBSD 文件服务器,其中包含多个硬盘。我发现只要磁盘一段时间没有访问,它们就会完全停止旋转或停下磁头。如何禁用硬盘停止旋转或停下磁头?在 Linux 上,我知道可以通过 来完成hdparm,但在 FreeBSD 上呢?

笔记:

  1. 据我所知,这不是一个重复的问题。serverfault.com 上 99% 的“HDD spin down”搜索结果都是针对 Linux 的。serverfault.com 上唯一与“HDD spin down”相关的问题是如何通过定时器让硬盘待机(旋转减速)?,这并没有回答问题,而是利用阿泰德勒,自 2018-12-31 起已过时。其他候选包括如何让 FreeNAS 降低磁盘转速?- 没有回答问题,或者检查磁盘是否处于睡眠状态(FreeNAS)- 使用atacontrol,自 FreeBSD 11 起被删除。

  2. 在 Google 或 DuckDuckGo 上搜索“freebsd spin down hard disk”的结果大多是 forums.freebsd.org 上的旧论坛帖子或其他地方的教程,其中都包括现已过时ataidleatacontrol工具的建议。此外,没有一篇帖子解释 ATA Standby 模式与 APM 之间的关系,也没有解释扩展功率条件不存在。

因此,我相信一个参考问题“如何在 FreeBSD 中禁用硬盘旋转或磁头停放”,并详细解释 ATA 待机、APM 和 EPC,将为社区提供有用的目的,并帮助来自搜索引擎的更多读者。

答案1

在 FreeBSD 12 上,camcontrol用于控制 HDD 电源管理,包括降速和硬停。以前使用过ataidleatacontrol,但它们的功能已合并到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_cstandby_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 驱动器中的四种电源状态以及支持定时器。

  1. 积极的–设备已完全通电并准备好发送/接收数据。

  2. 闲置的–设备能够响应命令,但设备完成命令所需的时间可能比处于活动模式时更长。此状态下设备的功耗低于活动模式。如果存在硬盘,则硬盘会旋转。

  3. 支持–设备能够响应命令,但设备完成命令所需的时间可能比空闲模式更长(最多 30 秒)。功耗比空闲模式低。如果存在硬盘,则硬盘会减速。

  4. 睡觉–这是最低功耗模式。设备接口通常处于非活动状态,如果存在硬盘驱动器,则驱动器会停止旋转。设备仅在收到重置后才会退出睡眠模式。唤醒时间最长可达 30 秒。

来源:SATA 电源管理:绿色环保

换句话说,支持导致硬盘转速降低,并且闲置的是没有降速的低功耗模式。由于标准没有规定硬盘在闲置的模式,这是供应商特定的行为。根据经验猜测,它可以允许 HDD 以较低的速度旋转,或者也可以让磁头停止旋转。最后,睡觉除非您要移除硬盘或关闭系统,否则切勿使用它。

只有支持0可以通过将计时器设置为秒来禁用它。闲置的状态不受计时器控制,并且不能被禁用。

或者,您也可以将待机定时器设置为所需的数字,但是定时器的编码是真的很奇怪

表 63 — 待机定时器周期 来源:ATA/ATAPI 命令集 - 2 (ACS-2)

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) 设备执行供应商特定的电源管理功能;

来源:ATA/ATAPI 命令集 - 2 (ACS-2)

因此,如果 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 算法指示应进入待机状态时,设备应进入待机状态。

来源:ATA/ATAPI 命令集 - 2 (ACS-2)

标准并未指定 APM 的实现,因此它取决于硬盘的供应商和型号。我们唯一可以确定的是

  1. “128” 启用所有省电功能,无需降低转速。据推测,HDD 可以以较低的速度旋转,或让其磁头停止转动。

  2. 通常情况下,APM 是可以禁用的。如果 APM 被禁用,减速或头部停车也有可能被禁用,但我们无法确定。

  3. 在某些硬盘上,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种电源条件。

  1. PM1:空闲状态
  • Idle_a

    • 禁用一些电子设备。
    • 光盘全速旋转(7,200 RPM)。
  • Idle_b

    • 禁用一些电子设备。
    • 头部被卸载到驱动坡道上。
    • 光盘全速旋转(7,200 RPM)
  • Idle_c

    • 禁用一些电子设备。
    • 头部被卸载到驱动坡道上。
    • 驱动速度降低至较低 RPM(降低 RPM)
  1. 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_cStandby_yStandby_zHGST/WD Ultrastar希捷数据表。请务必检查硬盘型号的完整数据表!

很明显,对于我们所选的硬盘,禁用Standby_z会阻止硬盘减速,禁用Idle_bIdle_cStandby_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)。默认设置不可修改。默认和已保存的设置应在电源循环期间保持不变。当前设置不应在电源循环期间保持不变

来源:ATA/ATAPI 命令集 - 2 (ACS-2)

但是,可以使用明确的“保存”标志来保存或恢复当前的 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

相关内容