SSDのセクタサイズ(2/2):確認と変更

SSDのセクタサイズ(2/2):確認と変更

この記事で紹介している製品

おことわり

 この記事は、2022年2月にQiitaに投稿した記事を加筆修正したものです。

はじめに

 前回の記事で、「現在のNANDフラッシュメモリをメディアとするSSDのほとんどは、論理セクタサイズ512バイトで動作する時はエミュレーション動作している」と説明しました。

 加えて、「エミュレーション動作よりもネイティブ動作のほうがNANDフラッシュメモリの寿命消費効率が良くなる」と説明しました。

 そこで今回の記事では、WindowsとNVMe SSDを例に挙げ、SSDがエミュレーション(512e)動作しているかどうかの確認方法や、ネイティブ(4Kn)動作させる方法(論理セクタサイズの変更方法)を説明します。

 なお、SATA SSDでは標準コマンドセットを使用して論理セクタサイズ変更可能な製品を見たことがありません。これはATA Packet Interface (ATAPI)コマンドセットのサポートが必要だからです。このため、この記事ではNVMe SSDを使用します。

まとめ

  • Windowsの場合、ドライブの物理・論理セクタサイズはfsutilコマンドで確認可能
  • NVMe SSDの論理セクタサイズは、Identifyコマンドで確認が、Format NVMコマンドで変更が可能

Windowsでのエミュレーション動作確認

 ドライブ(SSD)がエミュレーション動作しているかどうかを確認する方法としては、Windowsであればfsutilコマンドを使う方法[1]が最も簡単です。

 具体的には、図1のようにfsutilコマンドを実行します。この例はWindows 10 Proが動作するPCにおいてNTFSでフォーマットされたSSDの状態を確認したものです。

図1:fsutilコマンドの実行結果(512e環境、画像は一部加工しています)

 図1の実行結果のうち、「Bytes Per Sector(セクターあたりのバイト数)」が論理セクタサイズを、「Bytes Per Physical Sector(物理セクタ―あたりのバイト数)」が(ドライブの)物理セクタサイズを示します。

 この図1の例のように、論理セクタサイズが512バイトで物理セクタサイズが512バイトではない状態が512eモードです。

 MicrosoftのWebページ[1]には、fsutilコマンドの結果組み合わせ表が掲載されています。表1はその抜粋です。

Bytes Per Sector value
(論理セクタサイズ)
Bytes Per Physical Sector value
(物理セクタサイズ)
Drive Type
(動作モード)
409640964K native
5124096Advanced Format (also known as 512E)
512512512-byte native
表1:fsutilコマンドの結果からわかるドライブの動作モード

NVMe SSDのセクタサイズ設定

 ここからは、実機を用いてSSDのセクタサイズ確認や論理セクタサイズ変更を試します。

 はじめに説明した通り、実機にはSATA SSDではなくNVMe SSDを使用します。

 NVMe SSDの場合、SSDの現在の論理セクタサイズとSSDがサポートする論理セクタサイズはNamespaceにIdentifyコマンドを発行することで確認できます。

 以下の例は、私の自作Windowsプログラム[2]を使いあるNVMe SSDのNamespaceにIdentifyコマンドを発行した結果の抜粋です。「★」に続く内容は説明用に追加したコメントです。

[M] Namespace Size (NSZE): 1000215216 (sectors)
(中略)
[M] Formatted LBA Size (FLBAS):
        bit [      4] 0 = All of the metadata is transferred as a separate contiguous buffer of data.
        bit [  3:  0] 0 = LBA format is no.0 (LBAF0). ★ 現在のフォーマットは0番
(中略)
[M] LBA Format 0 Support (LBAF0): ★ 論理セクタサイズ512バイト(おそらく512e)
        bit [ 25: 24] 2 = Relative Performance (RP): Good performance
        bit [ 23: 16] 9 = LBA Data Size (LBADS): 512 bytes / sector
        bit [ 15:  0] 0 = Metadata Size (MS): 0 bytes
[O] LBA Format 1 Support (LBAF1): ★ 論理セクタサイズ4096バイト(おそらく4Kn)
        bit [ 25: 24] 1 = Relative Performance (RP): Better performance
        bit [ 23: 16] 12 = LBA Data Size (LBADS): 4096 bytes / sector
        bit [ 15:  0] 0 = Metadata Size (MS): 0 bytes

 この結果からわかることは以下の通りです。

  • 現在このNamespaceはフォーマット0 (LBAF0)でフォーマットされている
  • このNamespaceは、2つのフォーマット(フォーマット0と1)でフォーマット可能
    • フォーマット0 (LBAF0)は論理セクタサイズ512バイト
    • フォーマット1 (LBAF1)は論理セクタサイズ4096バイト(=4Kバイト)で、フォーマット0より性能が良い

 この”Relative Performance (RP)”という情報は、数字の小さいほうが4KiB QD=32のリード性能において性能が高いことを示します(図2)。

図2:NVMe仕様におけるフォーマットの「相対性能(Relative Performance)」

NVMe SSDの論理セクタサイズを4キロバイトに変更する

 それでは、このNVMe SSDのNamespaceのフォーマットをフォーマット1に変更、つまり論理セクタサイズを512バイトから4キロバイトに変えてみます。

 注意:Format NVMコマンドを発行するとそのNamespaceに書き込まれていたデータが読めなくなる可能性がありますので、実行の際は十分に注意してください

 NVMe SSDの論理セクタサイズ変更にはフォーマット変更が必要ですので、Format NVMコマンドを使用します。

 なお、NVMe仕様[3]においてFormat NVMコマンドはオプションですので、お使いのNVMe SSDがFormat NVMコマンドに対応しているかどうか確認が必要です。

 また残念ながら、Windowsの標準NVMeデバイスドライバを使う場合、WinPEモードでしかこの処理(=フォーマットを指定したFormat NVMコマンドの発行)ができません。

 このため、論理セクタサイズの変更はLinuxのnvme-cliパッケージに含まれるnvmeコマンドを使いました。

 nvmeコマンドを使用したFormat NVMコマンドの発行は非常に簡単です。

 以下は、先ほどのNVMe SSD (/dev/nvme0)に対して、「Namespace 1をフォーマット1(=論理セクタサイズ4096バイト)でフォーマットする」ことを指示した様子です。

 -l 1で「フォーマット1」を指定し(注:アルファベット小文字のエル)、コマンド発行対象としてSSD自体を示す/dev/nvme0にIDが1のNamespaceを示すn1を付け加えた/dev/nvme0n1を指定します。

ubuntu@ubuntu:~/Desktop$ sudo nvme format -l 1 /dev/nvme0n1
Success formatting namespace:1

 この表示が出力されればフォーマット変更成功です。コマンド処理完了までにかかる時間は製品により変わる可能性があります。

 実際にフォーマット1でフォーマットされたのかどうかを、Namespace 1を対象にIdentifyコマンドを発行して確認すると、下記のようになりました。

ubuntu@ubuntu:~/Desktop$ sudo nvme id-ns -H /dev/nvme0n1
NVME Identify Namespace 1:
(中略)
flbas   : 0x1
  [4:4] : 0 Metadata Transferred in Separate Contiguous Buffer
  [3:0] : 0x1   Current LBA Format Selected
(中略)
LBA Format  0 : Metadata Size: 0   bytes - Data Size: 512 bytes - Relative Performance: 0x2 Good
LBA Format  1 : Metadata Size: 0   bytes - Data Size: 4096 bytes - Relative Performance: 0x1 Better (in use)

 ”Current LBA Format Selected”が1つまり「フォーマット1」と表示され、”LBA Format 1″の部分にも「現在使用中(in use)」と表示されています。

 これで、論理セクタサイズ4キロバイトでのフォーマットが完了です。

論理セクタサイズ4キロバイトのSSDにWindows 10をインストール

 SSDのフォーマット変更だけではつまらないので、論理セクタサイズを4キロバイトに設定したSSDに図1と同じWindows 10をインストールしてみました。

 インストールは問題なく完了、そこで再度fsutilコマンドで論理セクタサイズと物理セクタサイズの状態を確認しました(図3)。

図3:fsutilコマンドの実行結果(4Kn環境、画像は一部加工しています)

 図3の通り、論理セクタサイズを示す「セクターあたりのバイト数」の部分が4096バイトと表示されていて、システムとして4Kネイティブ(4Kn)モードで動作していることがわかります。

おわりに

 今回の記事では、WindowsとNVMe SSDを例に挙げ、SSDがエミュレーション(512e)動作しているかどうかの確認方法と、ネイティブ(4Kn)動作させる方法(論理セクタサイズの変更方法)を説明しました。

 現在入手可能なSSDをWindowsで使用すると、デフォルトでは512eモードで動作することが多いです。しかし、SSDの寿命やシステム全体の最適化を考えると、4Knモードで動作させたほうがより良いと考えられます。

References

[1] Microsoft, Microsoft support policy for 4K sector hard drives in Windows, 2024年3月18日閲覧
[2] ken-yossy / nvmetool-win
[3] NVM Express, “NVM Express Base Specification”, Revision 1.4b, September 21, 2020

他社商標について

 記事中には登録商標マークを明記しておりませんが、記事に掲載されている会社名および製品名等は一般に各社の商標または登録商標です。

記事内容について

 この記事の内容は、発表当時の情報です。予告なく変更されることがありますので、あらかじめご了承ください。