ソリッドステートドライブ/NVMe
関連記事
NVM Express (NVMe) とは、PCI Express バスで接続されている SSD にアクセスするための規格です。論理デバイスインターフェイスとして、NVM Express は新規に設計されました。PCI Express SSD の低遅延性と並列性を活かし、現代の CPU、プラットフォーム、アプリケーションの並列性を映し出しています。
目次
インストール
NVMe デバイスは /dev/nvme*
に現れるはずです。NVMe デバイスの命名に関する説明は デバイスファイル#NVMe を見てください。
その他のユーザスペース NVMe ツールは nvme-cli や nvme-cli-gitAUR に含まれています。
サポートされているファイルシステム、パフォーマンスの最適化、ディスクの読み書きの最小化などは ソリッドステートドライブ を見てください。
管理
接続されているすべての NVMe SSD の名前、シリアル番号、サイズ、LBAフォーマット、シリアルを一覧表示します:
# nvme list
ドライブとドライブがサポートする機能に関する情報を、人間にわかりやすい方法で一覧表示します:
# nvme id-ctrl -H /dev/nvme0
名前空間とサポートされている機能に関する情報を一覧表示します:
# nvme id-ns /dev/nvme0n1
NVMeエラーログページを表示します:
# nvme error-log /dev/nvme0
名前空間を削除します:
# nvme delete-ns /dev/nvme0n1
新しい名前空間を作成します。例えば、より小さなサイズの名前空間を作成して、SSDをオーバープロビジョニングし、耐久性、パフォーマンスおよび遅延を改善します:
# nvme create-ns /dev/nvme0
すべてのコマンドのリストと簡潔な説明については、nvme help
や nvme(1) を参照してください。
SMART
健康状態、温度、耐久性などの NVMe SMART ログページを出力します:
# nvme smart-log /dev/nvme0
NVMe サポートは smartmontools バージョン 6.5 で追加されました。
現在実装されている機能は (wiki から拝借):
- コントローラ名、ファームウェア、容量に関する基本的な情報 (
smartctl -i
) - コントローラと名前空間の機能 (
smartctl -c
) - SMART の総合的健康状態の自己評価テストの結果と警告 (
smartctl -H
) - NVMe の SMART 属性 (
smartctl -A
) - NVMe のエラーログ (
smartctl -l error[,NUM]
) - nvme ログをフェッチする機能 (
smartctl -l nvmelog,N,SIZE
) - smartd デーモンによる健康状態 (
-H
)、エラーカウント (-l error
)、温度 (-W DIFF,INFO,CRIT
) の追跡
詳細は S.M.A.R.T. と 公式 wiki エントリ を参照してください。コマンドの出力に関する文脈情報は この記事 を見てください。
Secure erase
ソリッドステートドライブ/メモリセルの消去#NVMe ドライブ を見てください。
ファームウェアアップデート
一般
ファームウェアは nvme-cli を使って管理できます。利用可能なスロットを出力し、スロット1が読み取り専用になっているかどうかを確認するには:
# nvme fw-log /dev/nvme0
Firmware Log for device:nvme0 afi : 0x11 frs1 : 0x32303132345a3553 (S5Z42102) frs2 : 0x32303132345a3553 (S5Z42102)
# nvme id-ctrl /dev/nvme0 -H | grep Firmware
[9:9] : 0x1 Firmware Activation Notices Supported [4:4] : 0x1 Firmware Activate Without Reset Supported [3:1] : 0x2 Number of Firmware Slots [0:0] : 0 Firmware Slot 1 Read/Write
ファームウェアをダウンロードし、指定されたスロットにコミットしてください。下記の例では、ファームウェアはまずアクティブ化されずにコミットされます (-a 0
)。次に、既存のイメージをアクティベーションします (-a 2
)。ファームウェアコミットの action 値に関する詳細は、NVMe 仕様書を参照してください。
# nvme fw-download -f S5Z42_fw_S5Z42105.bin /dev/nvme0
Firmware download success
# nvme fw-commit -s 2 -a 0 /dev/nvme0
Success committing firmware action:0 slot:2
# nvme fw-log /dev/nvme0
Firmware Log for device:nvme0 afi : 0x21 frs1 : 0x32303132345a3553 (S5Z42102) frs2 : 0x35303132345a3553 (S5Z42105)
# nvme fw-commit -s 2 -a 2 /dev/nvme0
Success committing firmware action:2 slot:2
最後に、コントローラをリセットし、新しいファームウェアをロードしてください:
# nvme reset /dev/nvme0
必要であれば、これは手動で行うこともできます:
# echo 1 > /sys/class/nvme/nvme0/reset_controller
Intel/Solidigm
Intel の SSD 事業が SK Hynix に買収[2][3]された後、"Memory and Storage Tool" (Intel MAS) から SSD のサポートが無くなり、Optane デバイスしか管理できなくなりました。[4]
Intel の SSD 事業買収により生まれた米国の子会社 Solidigm は、以前の Intel SSD を管理するための新しいユーティリティを提供しています: 「Solidigm Storage Tool (SST とも) は、Solidigm SSD の管理を支援します。このツールは、ドライブの情報と健康状態へのアクセス、SMART 属性、ファームウェアアップデート、診断スキャン、secure erase の機能を提供します。」[5]
solidigm-sst-storage-tool-cliAUR をインストールし、あなたのドライブでアップデートが利用可能か確認してください:
# sst show -ssd
- ABCD012345NS512A - Capacity : 512.11 GB (512,110,190,592 bytes) DevicePath : /dev/nvme0n1 DeviceStatus : Healthy Firmware : 004C FirmwareUpdateAvailable : 005C Index : 0 MaximumLBA : 1000215215 ModelNumber : INTEL SSDPEKNW512G8 ProductFamily : Intel SSD 660p Series SMARTEnabled : True SectorDataSize : 512 SerialNumber : ABCD012345NS512A
アップデートが利用可能であるならば、前のコマンドで出力された Index の値を使用して、以下のように load
コマンドを実行してください:
# sst load -ssd index
WARNING! You have selected to update the drives firmware! Proceed with the update? (Y|N): Y Updating firmware... Firmware update successful
詳細は、このツールの上述の公式ページで提供されているユーザガイドを参照してください。
Kingston
Kingston はウェブサイトでの個別のファームウェアダウンロードを提供しておらず、その代わりに Windows のみのユーティリティを紹介しています。ファームウェアファイルは、ファームウェアのリビジョンに基づく予測可能な命名規則を使用しているようです:
https://media.kingston.com/support/downloads/S5Z42105.zip
次に、一般的なフラッシュの手順に進んでください。
Samsung
Windows ユーザのための "Samsung Magician Software" に次いで、Samsung はブータブル ISO イメージの SSD ファームウェアも提供しています:
https://semiconductor.samsung.com/consumer-storage/support/tools/
ISO イメージはブータブルな CD や USB ドライブに書き込むことができます。または、イメージを展開して live 環境で作業を行うこともできます:
$ curl -OL https://samsung.com/.../xxx.iso $ bsdtar -xf xxx.iso initrd $ bsdtar -xf initrd root # ./root/fumagician/fumagician
メーカーのプログラムを使わずに、前のセクションで説明されているように nvme-cli を使って、ファームウェアを手動でアップロードしたい場合もあるかもしれません:
$ ls -1 root/fumagician/*.enc
root/fumagician/1B2QJXD7.enc root/fumagician/DSRD.enc
1番目のファイルがファームウェアです。
パフォーマンス
セクタサイズ
Advanced Format#NVMe ソリッドステートドライブ を見てください。
Discard
ext4 や LVM を使用する普通のセットアップではデフォルトで Discard は無効になりますが、ファイルシステムによっては明示的に無効化する必要があります。
SSD メーカーの Intel はファイルシステムレベルで discard を有効にすることを推奨していませんが、定期的な TRIM の方法や fstrim
を手動で適用することを提案しています。[6]
エアフロー
NVMe SSD は負担時に高熱になることが知られており、特定の閾値に達すると性能が制限されます。[7]
テスト
Raw デバイスの性能テストは hdparm で実行できます:
# hdparm -Tt --direct /dev/nvme0n1
省電力 (APST)
NVMe の電源状態 (power state) を確認するには、nvme-cli か nvme-cli-gitAUR をインストールし、nvme get-feature /dev/nvme[0-9] -f 0x0c -H
を実行してください:
# nvme get-feature /dev/nvme0 -f 0x0c -H
get-feature:0xc (Autonomous Power State Transition), Current value:0x000001 Autonomous Power State Transition Enable (APSTE): Enabled Auto PST Entries ................. ...
APST が有効化されているときは、出力に "Autonomous Power State Transition Enable (APSTE): Enabled" という文章が含まれているはずであり、その下のテーブルには、利用可能な各状態に移行する前のアイドル時間を示す非ゼロなエントリが存在するはずです。
APST は有効化されているが、テーブル内に非ゼロな状態が存在しない場合、レイテンシが高すぎて状態がデフォルトで有効化されていないのかもしれません。nvme id-ctrl /dev/nvme[0-9]
(root として実行) の出力には、NVMe コントローラの利用可能な非動作電源状態が出力されるはずです。どれかの状態の合計のレイテンシ (enlat + xlat) が 25000 (25ms) より大きい場合、nvme_core
カーネルモジュールの default_ps_max_latency_us
パラメータにそのレイテンシ値以上の値を渡す必要があります。これにより、APST が有効になり、nvme get-feature
(root として実行) の表にエントリが表示されるようになるはずです。
トラブルシューティング
APST サポートの問題によるコントローラの機能不全
一部の NVMe デバイスでは省電力 (APST) に関連する問題が発生する場合があります。これはファームウェア S5Z42105 の時点で Kingston A2000 [8] の既知の問題であり、以前に Samsung NVMe ドライブ (Linux v4.10) で報告されていました [9][10]。
機能不全が発生すると、システムをリセットするまでデバイスが利用できなくなり、以下に似たカーネルログが出力されます:
nvme nvme0: I/O 566 QID 7 timeout, aborting nvme nvme0: I/O 989 QID 1 timeout, aborting nvme nvme0: I/O 990 QID 1 timeout, aborting nvme nvme0: I/O 840 QID 6 timeout, reset controller nvme nvme0: I/O 24 QID 0 timeout, reset controller nvme nvme0: Device not ready; aborting reset, CSTS=0x1 ... nvme nvme0: Device not ready; aborting reset, CSTS=0x1 nvme nvme0: Device not ready; aborting reset, CSTS=0x1 nvme nvme0: failed to set APST feature (-19)
回避策として、nvme_core.default_ps_max_latency_us=0
カーネルパラメータを追加することで APST を完全に無効化するか、あるいはカスタムの閾値を設定して特定の状態を無効化することができます。
2021年3月から、Kingston からのファームウェアアップデート 9 が利用可能です。Kingston は Windows のみをサポートしているため、Linux 用のダウンロードは heise.de や github で入手できます。カーネルの回避策が行われている限り、最も深い省電力状態には到達しないため、ファームウェアのアップデートはあまり効果がないことが予想されます。
# smartctl -a /dev/nvme0
Supported Power States St Op Max Active Idle RL RT WL WT Ent_Lat Ex_Lat 0 + 9.00W - - 0 0 0 0 0 0 1 + 4.60W - - 1 1 1 1 0 0 2 + 3.80W - - 2 2 2 2 0 0 3 - 0.0450W - - 3 3 3 3 2000 2000 4 - 0.0040W - - 4 4 4 4 15000 15000
渡される値は exit レイテンシ (Ex_Lat) の最大値です。例えば、PS4 を無効化するには nvme_core.default_ps_max_latency_us=2000
を設定してください。
サスペンドサポートの問題によるコントローラの機能不全
一部のユーザ (例えば、ノートパソコン/HP を見てください) は、特定の NVMe ドライブでサスペンドに失敗すると報告しています。上記の通り、機能不全により、システムをリセットするまでデバイスが操作不能になり、カーネルメッセージが出力されます:
nvme nvme0: Device not ready; aborting reset, CSTS=0x3 nvme nvme0: Removing after probe failure status: -19
回避策として、iommu=soft
カーネルパラメータを追加し、ハードウェア IOMMU の代わりにソフトウェアのものを使用することができます。(詳細はこのドキュメントを見てください。) これにより、処理の僅かなオーバーヘッドが発生する可能性があります。
また、以下のようなメッセージの I/O エラーが発生した場合、AMD CPU と KIOXIA KBG40ZN* nvme を搭載している HP ノート PC で amd_iommu=off
かより良い amd_iommu=fullflush
を試すこともできます:
Failed to rotate /var/log/journal/*/system.journal: Read-only file system nvme nvme0: Device not ready; aborting reset, CSTS=0x3 BTRFS error (device nvme0n1): bdev /dev/nvme0n1p* errs: wr 2, rd 0, flush 0, corrupt 0, gen 0