如何在 FreeBSD 中禁用硬盘降速或磁头停放?

比尔盖*_*尔盖子 7 freebsd hard-drive

我已经构建了一个带有多个 HDD 的新 FreeBSD 文件服务器。我发现只要有一段时间没有访问磁盘,磁盘就会完全停止旋转或停止转动。如何禁用 HDD 降速或头部停车?在 Linux 上,我知道它可以通过 来完成hdparm,但是 FreeBSD 呢?

笔记:

  1. AFAIK,这不是一个重复的问题。serverfault.com 上 99% 的“HDD 降速”搜索结果是特定于 Linux 的。serverfault.com 上唯一与“HDD 降速”相关的问题是如何在计时器上使硬盘驱动器待机(降速)?,它没有回答问题,并使用ataidle,自 2018-12-31 起已过时。其他候选包括如何让 FreeNAS 降低磁盘转速?- 不回答问题,或检查磁盘是否处于睡眠状态 (FreeNAS) - 使用atacontrol,自 FreeBSD 11 起删除。

  2. 在 Google 或 DuckDuckGo 上搜索“freebsd spin down hard disk”的结果主要是在 forums.freebsd.org 上的旧论坛帖子或其他地方的教程,其中都包含对现已过时ataidleatacontrol工具的建议。此外,没有任何帖子解释 ATA 待机模式和 APM 之间的关系,也没有对扩展电源条件的解释。

因此,我相信参考问题“如何在 FreeBSD 中禁用硬盘降速或磁头停放”,其中详细解释了 ATA Standby、APM 和 EPC,这将对社区有用,并有助于进一步搜索的读者引擎。

比尔盖*_*尔盖子 10

在 FreeBSD 12 上,camcontrol用于控制 HDD 电源管理,包括减速和硬停车。以前ataidleatacontrol已使用,但它们的功能已合并到 中camcontrol,已弃用且不再受支持。

TL; 博士

您应该在每次重新启动时运行这些命令。例如,通过/etc/rc.local.

禁用自动降速

将“备用”计时器0设置为秒,将 APM 设置为等于或大于 的数字128,并禁用 EPC “备用_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
Run Code Online (Sandbox Code Playgroud)

这对大多数人来说应该足够了。

禁用自动减速和头部停车

将“待机”计时器设置为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
Run Code Online (Sandbox Code Playgroud)

最后,应该注意的是,没有保证可以禁用头部停车的方法,最终它是供应商和模型特定的行为。我们可以尝试的最好方法是禁用尽可能多的电源管理。它通常有效,但对一些特别有问题的硬盘驱动器型号(例如 WD Green)没有影响。保存它们的唯一方法是使用特定于供应商的工具,这超出了本答案的范围。

通过 EPC 禁用自动减速或头部停车

如果您的硬盘支持 EPC,建议使用下面的 EPC 解决方案(继续阅读)禁用降速或磁头停放。要防止 HDD 降速,请禁用standby_z. 为了防止停车,关闭硬盘驱动器Idle_bIdle_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
Run Code Online (Sandbox Code Playgroud)

要通过 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
Run Code Online (Sandbox Code Playgroud)

故障排除

如果您的 HDD 不支持 APM,则会出现以下错误。如果您的硬盘只支持 EPC,您可以使用 EPC 并忽略此错误。

camcontrol: ATA SETFEATURES ENABLE APM failed
Run Code Online (Sandbox Code Playgroud)

如果您的 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
Run Code Online (Sandbox Code Playgroud)

如果无论待机/空闲定时器、APM 或 EPC 设置如何,您都无法禁用硬盘减速或磁头停放无法禁用,不幸的是,只有供应商特定的工具可以帮助您。这超出了这个答案的范围。


解释

要理解这些命令的含义,我们必须暂停一下以了解它们的技术背景。事实上,硬盘电源管理是一团糟。它由三个独立的机制控制,即基本ATA 命令集 2 (ATA8-ACS2)高级电源管理 (APM)扩展电源条件 (EPC)。此外,如果我们计算在某些 Seagate 和 WD Green 驱动器中发现的供应商专有功能,总共有四种机制,但这超出了本答案的范围。

为了获得预期的结果,必须正确配置这些机制中的每一个。例如,如果通过ATA 命令集禁用了磁盘待机计时器,但APM仍设置为低于 128 的值,磁盘仍将旋转。更复杂的是,并非所有硬盘都支持所有这些机制。比如一些企业级硬盘不支持APM,只使用EPC,我们也有支持EPC但禁用的硬盘,默认是APM,另外一些前几代硬盘和很多消费级硬盘不支持根本不支持EPC。

要获得理想的设置,必须正确配置每个电源管理机制。

ATA 命令集 2 (ATA8-ACS2)

ATA命令集2规范支持基本的电源管理。它定义了 ATA 驱动器中的四种电源状态和一个待机计时器。

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

  2. 空闲– 设备能够响应命令,但设备可能需要比处于活动模式时更长的时间来完成命令。该状态下器件的功耗低于 Active 模式。如果存在硬盘驱动器,则它会启动。

  3. 待机– 设备能够响应命令,但与空闲模式相比,设备可能需要更长的时间(最多 30 秒)来完成命令。与空闲模式相比,功耗有所降低。如果存在硬盘驱动器,它会降速。

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

资料来源:SATA 电源管理:绿色是件好事

换句话说,Standby会导致硬盘降速,而Idle是一种低功耗模式,没有降速。由于标准没有说明硬盘驱动器在空闲模式下应该做什么,它是供应商特定的行为。根据有根据的猜测,它可以让 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
Run Code Online (Sandbox Code Playgroud)

然而,魔鬼在细节中。没有保证的方法来禁用“待机”或“空闲”状态。首先,如前所述,“空闲”没有计时器,只有“待机”计时器。因此,如果 HDD 供应商决定主动进入空闲模式,并且空闲模式意味着头部停放,那么没有 EPC 您就走运了。例如,已知某些 WD Green 硬盘会主动执行磁头停放。

此外,HDD 可以在没有主机干预的情况下自行进入“空闲”或“待机”状态。

PM1:空闲:当设备收到空闲命令或空闲即时命令时,应进入此状态。某些设备可能会执行供应商特定的内部电源管理并在没有主机干预的情况下转换到空闲模式。 [...]

PM2:待机:在以下情况下应进入此状态:

  • h) 设备执行供应商特定的电源管理功能;

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

因此,如果 HDD 供应商决定积极地进入 Standby,那么您也不走运。

高级电源管理 (APM)

高级电源管理 (APM) 是 90 年代后期标准化的个人计算机电源管理机制。它早已被 ACPI 取代,但是,它仍然用于 HDD 电源管理,并且几乎所有硬盘驱动器都支持它。仅在某些企业级硬盘驱动器中不受支持。

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”启用所有省电功能而不会降低转速。据推测,硬盘驱动器可以以较低的速度旋转,或者停住它的头。

  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
Run Code Online (Sandbox Code Playgroud)

扩展电源条件 (EPC)

这是硬盘中最新的电源管理标准,通常在企业级硬盘上支持(一些较新的硬盘不支持APM,只使用EPC)。希捷将 EPC 作为PowerChoice™ 技术进行营销。

它提供了更精细的电源管理级别,比标准 ATA 命令集中的基本IdleStandby状态更具体。它定义了 2 种电源状态和 5 种电源条件。

  1. PM1:空闲状态
  • 空闲_a

    • 禁用某些电子设备。
    • 光盘全速旋转 (7,200 RPM)。
  • 空闲_b

    • 禁用某些电子设备。
    • 磁头被卸载以驱动斜坡。
    • 光盘全速旋转 (7,200 RPM)
  • 空闲_c

    • 禁用某些电子设备。
    • 磁头被卸载以驱动斜坡。
    • 驱动速度降低到较低的 RPM(降低的 RPM)
  1. PM2:待机状态
  • 待机_y

    • Idle_c希捷和 HGST(现为 WD)相同。
  • 待机_z

    • 磁头被卸载以驱动斜坡。
    • 驱动电机转速下降。

资料来源: * ATA / ATAPI命令集- 2(ACS-2) *硬盘驱动器的磁盘存储低PowerEnergy效率日立 *希捷的PowerChoice™技术提供了前所未有的硬盘节能和灵活性希捷 * Ultrastar®DC HC620硬盘HGST/Western Digital 的驱动器规格

每个电源条件都可以由定时器控制,也可以单独启用或禁用。

请注意Idle_aIdle_bIdle_cStandby_y、 或的确切含义Standby_z在标准中根本不具体!同样,由 HDD 设备制造商来实施它们。我使用了HGST/WD UltrastarSeagate数据表中的定义。请务必查看您的硬盘驱动器型号的完整数据表!

很明显地看到,我们选择的硬盘驱动器,禁用Standby_z可以防止硬盘减慢运行速度,和禁用Idle_bIdle_cStandby_y会防止头部被卸载。因此,如果您的硬盘支持 EPC,建议使用它们。

此外,在使用 EPC 之前必须先禁用 APM。

扩展电源条件功能集和高级电源管理功能集是相互排斥的。如果 EPC 功能集被禁用,所有 EPC 子命令,除了启用 EPC 功能集(见 7.49.18.6),都应返回命令中止。如果设备处理 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

# disable spin-down (Standby_z)
camcontrol epc ada1 -c state -d -p standby_z

# 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
Run Code Online (Sandbox Code Playgroud)