Hard-Drive

如何在 FreeBSD 中禁用硬碟減速或磁頭停放?

  • January 20, 2021

我已經建構了一個帶有多個 HDD 的新 FreeBSD 文件伺服器。我發現只要有一段時間不訪問磁碟,磁碟就會完全減速或停止磁頭。如何禁用 HDD 減速或停車?在 Linux 上,我知道可以通過 來完成hdparm,但是 FreeBSD 呢?

筆記:

  1. AFAIK,這不是一個重複的問題。serverfault.com 上 99% 的“HDD spin down”搜尋結果是特定於 Linux 的。serverfault.com 上唯一與“HDD spin down”相關的問題是How to make hard drive standby (spin down) on a timer?,它沒有回答問題,並使用ataidle,自 2018-12-31 起已過時。其他候選人包括如何讓 FreeNAS 降低磁碟轉速?- 不回答問題,或檢查磁碟是否處於睡眠狀態(FreeNAS) - 使用atacontrol,自 FreeBSD 11 起已刪除。
  2. 在 Google 或 DuckDuckGo 上“freebsd spin down hard disk”的搜尋結果主要由 forums.freebsd.org 上的舊論壇文章或其他地方的教程組成,其中都包含關於現已過時ataidleatacontrol工具的建議。此外,沒有一篇文章解釋了 ATA Standby 模式和 APM 之間的關係,也沒有關於Extended Power Conditions的解釋。

因此,我相信參考問題“如何在 FreeBSD 中禁用硬碟降速或磁頭停放”以及 ATA Standby、APM 和 EPC 的詳細說明將對社區有用,並幫助更多來自搜尋的讀者引擎。

在 FreeBSD 12camcontrol上,用於控制 HDD 電源管理,包括減速和硬停放。以前,ataidleoratacontrol被使用,但它們的功能已經合併到camcontrol,它們已被棄用並且不再受支持。

TL;博士

您應該在每次重新啟動時執行這些命令。例如,通過/etc/rc.local.

禁用自動降速

將“待機”計時器設置為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 解決方案(繼續閱讀)來禁用降速或磁頭停車。要防止 HDD 減速,請禁用standby_z. 要防止 HDD 停放,請禁用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

故障排除

如果您的 HDD 不支持 APM,您將收到以下錯誤。如果您的硬碟只支持 EPC,您可以使用 EPC 並忽略此錯誤。

camcontrol: ATA SETFEATURES ENABLE APM failed

如果您的硬碟不支持 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 命令集禁用,但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

然而,魔鬼在細節中。無法保證禁用“待機”或“空閒”狀態。首先,如前所述,沒有“空閒”定時器,只有“待機”定時器。因此,如果 HDD 供應商決定積極進入空閒模式,並且如果空閒模式意味著頭部停放,那麼沒有 EPC,您將不走運。例如,已知某些 WD Green 硬碟驅動器會積極地執行磁頭停車。

此外,允許 HDD 自行進入“Idle”或“Standby”,無需主機干預。

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 和 Standby 定時器都設置了,那麼當定時器超時或者設備的 APM 算法指示應該進入 Standby 狀態時,設備將進入 Standby 狀態。

來源: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)。希捷將 EPC 稱為PowerChoice™ 技術

它提供了更精細的電源管理級別,比標準 ATA 命令集中的基本空閒、**待機狀態更具體。**它定義了 2 個電源狀態和 5 個電源條件。

  1. PM1:空閒狀態
  • 空閒_a

+ 禁用一些電子設備。 + 圓盤全速旋轉 (7,200 RPM)。

  • 空閒_b

+ 禁用一些電子設備。 + 磁頭被解除安裝以驅動斜坡。 + 全速旋轉的圓盤 (7,200 RPM)

  • 空閒_c

+ 禁用一些電子設備。 + 磁頭被解除安裝以驅動斜坡。 + 驅動速度降低到較低的 RPM(降低的 RPM)

  1. PM2:待機狀態
  • 待機_y

+ 與Idle_cSeagate 和 HGST(現為 WD)中的相同。

  • 待機_z

+ 磁頭被解除安裝以驅動斜坡。 + 驅動電機減速。

資料來源:

每個電源條件都可以由定時器控制,也可以單獨啟用或禁用。

請注意,、、、、或的確切含義在標準Idle_a中根本沒有具體說明!同樣,由 HDD 設備製造商來實施它們。我使用了HGST/WD UltrastarSeagate數據表中的定義。請務必查看您的硬碟型號的完整數據表!Idle_b``Idle_c``Standby_y``Standby_z

很明顯,對於我們選擇的硬碟驅動器,禁用將Standby_z防止 HDD 旋轉,禁用Idle_b將防止磁頭被解除安裝。因此,如果您的 HDD 支持 EPC,建議使用它們。Idle_c``Standby_y

此外,在使用 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

引用自:https://serverfault.com/questions/1047331