hdparm - Arch Linux 中文维基

跳至內容

# hdparm

出自 Arch Linux 中文维基

相關文章

- 安全地擦除磁碟#hdparm

翻譯狀態：

- 本文（或部分內容）譯自 ︁Hdparm，最近一次同步於 2025-02-04，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

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

最初 hdparm 被設計用於 IDE 硬碟，而 sdparm 對應的是 SCSI 硬碟。大約從 2010 年開始，存儲設備接口變成了 IDE 和 SCSI 的增強組合，hdparm 和 sdparm 在功能上也形成互補。

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

## 安裝

安裝 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]。
- 現在還無法讀取 `-S` 的值。

要查詢當前值，請傳遞不帶值的參數。以 `-B` 為例：

    # hdparm -B /dev/sda

要應用不同的值，例如將 APM 設置為 127：

    # hdparm -B 127 /dev/sda

### 寫入緩存

寫入緩存是指在將數據寫入硬碟前暫時將文件緩存到硬碟板載內存的行為，同時可以提升性能。大多數硬碟都提供了寫入緩存並默認啟用。使用以下命令可以進行檢查：

    $ hdparm -W /dev/sdX

警告：寫入緩存可以提升性能，但也提升了突然斷電時丟失數據的風險。

如果顯示被禁用，可以使用如下命令進行啟用：

    $ hdparm -W 1 /dev/sdX

另外也可以將其禁用：

    $ hdparm -W 0 /dev/sdX

### 關閉硬碟驅動器

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

    # 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 服務並啟用它：

    /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 時會觀察到這一點。

此類驅動器可以使用 hd-idleAUR 附帶的 systemd 服務進行降速。需要編輯 `/etc/conf.d/hd-idle` 和 `HD_IDLE_OPTS` 值，然後啟動和啟用 `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` 被所有 `suspend`、`hybrid-sleep` 和 `hibernate` 目標拉取，但它在系統掛起之前就會完成啟動，因此必須明確指定三個目標。詳見[2]。

也可以在 /usr/lib/systemd/system-sleep 中創建一個鉤子。

## 另請參見

- https://sourceforge.net/projects/hdparm/ - SourceForge 上的 hdparm 頁面

分類：​

- 文件系統
- 存儲

hdparm
新增話題