hdparm

出自 Arch Linux 中文维基

hdparmsdparm 是用於設置和查看硬碟驅動器參數的命令行實用程序 。 hdparm 也可以用作簡單的 基準測試 工具。

最初,hdparm 是為了 IDE 磁碟創建的而 sdparm 對應的是 SCSI 磁碟。大約從 2010 年開始,存儲設備接口是 IDE 和 SCSI 的增強組合,hdparmsdparm 相輔相成。

警告: 更改磁碟的默認參數可能會導致系統凍結甚至對磁碟造成不可逆轉的損壞。

安裝[編輯 | 編輯原始碼]

安裝 hdparm 軟體包。 對於 SCSI 設備,安裝 sdparm 軟體包。

使用[編輯 | 編輯原始碼]

磁碟信息[編輯 | 編輯原始碼]

運行下面命令獲取磁碟信息:

# hdparm -I /dev/sda

基準測試[編輯 | 編輯原始碼]

hdparm 可以被用作 基準測試

電源管理配置[編輯 | 編輯原始碼]

現代硬碟驅動器支持許多電源管理功能,下表總結了最常見的功能。完整列表見 hdparm(8)

警告: 過於激進的電源管理會因頻繁停車和降速而縮短硬碟驅動器的使用壽命。
參數 描述
-B 設置 Advanced Power Management (APM高級電源管理)功能。可設定的值介於 1 和 255 之間,值越低意味著更積極的電源管理,值越高意味著更好的性能。從 1 到 127 的值允許降速,從 128 到 254 的值不允許。值 255 完全禁用該功能。
-S 設置驅動器的待機(減速)前的超時時間。指定空閒狀態(沒有磁碟活動)的磁碟等待多長時間後關閉電機以節省電力。值設定為 0 禁用降速,從 1 到 240 的值指定 5 秒的倍數,從 241 到 251 的值指定 30 分鐘的倍數。
-M 設置 Automatic Acoustic Management (自動聲學管理)功能。大多數現代硬碟驅動器都能夠降低磁頭移動速度以減少其噪音輸出。可設定的值取決於磁碟,某些磁碟可能不支持此功能。
注意: 當同時設置 -B-S 參數時,APM 的值小於 128 可能會導致驅動器在 -S 超時值之前減速。詳見 [1].

要查詢當前值,請傳遞不帶值的參數。例如:

# hdparm -B /dev/sda

要應用不同的值,例如將 APM 設置為 127:

# hdparm -B 127 /dev/sda

關閉硬碟驅動器[編輯 | 編輯原始碼]

這個功能的一個典型使用場景是,磁碟使用的是外接 USB/SATA/FireWire enclosure 或者橋接設備連接。如果在關閉電源開關時沒有正確向驅動器發出停止命令,驅動器將被強制執行緊急磁頭縮回。經常這樣做遲早會破壞驅動器。一種解決方案是,在確定數據已寫入介質後,運行命令關閉驅動器電源:

# hdparm -Y /dev/sdX
警告: 絕對要確保
  1. 即使數據實際上已寫入完成。還建議等待一段時間,以待驅動器空閒。
  2. 驅動器, 比如/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#Identifying a disk by its serial.

具有多個硬碟驅動器的系統可以根據某些標準以靈活的方式應用該規則。例如,要將省電設置應用於所有旋轉驅動器(帶旋轉磁頭的硬碟,尤其不包括 固態硬碟),請使用以下規則:

/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 服務並 enable 它:

/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 或降速計時器)。使用 Toshiba P300(型號 HDWD120)HDD 時觀察到這一點。

此類驅動器可以使用 systemd 服務附帶的 hd-idle 進行降速。 需要編輯 /etc/conf.d/hd-idleHD_IDLE_OPTS 值,然後 startenable 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 在其他驅動器上被禁用。

威騰電子綠盤的電源管理[編輯 | 編輯原始碼]

Western Digital Green 硬碟有一個特殊的 idle3 計時器,控制驅動器在磁頭定位到停放位置並進入低功耗狀態之前等待多長時間。出廠默認設置為 8 秒,這可能會在短時間內發生數千個磁頭加載/卸載周期並最終導致過早發生故障,更不用說在執行例行 I/O 之前經常需要喚醒驅動器對性能的影響。威騰電子發布過聲明,聲稱 Linux 沒有針對低功耗存儲設備進行優化,並建議降低日誌記錄頻率。 這裡有幾種方法可以修改 idle3 狀態:

  1. 威騰電子提供了一個 DOS 實用程序 wdidle3.exe 下載 用於調整此設置。此實用程序旨在僅升級以下硬碟的固件: WD1000FYPS,WD7500AYPS,WD7501AYPS,但眾所周知它也能夠更改其他綠盤的 idle3 計時器。
  2. hdparm 在 -J 標誌後面具有逆向工程實現,似乎至少能在幾個驅動器上工作,但它不像原始官方程序那樣完整。對於 Linux 使用,建議設置為 30 秒。值設定為 0 以完全禁用 WD idle3 計時器(不推薦):
    # hdparm -J 30 --please-destroy-my-drive /dev/sda
    請參閱 #使用 udev 規則進行永久配置 在支持的硬碟驅動器上自動使用此參數。
  3. idle3-tools 軟體包提供了另一個非官方實用程序。原始 idle3 值作為「idle3ctl」命令的參數傳遞。 idle3ctl(8) 內的底部表格中提供了此值與超時(以秒為單位)之間的對應關係。以下命令將計時器設置為 30 秒:
    # idle3ctl -s 129 /dev/sdc
    以下命令完全禁用計時器(不推薦):
    # idle3ctl -d /dev/sdc
注意:
  • 無論使用上述哪個程序,任何更改都需要一個完整的電源循環才能生效。這意味著驅動器需要關閉然後再打開,簡單的重啟是不夠的。
  • 眾所周知,一些西數綠盤對 hparm 的待機超時參數 -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
注意: sleep.target 被所有 suspendhybrid-sleephibernate 目標拉取,但它在系統掛起之前完成啟動,因此必須明確指定三個目標。 詳見[2]

或者,創建一個 hook in /usr/lib/systemd/system-sleep

另請參見[編輯 | 編輯原始碼]