ストレージ機器を破棄または譲渡するときには、漏えいを防ぐためにあらかじめデータを消去しておく必要がある。 このとき、データの消去は後から読み取りが難しいように実施しなければいけない。 後から読み取りが難しい形でデータを消去することは Secure Erase と呼んだりするようだ。 今回は NVMe ストレージを Secure Erase する方法について扱う。
まず、最近のマザーボードの UEFI には、ストレージのデータを Secure Erase するためのツールが付属していることがある。 もし、ツールが付属している場合には、それを利用するのが手っ取り早い。 では、付属していない場合にどうするか、というのが今回の話になる。 Unix 系の OS で NVMe ストレージを使っている場合には、nvme-cli(1) を使うのが良さそうだ。
今回使った環境は次のとおり。
$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 20.04.4 LTS Release: 20.04 Codename: focal $ uname -srm Linux 5.13.0-44-generic x86_64 $ nvme version nvme version 1.9
下準備
Ubuntu の場合には apt を使ってインストールできる。
$ sudo apt-get -y install nvme-cli
データを消去する
まず、nvme list
コマンドで消去したいデバイスを確認する。
$ sudo nvme list Node SN Model Namespace Usage Format FW Rev ---------------- -------------------- ---------------------------------------- --------- -------------------------- ---------------- -------- /dev/nvme0n1 XXXXXXXXXXXX XXXXXXXXXXXXX 1 1.00 TB / 1.00 TB 512 B + 0 B XXXXXXX
あとは、nvme format
コマンドに確認したデバイスを指定して実行するだけ。
このとき、オプションとして -s 2
を指定するのが望ましい。
$ nvme format /dev/nvme0n1 -s 2
先ほどの形式だとデバイスを名前空間ブロックデバイス (/dev/nvmeXnY
みたいな形式) として指定していた。
それ以外にもキャラクタデバイス (/device/nvmeX
みたいな形式) も受け付けられる。
先ほどと同じように namespace を指定するときは -n
オプションを指定する。
$ nvme format /dev/nvme0 -s 2 -n 1
実行すると、ストレージのデータが消去される。 なお、デバイスがシステムの起動ディスクになっていても問題ない。
-s
オプションについて
先ほど指定した -s
オプションについて補足する。
このオプションは、データの消去をどのように実施するかを表している。
詳しくは man ページに記載されている。
$ man 1 nvme-format
オプションに指定する値の説明を、上記から引用する。
基本的には 2
を指定することで Secure Erase できる。
│Value │ Definition │ ├──────┼──────────────────────────────────┤ │0 │ No secure erase operation │ │ │ requested │ ├──────┼──────────────────────────────────┤ │1 │ User Data Erase: All user data │ │ │ shall be erased, contents of the │ │ │ user data after the erase is │ │ │ indeterminate (e.g., the user │ │ │ data may be zero filled, one │ │ │ filled, etc). The controller may │ │ │ perform a cryptographic erase │ │ │ when a User Data Erase is │ │ │ requested if all user data is │ │ │ encrypted. │ ├──────┼──────────────────────────────────┤ │2 │ Cryptographic Erase: All user │ │ │ data shall be erased │ │ │ cryptographically. This is │ │ │ accomplished by deleting the │ │ │ encryption key. │ ├──────┼──────────────────────────────────┤ │3–7 │ Reserved │ └──────┴──────────────────────────────────┘
なお、ソースコードを読む限り1、これらはいずれも NVMe デバイスに発行するコマンドの引数として表現されているようだ。 言いかえると、製品のファームウェアのレベルで Secure Erase の機能が実装されていることを前提としている。 そのため、製品によってはサポートされていない可能性もある。
いじょう。
-
内部的には libnvme というライブラリが使われていて、ユーザ空間からは ioctl(2) でデバイスを操作する↩