2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Windowsの標準NVMeドライバでNVMe SSDにアクセスする:更新情報

Posted at

はじめに

 以前、Windows 10(以降Windowsと記載します)の標準NVMeデバイスドライバを使用して、ユーザ空間で動作するプログラムからNVMe SSDに対して、以下のコマンドを発行する方法を紹介しました。

 その後Microsoftのドキュメントには特に更新がなかったのですが、先日(2020年5月)更新があり、Windowsの標準NVMeデバイスドライバを使用してできること(発行できるコマンドなど)についてまとめられた記事[1]が公開されました。

 今回公開された内容は、Windows 10 version 1903以降の標準NVMeデバイスドライバ(StorNVMe)に関する情報で、大きく分けて3つあります。

  1. コマンドのサポート情報
  2. 機能(Feature)のサポート情報
  3. SCSIコマンドとNVMeコマンドの対応関係情報

 そこでこの記事では、コマンドのサポート情報についてその内容を見ていきたいと思います。

まとめ

  • これまで明らかにされていなかった、各コマンドのサポート状況が明らかにされた
  • この情報に基づき、FlushコマンドとFormat NVMコマンドを、Windowsの標準NVMeデバイスドライバを使用して発行できることを確認した

コマンドサポート情報

 今回公開された記事には、以前(一年ほど前)記事を書いた際には記載されていなかった、コマンドのサポート状況をまとめた表が記載されています[2]

 以下の表1は、その表の一部を引用したものです。この表1のように、AdminコマンドセットおよびNVMコマンドセットの各コマンドについて、そのサポート状況が記載されています。

表1:公開されたコマンドサポート表(一部)
公開されたコマンドサポート表(一部)

 この表に書かれている内容にはいくつかのパターンがあります。

"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:公開されたコマンドサポート表(一部、その2)
公開されたコマンドサポート表(一部、その2)

 表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は、FlushWrite、そしてReadコマンドについての記述を抜粋したものです。

表3:公開されたコマンドサポート表(一部、その3)
公開されたコマンドサポート表(一部、その3)

 表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のように、いくつかの方法で発行できることが記載されています。

表4:Format NVMコマンドのサポート状況
Format NVMコマンドのサポート状況

 この"Comments"欄には以下の3つのことが記載されています。

  1. IOCTL_STORAGE_PROTOCOL_COMMANDを使った(Format NVMコマンドの)発行は、WinPEモードでのみ可能
  2. IOCTL_SCSI_PASS_THROUGH(SCSI Pass-Through機構)を使う場合はSCSIOP_SANITIZEを指定すること
  3. IOCTL_STORAGE_REINITIALIZE_MEDIAを使う場合は、ドライブが暗号的消去(cryptographic erase)をサポートしていることが必要

 今回は上記3の方法(IOCTL_STORAGE_REINITIALIZE_MEDIAを指定する方法)でFormat NVMコマンドの発行を試みて、成功しました。

 確認した方法は以下の2つです。

  1. Writeコマンドでセクタ0に書き込んで、セクタ0にデータが書けたことをReadコマンドで確認し、その後Format NVMコマンドを発行した後に、Readコマンドでセクタ0を読み出して先に書き込んだデータが読めないこと
  2. 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から抜粋)
Format NVMコマンドのSESフィールドの内容

 したがって、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"節には、以下のような記述があります。

WHCP仕様におけるFormat NVMコマンドに関する規定
図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コマンドサポート有無表示フィールド

 また、Format NVMコマンド実行時の暗号的消去サポート有無は、同じくSSDコントローラに対するIdentifyコマンドの結果から確認できます。

表7:Format NVMコマンドでの暗号的消去サポート有無表示フィールド(NVMe仕様書のFigure 112より抜粋)
Format NVMコマンドでの暗号的消去サポート有無表示フィールド

まとめ

 この記事では、先日(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 国際 ライセンスの下に提供されています。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?