ソリッドステートドライブ/メモリセルの消去
関連記事
ときに、SSD のセルを完全に消去して、SSD 製造時の状態に完全に戻し、製造時の書き込み性能を取り戻したいと思うこともあるでしょう。たとえ SSD がネイティブ TRIM に対応していても、時が経つにつれて書き込み性能は下がっていくことが知られています。TRIM はあくまでファイルの削除に対する防護であり、差分保存などの操作には効果がありません。
Secure Erase を行っても、SSD セルのウェアレベリングの状態はリセットできません。寿命を迎えつつあるドライブの場合、短い間は書き込み可能になるかもしれませんが、限られた量の書き込み後は依然としてできなくなります。
目次
SATA ドライブ
ステップ 1 - ドライブのセキュリティが frozen でないことを確認する
以下のコマンドを発行してください:
# hdparm -I /dev/sdX | grep frozen
出力の Security セクションに "not frozen" と表示されている必要があります。ただ "frozen" と表示される場合、次のステップに進むことはできません。一部の BIOS は、オペレーティングシステムを起動する前にドライブに "SECURITY FREEZE" コマンドを発行して "frozen" 状態にすることで、ATA Secure Erase コマンドをブロックします。
解決策としては、システムを単にサスペンドさせることです。復帰するときに、frozen 状態が解除される可能性があります。うまく行かない場合は、ドライブのデータケーブルを (電源が入った状態で) 抜き差しする方法があります (カーネルがクラッシュするかもしれません)。SATA データケーブルをこのように抜き差ししてカーネルがクラッシュする場合は、オペレーティングシステムを完全に起動させて、素早く SATA の電源ケーブルとデータケーブルの両方を抜き差ししてみてください。それでも SATA ケーブルの抜き差しでカーネルがクラッシュしてしまう場合は、AHCI が有効化されていることを BIOS で確認してください (AHCI により、クラッシュさせずに、電源が入った状態で抜き差しできます)。ホットプラグに対応している場合は、USB から SATA への変換ケーブルを使うという手もあります。hdparm は USB を介して使うこともできます。
Dell システム
先のコマンドが "frozen" と出力する場合、以下を行うことにより回避できるかもしれません:
- スタートアップ時に F2 を押して、Dell の BIOS に入る。
- BIOS から Internal HDD Password を設定する (注意、キー配列が en_US / qwerty になっています。日本語配列とは若干異なります)。
- 変更を適用し、再起動する。
- Dell Security Manager からパスワードを要求されたときに、パスワードを入力せずに Escape を押す。ドライブはロックされたままになりますが、frozen 状態にはなっていません。
- ステップ 2 をスキップし、ステップ 3 に飛ぶ。
ステップ 2 - ユーザーパスワードを設定してセキュリティを有効化する
このパスワードは一時的に使用するものなので、何でも構いません。Secure Erase 後は、このパスワードは 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.
ステップ 3 - ATA Secure Erase コマンドを発行する
最後のステップは Secure Erase コマンドの発行です。ドライブのコンテンツを消去させるようデバイスの BIOS に命令します。この例で使用しているデバイスでは、先のコマンドで以下のように出力されたことに注意してください:
2min for SECURITY ERASE UNIT. 2min for ENHANCED SECURITY ERASE UNIT.
ATA の仕様によれば、強化型のセキュリティ消去 (--security-erase-enhanced
) はより入念な消去を実行します。両方のコマンドの予想完了時間が等しい場合、ドライブのメーカーが仕様を無視し、どちらのコマンドでも同じ消去を行っていることを意味します。消去にかかる時間 (2分など) が短い場合、デバイスが自己暗号化を行っていて、BIOS によって消去されるのは内部の暗号鍵だけで、全てのデータセルが上書きしていないことを意味します [2]。
# hdparm --user-master u --security-erase PasSWorD /dev/sdX
コマンドが完了するまで待機してください。この例の出力では、Intel X25-M 80GB SSD に約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 ドライブ
NVMe 仕様では、NVMe ドライブをフォーマットするための標準化された方法が定義されています。NVMe ドライブは SATA インターフェイスプロトコルを使用しないため、SATA SSD と同じ方法では消去できないからです。もともと、この機能を提供していたのは nvme-format(1) コマンド (nvme-cli に同梱) でしたが、このコマンドのその機能を残しつつ、Specification 1.3 で専用の nvme-sanitize(1) コマンドのサポートが追加されました。Jonmichael Hands 氏 (NVMe MWG 共同議長、Intel の上級戦略プランナー/プロダクトマネージャ) の説明によると [3]:
- 「これらのコマンドは、デバイスからユーザデータをセキュアに消去するために使用される。これは、新しいデバイスを導入するとき、廃棄するとき、デバイスが寿命を迎えたとき、SSD を新しい用途で使うときなどに使用できる。Sanitize は NVMe 1.3 仕様で導入されたため、それ以前では、Secure Erase を行うためだけに NVMe Format が使用された。両方のオプションが機能するが、データが適切に消去されたことを保証する点で、Sanitize はよりロバストだ。Format は、日常的な使用やテストに適している。」
あなたのドライブでサポートされているものを確認するために、Identify Controller コマンドを使用してください:
# nvme id-ctrl /dev/nvme0 -H | grep "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 か sanitize のどちらかに進んでください。
Format コマンド
Format コマンドは、概念的には hdparm と fdisk を組み合わせたものに近いです。ドライブの低レベルなパラメータを設定でき、さらに Secure Erase コマンドも送信できます。
nvme-format(1) には、Secure Erase Settings (-s <ses>, --ses=<ses>
) のオプションに関する以下の詳細が書かれています:
- Secure Erase Settings: このフィールドは、フォーマットの一部として Secure Erase を行うかどうかや、Secure Erase 操作の種類を指定します。消去は、データの場所に関わらず、全ユーザデータに適用されます (例: 公開されている LBA 内、キャッシュ内、割り当て解除された LBA 内など)。デフォルトは 0 です。
利用可能な値:
値 | 定義 |
---|---|
0 | Secure Erase 操作を要求しない |
1 | User Data Erase: 全ユーザデータを削除する。削除後のユーザデータの内容は未確定です (例えば、ユーザデータは 0 や 1 などで埋められているかもしれません)。User Data Erase が要求された時、全ユーザデータが暗号化されている場合、コントローラは Cryptographic Erase を行う場合があります。 |
2 | Cryptographic Erase: 全ユーザデータは、暗号を用いて消去されます。最後に暗号化キーを消去して完了します。 |
Format コマンドは NVMe キャラクタデバイス全体 (例: /dev/nvme0
) か特定の名前空間ブロックデバイス (例: /dev/nvme0n1
) のいずれかを受け入れますが、実行するまえに、この機能があなたのドライブでサポートされていることを確認してください。例えば、上記の Identify Controller コマンドの出力では、Crypto Erase Applies to Single Namespace(s)
と Format Applies to Single Namespace(s)
のビットが 0 にセットされていました。仕様によると、これは「コントローラが名前空間単位でのフォーマットをサポートしている」ことを意味します (図249の byte 列 524 "Format NVM Attributes (FNA)" を参照)。
例えば、暗号消去を使って /dev/nvme0
を名前空間1にフォーマットするには:
# nvme format /dev/nvme0 -s 2 -n 1
詳細やデバイス/名前空間の選択に関する重要な警告については nvme-format(1) を参照してください。
Sanitize コマンド
Sanitize コマンドは、「SATA と SAS の実装にある同名のコマンドと機能的に等価」になるように作成されました[4]。前述の記事によると[5]:
- 「NVMe 1.4 specification によると、「Sanitize 操作は NVM サブシステム内の全ユーザデータを書き換え、キャッシュ、非揮発性メディア、Controller Memory Buffer から以前のユーザデータを復元できないようにします。」
- Sanitize と Format の大きな違いは、Sanitize はキャッシュが削除されることを保証し、予期せぬ電源断後にもプロセスが再び開始されることです。Sanitize は、Secure Erase 操作のためのパターン上書きもサポートしています。これは、NAND の耐久性にとってはひどいものですが、他のタイプのストレージやメモリクラスに使用できますし、ユーザデータを復元できないことをより確実にできます。」
-a/--sanact
オプションの使用法と利用可能な値は[6]:
-a <action> --sanact=<action> Sanitize Action 000b - Reserved 001b - Exit Failure Mode 010b - Start a Block Erase sanitize operation 011b - Start an Overwrite sanitize operation 100b - Start a Crypto Erase sanitize operation
詳細は nvme-sanitize(1) を参照してください。
Block Erase と Crypto Erase の違いは、Crypto Erase は暗号化キーのみを消去することです (NVMe 1.4 specification で定義されている通り):
- 「User Data Erase: 全ユーザデータを削除する。削除後のユーザデータの内容は未確定です (例えば、ユーザデータは 0 や 1 などで埋められているかもしれません)。User Data Erase が要求された時、全ユーザデータが暗号化されている場合、コントローラは Cryptographic Erase を行う場合があります。」
- Cryptographic Erase: 全ユーザデータは、暗号を用いて消去されます。これは、暗号化キーを消去することで達成されます。
- …
- Block Erase sanitize 操作は、メディア固有の低レベルなブロック消去法を用いて、ユーザデータが保存されている可能性のある NVM サブシステム内のメディア上のすべての場所において、ユーザデータを書き換えます。
- Crypto Erase sanitize 操作は、ユーザデータが保存されている可能性のある 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 においては 1 回の Block Erase がこれらの結果を得るまでに約 2~3 時間かかりました。
Crypto Erase sanitize 操作を始めるには:
# nvme sanitize device -a 4
Block Erase の場合は:
# nvme sanitize device -a 2
Sanitize ログにより、処理内容を追うことができます:
# nvme sanitize-log /dev/nvme0
ドライブを Crypto Erase している場合の出力例:
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
When the command has completed successfully:
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 による一般的な方法
util-linux パッケージの blkdiscard(8) コマンドは --secure
オプションを提供します。このオプションは、「セキュアな消去を行います。セキュアな消去は、ガベージコレクションによって作成された可能性のある消去ブロックのコピーもすべて削除されることを除いて、通常の消去と同じです。セキュアな消去はデバイスのサポートを必要とします。」("Perform a secure discard. A secure discard is the same as a regular discard except that all copies of the discarded blocks that were possibly created by garbage collection must also be erased. This requires support from the device.")
このコマンドを使うには、以下を実行してください:
# blkdiscard --secure /dev/device
セキュアな消去をサポートしていないデバイスの場合、-z
/--zeroout
オプションは、デフォルトでデバイス上の全ブロックを単に消去する代わりに、デバイスを 0 で埋めます。
blkdiscard の一般的なセキュリティに関する議論は [7] を、blkdiscard を使用してボリュームを消去する例は [8] を見てください。
トラブルシューティング
ドライブを消去した後に UEFI ブートエントリが削除された
一部の UEFI 実装は、存在しないファイルを参照しているブートエントリをシステムのスタートアップ時に削除します。メモリセルの消去を行った後にバックアップからシステムを復元する場合は、efibootmgr を使うか ブートローダーを再インストールして、ブートエントリを復元してください。
参照
- Secure Erase HDDs/SSDs (SATA/NVMe) using hdparm & nvme-cli on Linux (2019): 画像付きの良いチュートリアル
- Verifying SSD Sanitization