NVMe SSDメーカーの個性は自己診断機能にあり!? (2/2)

# はじめに
　[前回の記事](https://qiita.com/ken-yossy/items/7c2caf0746d00d3d9033)でご紹介したように、NVMe仕様<sup>[1]</sup>には、ホストからNVMeドライブに健康状態の自己診断を実行させるコマンド（Device Self-testコマンド）があります。

　ただこのDevice Self-testコマンドはオプション機能であり、ドライブによりサポート有無が異なるだけでなく、NVMe仕様ではこのコマンドでの「テスト内容」について例を示すのみにとどめているためテストの内容（範囲）もドライブ依存です。

　前回は、比較的容易に取得可能なDevice Self-testのExtended Self-testというテストの所要時間（公称時間）を取り上げて、この値にメーカーや製品の個性が表れていることをご紹介しました。

　今回はそんなDevice Self-testの実行方法や内容などについてまとめます。

# まとめ
* Device Self-testはドライブメーカー提供ツールでの実行が最も簡単
* Device Self-testはその結果（履歴）を取得可能
* Device Self-testのテスト内容は「製品（メーカー）により異なる」と認識することが重要

# Device Self-test実行方法
## Windowsの場合
　Windows上でNVMeドライブのDevice Self-testを実行する最も簡単な方法は、ドライブのメーカーが提供するツールを使用する方法です。

　例えばMicronが提供している[Storage Executive](https://www.micron.com/products/ssd/storage-executive-software)では、起動後左側のメニューから「デバイスの自己診断」ボタンを押すと、ドライブがDevice Self-testをサポートしている場合に図1のような画面が表示されます。

![Micron Storage ExecutiveでのDrive Self-test起動画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/f5b2ed76-720b-db1d-2d53-c6e63cfa9385.png "Micron Storage ExecutiveでのDrive Self-test起動画面")
図1：Micron Storage ExecutiveでのDrive Self-test起動画面（バージョン7.07.072021.00）

　この画面で"Short Self-Test"と"Extended Self-Test"のどちらか実行したいほうを選択して「デバイスの自己診断を実行する」ボタンを押すと、Device Self-testが開始されます。

　他メーカーも以下のようなツールを提供していて、ドライブがDevice Self-testをサポートしていれば、同様の方法でDevice-Self testを実行可能です。

* Intel: [Intel Memory and Storage Tool](https://www.intel.co.jp/content/www/jp/ja/download/19543/intel-memory-and-storage-tool-gui.html)
* Kioxia: [SSD Utility](https://personal.kioxia.com/ja-jp/software/ssd-utility.html)
* Crucial: [Storage Executive](https://www.crucial.jp/support/storage-executive)
* Samsung: [Samsung Magician](https://www.samsung.com/semiconductor/minisite/ssd/product/consumer/magician/)
* Seagate: [SeaTools](https://www.seagate.com/jp/ja/support/downloads/seatools/)
* Western Digital: [Western Digital Dashboard](https://support.wdc.com/downloads.aspx?p=279)

## Linuxの場合
　Linuxでも、メーカーがWindows版と同様のGUIもしくはコマンドラインインターフェース(Command Line Interface; CLI)のツールを提供していれば、それらのツールを利用してDevice Self-testを実行できます。

　もしそのようなツールがない場合、例えばUbuntuであれば`nvme-cli`パッケージ<sup>[2]</sup>のコマンドを使う方法があります。

　対象のドライブが`/dev/nvme1`でそのドライブの全Namespaceに対してShort testを実行するには、次のようにします。

```
% sudo nvme admin-passthru /dev/nvme1 --opcode=20 --namespace-id=0xFFFFFFFF --cdw10=1
```

　`--opcode=20`がDevice Self-testコマンドを、`--namespace-id=0xFFFFFFFF`が全Namespaceを対象とすることを、そして`--cdw10=1`がShort testの実行開始を意味します。なお、Extended testの実行を開始する場合は`--cdw10=2`とします。

　ちなみに、一度実行を開始したSelf testを中止するには、上記`--namespace-id`オプションを取り除き`--cdw10=0xF`に値を変更してDevice Self-testコマンドを発行します。

　これら引数の詳細については、`nvme`コマンドのマニュアルや、NVMe仕様書の5.8節"Device Self-test command"をご覧ください。

# Device Self-testの内容
　Device Self-testの内容に関してNVMe仕様が定めている主な項目は以下の通りです。

1. "Short test"と"Extended test"の2つを定義
2. テスト内容の参考(informative)として9つの分類（セグメント）を定義
3. テスト状況（実行中かどうか、どの程度実行が完了したか）および最近20回のテスト結果を示すこと（Get Log Pageコマンドで取得可能）
4. テスト中にエラーを検出した場合はどのセグメントで検出したのかを示すこと

　まずShort testとExtended testについてです。図2のように、Device Self-testコマンドでDevice Self-testを実行する際には「Short testとExtended testのどちらを実行するのか」を指定します。

![NVMe仕様におけるDevice Self-testの種類](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/a3f97aeb-400f-b8d3-12a7-b2e06b9c2a93.png "NVMe仕様におけるDevice Self-testの種類")
図2：NVMe仕様におけるDevice Self-testの種類（[1]より引用）

　Short testとExtended testの違いは、ざっくり言えば「テストにかける時間の長さ」です。Extended testのほうがShort testよりも長い時間をかけることが多いです。

　その「テスト内容の分類（セグメント）」は表1の通りです。

表1：Device Self-testのテスト内容分類（[1]より引用）
![Device Self-testのテスト内容分類](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/c98bf865-2f9d-08b5-4c8c-a8d8b41a5178.png "Device Self-testのテスト内容分類")

　この表1を見ると、最後（9番目）にS.M.A.R.T.情報のチェックがあることから、「1から8までのテストを実行した後に（再度）S.M.A.R.T.情報をチェックして異常がないか確認すべし」という意図が見て取れます。

　この分類（セグメント）には、RAM（SRAMやDRAM）のチェックをはじめ、データのチェックやメディア（NANDフラッシュメモリ）のチェック、ハードウェア的な配線のチェック、そしてもちろん寿命のチェックも含まれます。まさにドライブの「自己診断」ですね。

　表1のセグメント6の説明には"Extended only"と書かれていますが、これは長時間かかりそうなのでExtended testでの実施を想定している、ということです。

　その他のセグメントにおいても、Short testとExtended testではテスト範囲やテスト内容（チェック内容）の種類や数が調整されていると考えられます。

　ただし、これも繰り返しになりますが、Device Self-testの内容はメーカー（製品）依存です。つまり、セグメント1を例にとると、メーカー（製品）により以下のようにテスト内容が異なる可能性があります。

* ドライブA：【Short test】DRAMの一部のみテスト【Extended test】DRAM全体をテスト
* ドライブB：【Short test】SRAMの一部のみテスト【Extended test】SRAMとDRAMそれぞれの全体をテスト
* ドライブC：【Short test】SRAMの全体をテスト【Extended test】DRAM全体をテスト

　こればかりは外部からはわかりません。ユーザとしては、「Device Self-testは製品によりテスト内容も範囲も異なるものである」と認識しておくことが重要です。

　このことからも、「NVMe SSDは自己診断機能にメーカーの個性が表れている」と言えますね。

　この「製品依存である」ことは、例えば「Device Self-testのテスト内容やテスト方法をメーカーに確認してテスト内容を把握し、その上で定期的にホストからDevice Self-testを実行させてドライブの健康状態が所定の範囲内にあることを**能動的に**チェックする」という風に上手く活用することも可能です。

　NVMe SSDを選定する際の基準のひとつにもなり得ます。

# Device Self-testの履歴を調べる
　最後に、Device Self-testの履歴を調べる方法を紹介します。

　NVMe仕様は、ドライブがDevice Self-testをサポートする場合、最近20回のDevice Self-test実行結果をホストから取得できるようにすること、としています。取得にはGet Log Pageコマンドを使用します。

　図3は、私がGithubで公開しているプログラム<sup>[3]</sup>で取得した、あるNVMe SSDのDevice Self-testログです。

![Get Log Pageコマンドを使用して取得したDevice Self-testのログ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/1167c1c9-c849-8fe8-0d0d-3c1b7e656666.png "Get Log Pageコマンドを使用して取得したDevice Self-testのログ")
図3：Get Log Pageコマンドを使用して取得したDevice Self-testのログ

　このように、テストの結果や実行した時期（ただしドライブの体内時間的な時間に基づく記録）もログに記録されます。

# まとめ
　今回の記事では、前回紹介したNVMeドライブのDevice Self-testコマンドについて、具体的な実行方法やテスト内容、テスト結果の履歴を取得する方法を説明しました。

　Device Self-testコマンドはオプション機能でかつテスト内容も製品に依存しますが、この「製品により異なる」ことをご自身の使いかたや健康状態の考えかたにより近い製品を選ぶために利用する、という活用方法も考えられます。

# References
[1] NVM Express, _"NVM Express Base Specification,"_ Revision 1.4b, September 21, 2020
[2] _[linux-nvme / nvme-cli](https://github.com/linux-nvme/nvme-cli)_、2021年10月26日閲覧
[3] _[ken-yossy / nvmetool-win](https://github.com/ken-yossy/nvmetool-win)_、2021年11月18日閲覧

# ライセンス表記
<a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"><img alt="クリエイティブ・コモンズ・ライセンス" style="border-width:0" src="https://i.creativecommons.org/l/by-sa/4.0/88x31.png" /></a><br />この記事は<a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">クリエイティブ・コモンズ 表示 - 継承 4.0 国際 ライセンス</a>の下に提供されています。