パッケージ探訪: libnvme
2024年11月16日
著者: 竹洞 陽一郎
はじめに
今回は、Slackware-currentで11/15に更新されたlibnvmeについてご紹介します。
libnvmeとは
libnvmeは、NVMeデバイスとのやり取りを容易にするためのオープンソースのCライブラリです。
NVMe(Non-Volatile Memory Express)は、SSDなどの高速ストレージデバイスのパフォーマンスを最大限に引き出すために設計されたインターフェース規格です。
このライブラリを使うことで、ユーザーや開発者はNVMeデバイスの情報取得、管理、パフォーマンス計測など、複雑な操作をシンプルに行うことができます。
Linux環境での利用が想定されており、NVMeの標準仕様に沿った高度な機能をサポートしています。
libnvmeの主な機能
libnvmeは、以下のような機能を提供しています。
- NVMeデバイスの検出と管理
-
libnvmeを利用することで、接続されているNVMeデバイスを簡単に検出し、管理することが可能です。
例えば、デバイスの状態を確認したり、健康状態をモニタリングすることができます。 - I/O操作のサポート
-
NVMeデバイスへのI/Oリクエストの送信を簡単に行えます。
これにより、データの読み書き操作やキューの管理が容易になります。 - 標準に基づく拡張性
- libnvmeはNVMe仕様に準拠しており、標準コマンドセットのサポートはもちろん、ZNS(ゾーン名前空間)などの最新の機能にも対応しています。
nvmeコマンド
libnvmeには、nvmeというコマンドが実装されており、多種多様なサブコマンドが実装されています。
サブコマンド | 実行内容 |
---|---|
list | マシン上のすべてのNVMeデバイスと名前空間を一覧表示 |
list-subsys | NVMeサブシステムを一覧表示 |
id-ctrl | NVMeコントローラを識別する |
id-ns | NVMe名前空間を識別し、構造を表示 |
id-ns-granularity | NVMe名前空間の粒度リストを識別し、構造を表示 |
id-ns-lba-format | 指定されたLBAフォーマットインデックスのNVMe名前空間を識別し、構造を表示 |
list-ns | NVMeリストを識別し、構造を表示 |
list-ctrl | NVMeコントローラリストを識別し、構造を表示 |
nvm-id-ctrl | NVMe NVMコマンドセットのコントローラを識別し、構造を表示 |
nvm-id-ns | NVMe NVMコマンドセットの名前空間を識別し、構造を表示 |
nvm-id-ns-lba-format | 指定されたLBAフォーマットインデックスのNVMe NVMコマンドセットの名前空間を識別し、構造を表示 |
primary-ctrl-caps | プライマリコントローラの機能を識別 |
list-secondary | プライマリコントローラに関連するセカンダリコントローラを一覧表示 |
cmdset-ind-id-ns | I/Oコマンドセットに依存しない名前空間を識別 |
ns-descs | NVMe名前空間の記述子リストを識別し、構造を表示 |
id-nvmset | NVMe NVMセットリストを識別し、構造を表示 |
id-uuid | NVMe UUIDリストを識別し、構造を表示 |
id-iocs | NVMe I/Oコマンドセットを識別し、構造を表示 |
id-domain | NVMeドメインリストを識別し、構造を表示 |
list-endgrp | 耐久グループのリストを識別し、構造を表示 |
create-ns | 指定されたパラメータで名前空間を作成 |
delete-ns | コントローラから名前空間を削除 |
attach-ns | 指定されたコントローラに名前空間をアタッチ |
detach-ns | 指定されたコントローラから名前空間をデタッチ |
get-ns-id | オープンされたブロックデバイスの名前空間IDを取得 |
get-log | NVMeの一般的なログを取得し、生の形式で返す |
telemetry-log | FWテレメトリログを取得し、ファイルに書き込む |
fw-log | FWログを取得し、表示する |
changed-ns-list-log | 変更された名前空間リストを取得し、表示する |
smart-log | SMARTログを取得し、表示する |
ana-log | ANAログを取得し、表示する |
error-log | エラーログを取得し、表示する |
effects-log | コマンドの影響ログを取得し、表示する |
endurance-log | 耐久グループのログを取得し、表示する |
predictable-lat-log | 各Nvmsetの予測可能な遅延ログを取得し、表示する |
pred-lat-event-agg-log | 予測可能な遅延イベント集計ログを取得し、表示する |
persistent-event-log | 永続的なイベントログを取得し、表示する |
endurance-event-agg-log | 耐久グループイベントの集計ログを取得し、表示する |
lba-status-log | LBAステータス情報ログを取得し、表示する |
resv-notif-log | 予約通知ログを取得し、表示する |
boot-part-log | ブートパーティションログを取得し、表示する |
phy-rx-eom-log | 物理インターフェースレシーバーのアイオープニング測定を取得し、表示する |
get-feature | 機能を取得し、結果の値を表示する |
device-self-test | 必要なテストを実行してパフォーマンスを観察する |
self-test-log | 自己テストログを取得し、表示する |
supported-log-pages | サポートされているログページの詳細を取得し、表示する |
fid-support-effects-log | FIDのサポートおよび影響ログを取得し、表示する |
mi-cmd-support-effects-log | MIコマンドのサポートおよび影響ログを取得し、表示する |
media-unit-stat-log | メディアユニットの構成と摩耗状況を取得し、表示する |
supported-cap-config-log | サポートされている容量構成記述子のリストを取得 |
set-feature | 機能を設定し、結果の値を表示する |
set-property | プロパティを設定し、結果の値を表示する |
get-property | プロパティを取得し、結果の値を表示する |
format | 新しいブロックフォーマットで名前空間をフォーマットする |
fw-commit | ファームウェアを特定のスロットに検証してコミットする (バージョン1.2より前ではfw-activate) |
fw-download | 新しいファームウェアをダウンロードする |
admin-passthru | 任意の管理コマンドを送信し、結果を返す |
io-passthru | 任意のI/Oコマンドを送信し、結果を返す |
security-send | セキュリティ送信コマンドを送信し、結果を返す |
security-recv | セキュリティ受信コマンドを送信し、結果を返す |
get-lba-status | LBAステータスコマンドを送信し、結果を返す |
capacity-mgmt | 容量管理コマンドを送信し、結果を返す |
resv-acquire | 予約獲得を送信し、結果を返す |
resv-register | 予約登録を送信し、結果を返す |
resv-release | 予約解除を送信し、結果を返す |
resv-report | 予約レポートを送信し、結果を返す |
dsm | データセット管理コマンドを送信し、結果を返す |
copy | シンプルなコピーコマンドを送信し、結果を返す |
flush | フラッシュコマンドを送信し、結果を返す |
compare | 比較コマンドを送信し、結果を返す |
read | 読み取りコマンドを送信し、結果を返す |
write | 書き込みコマンドを送信し、結果を返す |
write-zeroes | ゼロを書き込むコマンドを送信し、結果を返す |
write-uncor | 訂正不可能な書き込みコマンドを送信し、結果を返す |
verify | 検証コマンドを送信し、結果を返す |
sanitize | サニタイズコマンドを送信する |
sanitize-log | サニタイズログを取得し、表示する |
reset | コントローラをリセットする |
subsystem-reset | サブシステムをリセットする |
ns-rescan | NVMe名前空間を再スキャンする |
show-regs | コントローラのレジスタまたはプロパティを表示する。キャラクタデバイスが必要 |
set-reg | レジスタを設定し、結果の値を表示する |
get-reg | レジスタを取得し、結果の値を表示する |
discover | NVMeoFサブシステムを検出する |
connect-all | NVMeoFサブシステムを検出し、接続する |
connect | NVMeoFサブシステムに接続する |
disconnect | NVMeoFサブシステムから切断する |
disconnect-all | すべての接続されたNVMeoFサブシステムから切断する |
config | NVMeoFサブシステムの構成 |
gen-hostnqn | NVMeoFホストNQNを生成する |
show-hostnqn | NVMeoFホストNQNを表示する |
gen-dhchap-key | NVMeoF DH-HMAC-CHAPホストキーを生成する |
check-dhchap-key | NVMeoF DH-HMAC-CHAPホストキーを検証する |
gen-tls-key | NVMeoF TLS PSKを生成する |
check-tls-key | NVMeoF TLS PSKを検証する |
tls-key | NVMeoF TLS PSKを操作する |
dir-receive | ディレクティブ受信コマンドを送信し、結果を返す |
dir-send | ディレクティブ送信コマンドを送信し、結果を返す |
virt-mgmt | プライマリとセカンダリコントローラ間でフレキシブルリソースを管理する |
rpmb | リプレイプロテクションメモリブロックコマンド |
lockdown | ロックダウンコマンドを送信し、結果を返す |
dim | ディスカバリーコントローラにディスカバリー情報管理コマンドを送信する |
show-topology | トポロジを表示する |
io-mgmt-recv | I/O管理受信 |
io-mgmt-send | I/O管理送信 |
nvme-mi-recv | NVMe-MI受信コマンドを送信し、結果を返す |
nvme-mi-send | NVMe-MI送信コマンドを送信し、結果を返す |
version | プログラムのバージョンを表示する |
help | このヘルプを表示する |
例えば、詳細なS.M.A.R.T(Self-Monitoring, Analysis and Reporting Technology)ログを取得するには、smart-logというオプションを使います。
sudo nvme smart-log /dev/nvme0 Smart Log for NVMe device:nvme0 namespace-id:ffffffff critical_warning : 0 temperature : 37 °C (310 K) available_spare : 100% available_spare_threshold : 5% percentage_used : 0% endurance group critical warning summary: 0 Data Units Read : 4751861 (2.43 TB) Data Units Written : 5374489 (2.75 TB) host_read_commands : 19291776 host_write_commands : 22572763 controller_busy_time : 89 power_cycles : 230 power_on_hours : 1702 unsafe_shutdowns : 38 media_errors : 0 num_err_log_entries : 497 Warning Temperature Time : 0 Critical Composite Temperature Time : 0 Thermal Management T1 Trans Count : 0 Thermal Management T2 Trans Count : 0 Thermal Management T1 Total Time : 0 Thermal Management T2 Total Time : 0
libnvmeのプラグイン
特定のベンダー固有の機能や特定のNVMe機能をサポートするために、プラグインが用意されています。
プラグイン名 | 説明 |
---|---|
amzn | Amazonのベンダー固有の拡張機能 |
dapustor | DapuStorのベンダー固有の拡張機能 |
dell | DELLのベンダー固有の拡張機能 |
dera | Deraのベンダー固有の拡張機能 |
fdp | Flexible Data Placement対応デバイスの管理 |
huawei | Huaweiのベンダー固有の拡張機能 |
innogrit | Innogritのベンダー固有の拡張機能 |
inspur | Inspurのベンダー固有の拡張機能 |
intel | Intelのベンダー固有の拡張機能 |
memblaze | Memblazeのベンダー固有の拡張機能 |
micron | Micronのベンダー固有の拡張機能 |
nbft | ACPI NBFTテーブルの拡張機能 |
netapp | NetAppのベンダー固有の拡張機能 |
nvidia | NVIDIAのベンダー固有の拡張機能 |
sfx | ScaleFluxのベンダー固有の拡張機能 |
seagate | Seagateのベンダー固有の拡張機能 |
shannon | Shannonのベンダー固有の拡張機能 |
solidigm | Solidigmのベンダー固有の拡張機能 |
toshiba | ToshibaのNVMeプラグイン |
transcend | Transcendのベンダー固有の拡張機能 |
virtium | Virtiumのベンダー固有の拡張機能 |
wdc | Western Digitalのベンダー固有の拡張機能 |
ymtc | YMTCのベンダー固有の拡張機能 |
zns | Zoned Namespaceコマンドセット |
ssstc | SSSTCのベンダー固有の拡張機能 |
sed | SED Opalコマンドセット |
ocp | OCPクラウドSSD拡張機能 |
プラグインを使う場合、例えば、IntelのNVMeデバイスであれば、以下のようにして実行します。
sudo nvme intel smart-log /dev/nvme0
libnvmeのメンテナンス
libnvmeは、Metaのソフトウェアエンジニアである、Keith Busch氏を中心に開発されています。
Keith Busch氏は以下の経歴と実績を持っています。
- 10年以上NVMe Expressの開発に携わってきました。
- Linux kernelのNVMeドライバのコメンテナー(共同管理者)の一人です。
- NVMe仕様の策定と委員会プロセスにも貢献しています。
- QEMUのエミュレートされたNVMeコントローラーやnvme-cliなど、Linux上のNVMe関連プロジェクトの保守と貢献も行っています。
libnvmeのドキュメントは、Welcome to libnvme’s documentation!にあります。
ソースコードは、GitHubにあります。
libnvmeは、NVMe機能へのアクセスを提供するオープンソースライブラリとして開発されており、約20,000行のCコードで構成され、250の公開関数、900の定数を定義する200の列挙型、100の仕様定義構造体を含む大規模なプロジェクトとなっています。
Keith氏によるlibnvmeの解説動画はこちらで観ることができます。
まとめ
libnvmeは、NVMeデバイスの操作を簡素化し、効率的なストレージ管理を実現するための強力なライブラリです。
NVMeデバイスの性能を最大限に引き出すためには、このようなツールを利用して高度な管理・最適化を行うことが非常に有効です。
もし、NVMeデバイスを利用しているなら、libnvmeを活用してみてはいかがでしょうか。