はじめに
以前、Windows 10(以降Windowsと記載します)の標準NVMeデバイスドライバを使用して、ユーザ空間で動作するプログラムからNVMe SSDに対して、以下のコマンドを発行する方法を紹介しました。
その後Microsoftのドキュメントには特に更新がなかったのですが、先日(2020年5月)更新があり、Windowsの標準NVMeデバイスドライバを使用してできること(発行できるコマンドなど)についてまとめられた記事[1]が公開されました。
今回公開された内容は、Windows 10 version 1903以降の標準NVMeデバイスドライバ(StorNVMe)に関する情報で、大きく分けて3つあります。
- コマンドのサポート情報
- 機能(Feature)のサポート情報
- SCSIコマンドとNVMeコマンドの対応関係情報
そこでこの記事では、コマンドのサポート情報についてその内容を見ていきたいと思います。
まとめ
- これまで明らかにされていなかった、各コマンドのサポート状況が明らかにされた
- この情報に基づき、
Flush
コマンドとFormat NVM
コマンドを、Windowsの標準NVMeデバイスドライバを使用して発行できることを確認した
コマンドサポート情報
今回公開された記事には、以前(一年ほど前)記事を書いた際には記載されていなかった、コマンドのサポート状況をまとめた表が記載されています[2]。
以下の表1は、その表の一部を引用したものです。この表1のように、AdminコマンドセットおよびNVMコマンドセットの各コマンドについて、そのサポート状況が記載されています。
この表に書かれている内容にはいくつかのパターンがあります。
"Internal Driver Usage"とだけ書かれたコマンド
"Internal Driver Usage"という記載は、言葉の通り「このデバイスドライバ(StorNVMe)が、このコマンドを、内部で使用している」という意味だと思われます。ですので、"Internal Driver Usage"と書かれているコマンドは、「このデバイスドライバがこのコマンドを発行する(ことがある)」と解釈できます。
一方で、"Internal Driver Usage"とだけ書かれているコマンドは、「外部からこのデバイスドライバを利用して発行することはできない」という意味だと解釈できます。
例えば、表1にあるDelete I/O Submission Queue
コマンドやCreate I/O Submission Queue
コマンドは、"StorNVMe Support"の列に"Internal Driver Usage"とだけ書かれていますので、ユーザ空間のプログラムを含む外部から(DeviceIoControl()
を使うなどして)このデバイスドライバを利用して発行することはできない、と思われます。
上記2つのコマンドは、NVMeドライブとの間でのコマンド発行やレスポンス受信に用いるキューの作成や削除を行うコマンドですので、ユーザ空間から好き勝手に発行可能だと困るという理由からこのような扱いになっているのでしょう。
"IOCTL_STORAGE_"から始まる識別子が書かれたコマンド
表1では、Get Log Page
コマンドについて、"StorNVMe Support"の列に"Internal Driver Usage"だけでなく、"IOCTL_STORAGE_QUERY_PROPERTY"と記載されています。
Get Log Page
コマンドは、S.M.A.R.T.属性などを取得するためのコマンドで、以前の記事で説明した通り、Windowsの標準NVMeデバイスドライバを使用して発行できることを確認済みです。
したがって、"StorNVMe Support"の列に"IOCTL_STORAGE_"から始まる識別子が記載されているコマンドは、「ユーザ空間のプログラムを含む外部から、(DeviceIoControl()
を使うなどして)このデバイスドライバを利用して発行することができる」ことを意味すると考えられます。
ただし、"StorNVMe Support"の列に"IOCTL_STORAGE_"から始まる識別子が記載されていても、コメント欄に制約が書かれている場合があります。
表2に引用したサポート表には、"StorNVMe Support"の列に"IOCTL_STORAGE_"から始まる識別子が記載されているものの、コメント列に制約が書かれているコマンドがあります。
例えば、Set Features
コマンドはNVMeドライブが持つ様々な機能の設定を行うコマンドですが、コメント列には、ホスト制御によるサーマルスロットリング(Host Controlled Thermal Management; HCTM)に関する設定のみ可能であると記載されています。
また、同じく表2にあるNamespace Management
コマンドについては、コメント列に「Win PEモードでのみ可能」と記載されています。
"Win PE"とは"Windows Preinstallation Environment"[3]のことで、Windowsのインストールや企業・組織におけるWindows環境の展開、さらにはトラブルシューティングに使われる特殊な環境のことで、私たちが日頃使用するいわゆるフルセットのWindowsではありません。
したがって、コメント列に「Win PEモードでのみ可能」と記載されているコマンドは、通常のWindows環境では「ユーザ空間のプログラムを含む外部から(DeviceIoControl()
を使うなどして)このデバイスドライバを利用して発行することはできない」という意味だと解釈できます。
"IOCTL_SCSI_PASS_THROUGH"と書かれたコマンド
"StorNVMe Support"の列に"IOCTL_SCSI_PASS_THROUGH"と記載されているコマンドは、SCSI Pass-Through機構を用いて発行可能であることを示していると考えられます。
表3は、Flush
、Write
、そしてRead
コマンドについての記述を抜粋したものです。
表3の通り、これらのコマンドは"StorNVMe Support"の列に"IOCTL_SCSI_PASS_THROUGH"と記載されています。そして、コメント列にはそれぞれ対応するSCSIコマンドが記載されています。
Write
コマンドとRead
コマンドについては、以前の記事で説明した通り、SCSI Pass-Through機構を用いることで、Windowsの標準NVMeデバイスドライバを使用して発行できることを確認済みです。
したがって、"StorNVMe Support"の列に"IOCTL_SCSI_PASS_THROUGH"と記載されているコマンドは、SCSI Pass-Through機構を用いて発行可能であることを示していると推測できます。
"Currently not supported"と書かれたコマンド
これまでの解釈から総合すると、コメント列に"Currently not supported"と書かれたコマンドは、「このデバイスドライバ(StorNVMe)は内部で使用しない」かつ「外部からこのデバイスドライバを利用して発行することはできない」という意味だと推測できます。
Write Uncorrectable
コマンドが未サポートでかつ未使用となっているのは意外でした。HDDの時代から(SCSI Block CommandやATA Command Setに)存在するレガシーなコマンドとはいえ、RAID環境でのリカバリ処理などでは必要になると考えられるからです。SCSI Pass-Through機構を使ってWRITE LONG
コマンドにマッピングすればできそうに思えるのですが。
今回発行できることを確認したコマンド
今回新しい情報が公開されたことを受けて、2つのコマンドが発行できることを追加で確認しました。
ひとつはFlush
コマンド、もう一つはFormat NVM
コマンドです。
Flush
コマンド
Flush
コマンドについては、表3の内容より、SCSI Pass-Through機構を用いて発行できそうなことがわかりました。
そこで今回、SCSIのSYNCHRONIZE CACHE
コマンドに相当するSCSIOP_SYNCHRONIZE_CACHE
を指定してSCSI Pass-Through機構を用いることで、ユーザ空間のプログラムから発行できることを実際に確認しました[4]。
なお、Flush
コマンドが実際に発行されたこと(SSDがFlush
コマンドを受信したこと)を、SSDの外部から、Flush
コマンド実行前後の違いを観測することで確認するのは難しいです。
このため、QemuでエミュレートされたNVMeドライブに対してこの方法でFlush
コマンドを発行し、NVMeドライブのエミュレーションコード側で、実際にFlush
コマンドを受信したことを確認しました。
Format NVM
コマンド
今回公開された記事では、Format NVM
コマンドのサポート状況については、以下の表4のように、いくつかの方法で発行できることが記載されています。
この"Comments"欄には以下の3つのことが記載されています。
-
IOCTL_STORAGE_PROTOCOL_COMMAND
を使った(Format NVM
コマンドの)発行は、WinPEモードでのみ可能 -
IOCTL_SCSI_PASS_THROUGH
(SCSI Pass-Through機構)を使う場合はSCSIOP_SANITIZE
を指定すること -
IOCTL_STORAGE_REINITIALIZE_MEDIA
を使う場合は、ドライブが暗号的消去(cryptographic erase)をサポートしていることが必要
今回は上記3の方法(IOCTL_STORAGE_REINITIALIZE_MEDIA
を指定する方法)でFormat NVM
コマンドの発行を試みて、成功しました。
確認した方法は以下の2つです。
-
Write
コマンドでセクタ0に書き込んで、セクタ0にデータが書けたことをRead
コマンドで確認し、その後Format NVM
コマンドを発行した後に、Read
コマンドでセクタ0を読み出して先に書き込んだデータが読めないこと - QemuでエミュレートされたNVMeドライブに対してこの方法で
Format NVM
コマンドを発行し、NVMeドライブのエミュレーションコード側で実際にFormat NVM
コマンドを受信したこと
2の確認時には、発行されたFormat NVM
コマンドの、"Secure Erase Setting (SES)"フィールドの値が2
となっていることを観測しました。
NVMe仕様[5]によると、SESフィールドの内容は表5のようになっています。
表5:Format NVMコマンドのSESフィールドの内容(NVMe仕様のFigure 174から抜粋)
したがって、NVMeドライブが受信したFormat NVM
コマンドのSESフィールドが2だったということは、Windowsの標準デバイスドライバがNVMeドライブに対して暗号的消去(cryptographic erase)を要求した、ということになります。
確かに、表4の"Comments"欄でも暗号的消去のサポートを求めています。
実はこのことは、Microsoftが定めているWindows 10向けハードウェア互換性プログラム(Windows Hardware Compatibility Program, WHCP)仕様[6]に記載されています。
WHCP仕様の仕様書の"Device.Storage.ControllerDrive.NVMe"節には、以下のような記述があります。
図1:WHCP仕様におけるFormat NVM
コマンドに関する規定
このように、表4に記載されている暗号的消去のサポート要求は、このWHCP仕様に基づいたものであると考えることができます。
なお、図1に"If Implemented"と記載されているように、そもそもFormat NVM
コマンドのサポートはオプションです。
SSDがFormat NVM
コマンドをサポートしているかどうかは、SSDコントローラに対するIdentify
コマンドの結果から確認できます。
具体的には、表6の赤四角で囲ったフィールドとなります。
表6:Format NVM
コマンドサポート有無表示フィールド(NVMe仕様書のFigure 112より抜粋)
また、Format NVM
コマンド実行時の暗号的消去サポート有無は、同じくSSDコントローラに対するIdentify
コマンドの結果から確認できます。
表7:Format NVM
コマンドでの暗号的消去サポート有無表示フィールド(NVMe仕様書のFigure 112より抜粋)
まとめ
この記事では、先日(2020年5月)に投稿されたWindows 10の標準NVMeデバイスドライバについての記事の内容から、コマンドのサポート情報を取り上げて説明しました。
あわせて、Flush
コマンドとFormat NVM
コマンドを、Windowsの標準NVMeデバイスドライバを使用して発行できたことをご紹介しました。
今後Windowsの標準NVMeデバイスドライバでできることが増えていくのかどうかはわかりませんが、新しい情報が公開されたり新しいことができるようになったことがわかったら、随時ご紹介できればと思います。
参考文献
[1] Microsoft、"NVMe Features Supported by StorNVMe"、2020年6月25日閲覧
[2] Microsoft、"StorNVMe Command Set Support"、2020年6月25日閲覧
[3] Microsoft、"Windows PE (WinPE)"、2020年6月25日閲覧
[4] "ken-yossy/nvmetool-win: Communicate with NVMe SSD using Windows' inbox device driver"
[5] NVM Express, "NVM ExpressTM Base Specification", Revision 1.3d, March, 2019
[6] Microsoft, "Windows Hardware Compatibility Specifications for Windows 10, version 2004 – Components and Peripherals", 2020
ライセンス表記
この記事は クリエイティブ・コモンズ 表示 - 継承 4.0 国際 ライセンスの下に提供されています。