硬碟防震保護

作者:Elias Oltmanns <eo@nebensachen.de>

最後修改:2008-10-03

1. 簡介

ATA/ATAPI-7 規範透過解除安裝功能(unload feature)指定了 IDLE IMMEDIATE 命令。發出此命令應使驅動器切換到空閒模式並解除安裝磁頭。此功能在現代筆記型電腦中與加速度計和適當的軟體結合使用,以實現防震保護。其理念是在預料到危急情況時,停止內部硬碟上的所有 I/O 操作,並將磁頭停泊在斜坡上。在 GNU/Linux 系統上提供此功能的需求,是實現 Linux 核心中通用磁碟磁頭停泊介面的最初動機。然而,請注意,您的系統必須設定其他元件才能使磁碟防震保護正常工作(有關更多資訊,請參閱下面的第 3 節“參考”)。

2. 介面

對於每個 ATA 裝置,核心在 sysfs 中(此處假設掛載在 /sys 下)匯出檔案 block/*/device/unload_heads。如果裝置不支援解除安裝功能,則訪問 /sys/block/*/device/unload_heads 將被拒絕,並返回 -EOPNOTSUPP。否則,向此檔案寫入整數值將使相應驅動器的磁頭離開碟片,並在指定毫秒數內阻止所有 I/O 操作。當超時到期且在此期間沒有發出進一步的磁頭停泊請求時,將恢復正常操作。超時接受的最大值為 30000 毫秒。超過此限制將返回 -EOVERFLOW,但磁頭仍將停泊,並且超時將設定為 30 秒。但是,您始終可以透過在上次超時到期之前發出後續的磁頭停泊請求,將超時更改為 0 到 30000 之間的任何值。特別是,總超時可以超過 30 秒,更重要的是,您可以透過指定 0 作為超時來取消先前設定的超時並立即恢復正常操作。小於 -2 的值將被拒絕,並返回 -EINVAL(有關 -1 和 -2 的特殊含義,請參見下文)。如果最近的磁頭停泊請求指定的超時尚未到期,從 /sys/block/*/device/unload_heads 讀取將報告恢復正常操作前剩餘的毫秒數;否則,讀取 unload_heads 屬性將返回 0。

例如,執行以下操作,使 /dev/sda 驅動器的磁頭停泊,並停止所有 I/O 操作五秒鐘

# echo 5000 > /sys/block/sda/device/unload_heads

一個簡單的

# cat /sys/block/sda/device/unload_heads

將顯示在恢復正常操作之前還剩多少毫秒。

提醒:介面以毫秒為單位操作的事實可能會引發在現實中無法滿足的期望。事實上,ATA 規範明確指出解除安裝操作完成所需的時間是供應商特定的。ATA-7 中關於這通常在 500 毫秒內完成的提示,在 ATA-8 中似乎已被刪除。

此實現有一個技術細節可能會引起一些混淆,應在此處討論。當成功向裝置發出磁頭停泊請求後,該裝置所連線的控制器埠上的所有 I/O 操作都將被延遲。也就是說,連線到同一埠的任何其他裝置也會受到影響。唯一的例外是,向該其他裝置發出的後續磁頭解除安裝請求將立即執行。該埠上的進一步操作將延遲,直到該埠上任一裝置指定的超時到期。就 PATA(舊式 IDE)配置而言,任何單個埠上只能連線兩個裝置。在 SATA 世界中,我們有埠倍增器,這意味著使用者向一個裝置發出的磁頭停泊請求實際上可能導致停止對一整批裝置的 I/O。然而,由於此功能旨在用於筆記型電腦,並且在任何其他環境中似乎都不是很有用,因此每個埠上大多隻有一個裝置。即使 CD/DVD 燒錄機碰巧連線到與硬碟相同的埠,它通常也應該能很好地從由於對硬碟發出磁頭停泊請求而偶爾發生的緩衝區欠載中恢復。實際上,當您使用 ide 驅動程式而不是其 libata 對應驅動程式時(即您的磁碟名為 /dev/hda 而不是 /dev/sda),那麼停泊一個驅動器(驅動器 X)的磁頭通常不會像上面所描述的那樣影響同一埠上另一個驅動器(驅動器 Y)的操作模式。只有當需要埠重置才能從驅動器 Y 上的異常中恢復時,該驅動器上的進一步 I/O 操作(以及重置本身)才會被延遲,直到驅動器 X 不再處於停泊狀態。

最後,有些硬碟只符合早於 ATA-7 的 ATA 標準版本,但仍支援解除安裝功能。不幸的是,Linux 沒有安全的方法來檢測這些裝置,因此您將無法寫入 unload_heads 屬性。如果您知道您的裝置確實支援解除安裝功能(例如,因為您的筆記型電腦或硬碟本身供應商告訴過您),那麼您可以透過將特殊值 -1 寫入 unload_heads 屬性來告訴核心為該驅動器啟用此功能的使用

# echo -1 > /sys/block/sda/device/unload_heads

將為 /dev/sda 啟用該功能,而輸入 -2 而不是 -1 則會再次停用它。

3. 參考

來自不同供應商的幾款筆記型電腦都具有防震保護功能。由於製造商迄今為止拒絕支援所需軟體元件的開源開發,因此 Linux 對防震保護的支援在不同的硬體實現之間差異很大。理想情況下,本節應包含指向旨在在不同系統上實現防震保護的不同專案的列表。不幸的是,我只知道一個專案,儘管仍被認為是實驗性的,但適合使用。請隨意新增那些因我的疏忽而被遺漏的專案。

4. 致謝

此磁頭停泊的實現受到了 Jon Escombe <lists@dresco.co.uk> 最初發布的補丁的啟發。我在開發此功能的實現以使其適合合併到主線方面的工作得到了各種核心開發人員的幫助,特別是 Tejun Heo 和 Bartlomiej Zolnierkiewicz。