CUBE SUGAR CONTAINER

技術系のこと書きます。

NVMe ストレージのデータを nvme-cli(1) で完全に消去する

ストレージ機器を破棄または譲渡するときには、漏えいを防ぐためにあらかじめデータを消去しておく必要がある。 このとき、データの消去は後から読み取りが難しいように実施しなければいけない。 後から読み取りが難しい形でデータを消去することは 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

manpages.ubuntu.com

オプションに指定する値の説明を、上記から引用する。 基本的には 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 の機能が実装されていることを前提としている。 そのため、製品によってはサポートされていない可能性もある。

いじょう。


  1. 内部的には libnvme というライブラリが使われていて、ユーザ空間からは ioctl(2) でデバイスを操作する