固態硬碟/存儲單元擦除
有時,可能希望將固態硬碟完全重置到其出廠時的「乾淨」狀態,這可以將其寫入性能恢復到出廠時的水平。即使固態硬碟原生支持TRIM,寫入性能也會隨著時間的推移而下降,這是由於 TRIM 僅在文件刪除時起作用,而對文件替換(例如增量保存)無效。
注意,執行安全擦除不能重置固態硬碟單元的損耗狀態。在安全擦除後,一個接近使用壽命的硬碟在短時間內可能可再次寫入,但在不久之後仍會失效。
- 繼續操作前請備份所有重要數據!此過程將銷毀固態硬碟上的所有數據,即使專業數據恢復服務提供商也無法恢復數據!完成此過程後,需要重新分區設備並將需要的數據重新複製到硬碟上!
- 如果要擦除的硬碟不是直接連接到SATA/NVMe接口,請不要繼續。在通過USB或SAS/RAID卡連接的硬碟上執行安全擦除/格式化/淨化(Sanitize)命令可能會導致硬碟變磚!
ATA有兩個用於擦除硬碟的命令——SECURITY ERASE UNIT 和 ENHANCED SECURITY ERASE UNIT。[1]
執行以下命令:
# hdparm -I /dev/sdX | grep frozen
在輸出的安全(security)部分,應該顯示 not frozen。若顯示 frozen,將無法進行下一步操作。詳見固態硬碟#凍結模式。
一個可能的解決方法是,掛起系統(注意要使用 S3 而非 S0ix)。喚醒後,凍結狀態很可能會被解除。若不成功,且硬碟通過SATA接口連接,可以嘗試熱插拔硬碟數據線(注意,這可能會導致內核崩潰)。如果熱插拔SATA數據線導致內核崩潰,重啟系統,在系統完全啟動後,快速地熱插拔SATA電源線和數據線。如果熱插拔SATA線仍然導致內核崩潰,請確保在BIOS中啟用了AHCI(AHCI允許進行熱插拔操作,不應引起系統崩潰)。如果有支持熱插拔的USB-to-SATA適配器,可嘗試通過適配器連接設備。此外,還可通過 USB 使用 hdparm包。
如果命令輸出顯示"frozen",或許可以通過以下方式解決:
- 啟動時按 F2,進入 Dell BIOS。
- 在 BIOS 中設置內置硬碟密碼(注意,BIOS中使用的鍵盤布局是 en_US / qwerty)。
- 應用更改並重啟。
- 當 Dell Security Manager 提示輸入密碼時,直接按ESC而不要輸入密碼。硬碟將保持鎖定但非凍結狀態。
- 在下文的步驟中,跳過啟用安全功能的部分,直接執行擦除命令。
由於只是臨時性地使用密碼,因此對密碼強度沒有要求,可以使用任何密碼。安全擦除後,密碼將被重置為 NULL。在本例中,假定密碼為 PasSWorD:
# hdparm --user-master u --security-set-pass PasSWorD /dev/sdX
security_password="PasSWorD" /dev/sdX: Issuing SECURITY_SET_PASS command, password="PasSWorD", user=user, mode=high
執行如下命令檢查設置是否成功:
# hdparm -I /dev/sdX
命令輸出應為"enabled":
Security:
Master password revision code = 65534
supported
enabled
not locked
not frozen
not expired: security count
supported: enhanced erase
Security level high
2min for SECURITY ERASE UNIT. 2min for ENHANCED SECURITY ERASE UNIT.
最後一步是執行 ATA SECURITY ERASE UNIT 命令,指示設備固件擦除其內容。注意,對於本例中使用的設備,前面的輸出顯示:
2min for SECURITY ERASE UNIT. 2min for ENHANCED SECURITY ERASE UNIT.
根據 ATA 規範,「增強型」安全擦除(--security-erase-enhanced)會執行更徹底的擦除。如果兩個命令的預計完成時間相等,表明硬碟製造商簡化了規範,對兩個命令使用了相同的擦除功能。若預計時間較短(如2分鐘),表明該設備是自加密的,執行安全擦除操作時,其固件將只擦除內部的加密密鑰,而不是覆寫所有數據單元。[4]
- 請再三檢查是否使用了正確的硬碟代號。一旦確認命令,將無法挽回。
- 確保執行命令時硬碟未被掛載。如果在設備已掛載時執行安全擦除命令,可能無法正常完成擦除。
# hdparm --user-master u --security-erase PasSWorD /dev/sdX
等待命令完成。對於在本例中使用的Intel X25-M 80GB固態硬碟,該過程耗時約 40 秒。
security_password="PasSWorD" /dev/sdX: Issuing SECURITY_ERASE command, password="PasSWorD", user=user 0.000u 0.000s 0:39.71 0.0% 0+0k 0+0io 0pf+0w
硬碟現已被擦除。成功擦除後,硬碟安全狀態應當已經被自動設置為禁用(因此不再需要密碼即可訪問)。可通過如下命令驗證:
# hdparm -I /dev/sdX
命令輸出應顯示 "not enabled":
Security:
Master password revision code = 65534
supported
not enabled
not locked
not frozen
not expired: security count
supported: enhanced erase
2min for SECURITY ERASE UNIT. 2min for ENHANCED SECURITY ERASE UNIT.
NVMe 硬碟不使用 SATA 接口,因而不能使用與 SATA 固態硬碟相同的方式進行清理。NVMe 規範定義了一種標準化的格式化 NVMe 硬碟的方法。最初,可通過nvme-format(1) 命令(nvme-cli包 的一部分)進行格式化。在此基礎之上,1.3 版規範增加了專用的 nvme-sanitize(1) 命令。NVM Express 聯盟對上述命令的描述如下:
- 這些命令用於安全地擦除設備上的用戶數據。可在部署新設備、報廢舊設備、設備壽命耗盡、將設備用於新應用等場景使用。在 NVMe 1.3 規範中引入淨化(Sanitize)之前,NVMe 格式化(Format)專門用於執行安全擦除。雖然格式化與淨化都能擦除數據,但淨化在確保數據被正確擦除方面更為可靠;格式化則適用於日常使用和測試。
要獲取硬碟支持的功能,使用Identify Controller命令:
# nvme id-ctrl /dev/nvme0 -H | grep -E 'Format |Crypto Erase|Sanitize'
示例輸出:
[1:1] : 0x1 Format NVM Supported
[29:29] : 0 No-Deallocate After Sanitize bit in Sanitize command Supported
[2:2] : 0 Overwrite Sanitize Operation Not Supported
[1:1] : 0x1 Block Erase Sanitize Operation Supported
[0:0] : 0x1 Crypto Erase Sanitize Operation Supported
[2:2] : 0x1 Crypto Erase Supported as part of Secure Erase
[1:1] : 0 Crypto Erase Applies to Single Namespace(s)
[0:0] : 0 Format Applies to Single Namespace(s)
在概念上,格式化(Format)命令更接近於hdparm和fdisk的結合體。能夠設置硬碟的底層參數,並額外發送安全擦除命令。
nvme-format(1)介紹了關於安全擦除選項(-s/--ses)的如下信息:
- 安全擦除設置:此欄位指定是否應在格式化過程中執行安全擦除以及安全擦除操作的類型。擦除操作將作用於所有用戶數據,無論其位置如何(例如,在向作業系統暴露的 LBA 內、在緩存內、在已釋放的 LBA 內等)。默認為 0。
可能的值:
| 值 | 定義 |
|---|---|
| 0 | 不執行安全擦除操作 |
| 1 | 用戶數據擦除:所有用戶數據都將被擦除,擦除後用戶數據的內容是不確定的(例如,用戶數據可能被填充為全零、全一等)。如果所有用戶數據都已加密,控制器在收到用戶數據擦除請求時可能轉而選擇執行加密擦除。 |
| 2 | 加密擦除:所有用戶數據都將通過密碼學加密方式擦除。通過擦除加密密鑰完成。 |
格式化命令支持對整個NVMe字符設備(例如/dev/nvme0)或特定的命名空間塊設備(例如/dev/nvme0n1)進行擦除操作。但不同硬碟對命名空間擦除的支持情況不同,在執行格式化操作前,需確保硬碟的支持情況。例如,在本例Identify Controller命令的輸出中,Crypto Erase Applies to Single Namespace(s)和Format Applies to Single Namespace(s)位被設置為零,根據規範,這意味著「控制器支持基於每個命名空間的格式化」(參見「Non-Volatile Memory Host Controller Interface」文檔中,圖表82「Identify Controller Data Structure」中對第524位元組,「Format NVM Attributes」欄位的描述[5])。
例如,要對/dev/nvme0設備命名空間1使用加密擦除方式進行格式化:
# nvme format /dev/nvme0 -s 2 -n 1
使用-n 0xffffffff可格式化所有命名空間。
有關設備/命名空間選擇的更多信息和注意事項,參見nvme-format(1)。
淨化(Sanitize)命令用於實現「在功能上等同於 SATA 和 SAS 實現中同名的命令」的功能[6]。前述文章中提到:
- 根據 NVMe 1.4 規範,「淨化操作會改變 NVM 子系統中的所有用戶數據,使得不可能從任何緩存、非易失性介質或任何控制器內存緩衝區中恢復任何先前的用戶數據。」
- 淨化和格式化之間的最大區別在於,淨化確保緩存被擦除,並且在意外斷電後重新啟動時,該過程會重新開始。對於安全擦除操作,淨化還支持使用特定模式覆寫(pattern overwrite)。注意,對於NAND存儲設備,使用特定模式覆寫將損耗快閃記憶體壽命。因此,特定模式覆寫一般用於使用其它存儲方式的設備,但若要進一步降低用戶數據恢復的可能性,也可以用於NAND存儲設備。
-a/--sanact選項的用法和可能取值參見nvme-sanitize(1)。
根據NVMe 1.4 規範中的定義,塊擦除和加密擦除的區別在於,加密擦除僅擦除加密密鑰:
- 用戶數據擦除:所有用戶數據都將被擦除,擦除後用戶數據的內容是不確定的(例如,用戶數據可能被填充為全零、全一等)。如果所有用戶數據都已加密,控制器在收到用戶數據擦除請求時可能轉而選擇執行加密擦除。
- 加密擦除:所有用戶數據都將通過密碼學加密方式擦除。通過擦除加密密鑰完成。
- …
- 塊擦除淨化操作使用依介質而異的低級塊擦除方法,更改 NVM 子系統中可能存儲用戶數據的所有位置的用戶數據;
- 加密擦除淨化操作通過更改 NVM 子系統中可能存儲用戶數據的所有位置的介質加密密鑰來更改用戶數據…
可以獲取硬碟執行各種擦除操作所需時間的估計值(如果支持):
# nvme sanitize-log /dev/nvme0
... Estimated Time For Overwrite : 4294967295 (No time period reported) Estimated Time For Block Erase : 174 Estimated Time For Crypto Erase : 34
如果得到如下結果:
# nvme sanitize-log /dev/nvme0
... Estimated Time For Overwrite : 4294967295 (No time period reported) Estimated Time For Block Erase : 4294967295 (No time period reported) Estimated Time For Crypto Erase : 4294967295 (No time period reported)
說明擦除操作將需要很長時間才能完成。例如,在一塊報告了上述結果的 Intel 660p 512GB 硬碟上,塊擦除大約需要 2-3 小時才能完成。
要開始加密擦除淨化操作:
# nvme sanitize device -a start-crypto-erase
device 參數必須指向整個NVMe字符設備(例如 /dev/nvme0 而不是 /dev/nvme0n1)。加密擦除淨化操作只適用於整個設備。若要使用塊擦除:
# nvme sanitize device -a start-block-erase
可以使用淨化日誌(Sanitize Log)跟蹤進度:
# nvme sanitize-log /dev/nvme0
對於正在進行加密擦除的硬碟,輸出應形如:
Sanitize Progress (SPROG) : 655 Sanitize Status (SSTAT) : 0x4 Sanitize Command Dword 10 Information (SCDW10) : 0x4 Estimated Time For Overwrite : 4294967295 (No time period reported) Estimated Time For Block Erase : 174 Estimated Time For Crypto Erase : 34 Estimated Time For Overwrite (No-Deallocate) : 0 Estimated Time For Block Erase (No-Deallocate) : 0 Estimated Time For Crypto Erase (No-Deallocate): 0
當擦除操作完成時,輸入應形如:
Sanitize Progress (SPROG) : 65535 Sanitize Status (SSTAT) : 0x101 Sanitize Command Dword 10 Information (SCDW10) : 0x4 Estimated Time For Overwrite : 4294967295 (No time period reported) Estimated Time For Block Erase : 174 Estimated Time For Crypto Erase : 34 Estimated Time For Overwrite (No-Deallocate) : 0 Estimated Time For Block Erase (No-Deallocate) : 0 Estimated Time For Crypto Erase (No-Deallocate): 0
blkdiscard(8)命令(util-linux包軟體包的一部分)支持--secure選項,用於「執行安全discard操作。安全discard操作與常規discard操作相同。只是,對於正在discard的塊,其所有副本(可能在垃圾回收過程中創建)也將被擦除。安全discard操作需要設備的支持」。
要執行安全discard操作:
# blkdiscard --secure /dev/device
對於不支持安全擦除的設備,可使用-z/--zeroout選項,在discard設備上的所有塊的基礎上,還會將設備填充為零。
關於blkdiscard安全性的討論,參見[7]。關於使用blkdiscard擦除卷的示例,參見[8]。
某些UEFI實現會在系統啟動時移除引用了不存在啟動文件的啟動項。如果計劃在擦除設備後從備份中恢復系統,需要使用efibootmgr或通過重新安裝引導加載程序的方法恢復啟動項。
- Secure Erase HDDs/SSDs (SATA/NVMe) using hdparm & nvme-cli on Linux (2019): good tutorial with images
- Verifying SSD Sanitization