☰
nvme-cli 构建指南:从 meson 源码编译、依赖配置到静态与 Windows 构建全解析
2026/10/5 2:03:32 网站建设 项目流程
  • CLI
  • 存储

【免费下载链接】nvme-cli

NVMe management command line interface.

项目地址:https://gitcode.com/gh_mirrors/nv/nvme-cli
点击查看免费下载

导读

本文基于 nvme-cli 仓库的官方构建文档 Documentation/BUILDING.md,系统讲解从源码编译 nvme-cli 与 libnvme 的完整路径:包括 meson 与 Makefile 包装层的使用、可选功能依赖(json-c、openssl、keyutils 等)的配置语义、安装路径与调试/消毒器构建、scripts/build.sh封装脚本、muon 最小静态构建、Windows(MSYS2 UCRT64)构建,以及发行版打包与内核版本要求。读完本文,你将能够根据自身环境(现代发行版、老旧发行版、Windows、嵌入式交叉编译)选择最合适的构建方式,并精确掌握每个 meson 选项的作用与默认值。

构建系统概览:meson 为基座,多套封装并存

nvme-cli 以 meson 作为官方构建系统,但针对不同环境提供了多种入口:

  • 现代系统:直接使用meson或顶层Makefile包装层;
  • 老旧发行版:meson 版本过旧时,可使用samurai(ninja 的轻量替代)+muon(meson 的轻量替代)组合,二者对构建环境依赖极小,且有scripts/build.sh提供一键环境搭建;
  • Windows:通过 MSYS2 的 UCRT64 环境构建。

一条最小构建路径仅需三样工具:

  • gcc(或 clang)
  • ninja
  • meson 1.0.0 或更高版本

从 nvme-cli 3.x 开始,libnvme 已完全并入 nvme-cli 源码树,构建 libnvme 不再需要单独的外部仓库或软件包,所有 libnvme 与 libnvme-mi 代码均随 nvme-cli 一同编译——这一点在 Documentation/BUILDING.md 中有明确说明,也直接简化了后续所有构建步骤。

nvme-cli 3.x 及之后的依赖模型

从 3.x 起,核心依赖被显著收敛。下表汇总了构建时的库依赖关系:

库依赖类型说明
libnvme、libnvme-mi集成无外部依赖,随 nvme-cli 源码一起编译
json-c可选建议安装;缺失时所有插件被禁用,且 JSON 输出格式不可用
libkmod可选缺失时 nvme-cli 无法在需要时加载 nvme-fabrics 内核模块

json-c 的“可选但强烈建议”定位在源码中有直接印证:nvme-cli 在 src/nvme-json.c 中实现了自定义序列化器util_json_object_string_to_number(),通过json_object_set_serializer()安装到 json 对象上,并在序列化时调用 json-c 的printbuf_memappend()。该函数以私有符号版本JSONC_PRIVATE导出,意味着 json-c 并不承诺其 ABI 长期稳定——这是选用 json-c 时需要注意的兼容性事实。

可选功能依赖:每个 meson 选项背后的能力

所有可选库均可通过-Doption=enabled显式启用、-Doption=disabled显式禁用,默认值多为auto(检测到即使用),下表整理自 Documentation/BUILDING.md:

选项默认值最低版本解锁的功能
json-cauto0.13/etc/nvme/config.json解析、全部厂商插件、JSON 输出格式
opensslauto3.0NVMe-TCP 上的 TLS、主机认证;若 LibreSSL 提供openssl/core_names.h也可用
keyutilsauto1.5NVMe-oF 认证的密钥管理
libkmodauto5需要时加载 nvme-fabrics 模块
libdbusdisabled—NVMe-MI 的端点发现
liburingdisabled2.2通过 io_uring 执行异步 admin 与 I/O passthrough 命令
pythonauto3.6libnvme 的 Python 绑定
nvme-discoverdautolibsystemd 253nvme-discoverd 守护进程(见下文 Daemons 与 systemd)
mdnsautolibsystemd 258nvme-discoverd 中的 mDNS 发现(见下文 Daemons 与 systemd)

一个显式禁用的例子(关闭 Python 绑定):

$ meson setup .build -Dpython=disabled

这些选项的定义与取值约束均可在 meson_options.txt 中查到,例如python是feature类型(值为auto),而plugins是array类型。如需查看包括 meson 内建选项在内的完整列表:

$ meson configure .build

守护进程与 systemd 版本门槛

nvme-discoverd 及其 mDNS 能力在构建期(libsystemd)与运行期(服务管理器及其他 systemd 服务)都依赖 systemd,且两个阶段的版本要求一致:

功能最低 systemd 版本原因
nvme-discoverd253使用Type=notify-reload
nvme-discoverd 中的 mDNS258使用 systemd-resolved 的BrowseServices方法

运行行为上,nvme-discoverd 启动时会检查 systemd-resolved 是否提供BrowseServices;若不提供,守护进程仅记录一条警告并以无 mDNS 模式运行,不会因此失败。这一点与 meson_options.txt 中对nvme-discoverd、mdns选项的说明(分别要求 libsystemd ≥ 253、≥ 258)相互印证。

标准 meson 构建流程

配置(Configure)

由于 libnvme 已并入源码树,配置无需任何特殊参数,直接:

$ meson setup .build

meson 的--wrap-mode参数可控制额外依赖的解析方式,取值如下:

--wrap-mode {default,nofallback,nodownload,forcefallback,nopromote}

注意:nvme-cli 的default实际被设置为nofallback,即默认不会自动回退到下载 subproject 依赖。

编译(Build)

$ meson compile -C .build

安装(Install)

# meson install -C .build

需要静态库而非共享库时,在配置阶段指定:

$ meson setup --default-library=static .build

运行单元测试

$ meson test -C .build

安装路径与发行版式安装

meson 默认将一切安装到/usr/local(可执行文件在/usr/local/bin,库在/usr/local/lib,配置在/usr/local/etc等),由两个 meson 内建选项控制,其默认值在 meson.build 与 meson.build 中设置:

选项默认值
--prefix/usr/local
--sysconfdiretc(相对 prefix,即/usr/local/etc)

若希望像 Linux 发行版那样安装到系统标准位置(/usr/bin、/usr/lib、/etc等),在配置时传入:

$ meson setup .build --prefix /usr --sysconfdir /etc

生产环境安装可再追加--buildtype release,以禁用调试符号并开启优化:

$ meson setup .build --prefix /usr --sysconfdir /etc --buildtype release

调试与消毒器(Sanitizer)构建

调试构建(关闭优化、开启调试符号):

$ meson setup .build --buildtype=debug

启用 AddressSanitizer(运行时检测内存错误):

$ meson setup .build -Db_sanitize=address

若在 sanitizer 构建时遇到链接问题,需要预加载libasan.so:

$ meson setup .build -Db_sanitize=address && \ LD_PRELOAD=/lib64/libasan.so.6 ninja -C .build test

Undefined Behavior Sanitizer 同样受支持:-Db_sanitize=undefined;同时启用两者:

$ meson setup .build -Db_sanitize=address,undefined

scripts/build.sh 封装脚本:CI 与多配置构建

scripts/build.sh 是 CI 使用的构建脚本,也可用于日常配置与构建。不带参数运行时,它以默认配置(meson、gcc、默认选项)构建项目。

切换编译器为 clang:

scripts/build.sh -c clang

启用全部 fallback 依赖下载:

scripts/build.sh fallback

脚本支持丰富的命令行参数(详见其 usage 输出),包括:

  • -b [release|debug]:构建类型
  • -c [gcc|clang]:编译器
  • -m [meson|muon]:构建工具
  • -a:使用 clang analyzer 做静态分析
  • -p:启用覆盖率报告
  • -s:以 ASan+UBSan 运行测试
  • -x:以 valgrind 运行测试
  • -t [arm|ppc64le|s390x|i386]:交叉编译目标
  • --e2e-controller、--e2e-ns1等:为tests配置指定真实硬件端到端测试设备

脚本内置了多种 meson 配置模板(default、libdbus、liburing、fallback、cross、distro、docs、static、minimal_static、nofabrics、libnvme、tests等),例如config_meson_static()会以--default-library=static、--wrap-mode=forcefallback并禁用 keyutils/libkmod/liburing/python/openssl/nvme-discoverd 等来产出静态二进制。这些配置与 meson_options.txt 中的 e2e-* 系列选项一一对应。

muon 最小静态构建

scripts/build.sh -m muon会下载并自行构建samurai与muon,用它们替代 meson 完成项目构建。这使构建环境依赖降到最低:

  • gcc
  • make
  • git

同时该配置会产出静态二进制。从脚本源码看,muon 默认配置使用-Ddefault_library=static、-Dc_link_args="-static"、-Dwrap_mode=forcefallback,并禁用 json-c/python/openssl/keyutils/nvme-discoverd,构建完成后还会用ldd检查产物确为非动态可执行文件(见 scripts/build.sh)。

Makefile 包装层:向后兼容入口

顶层 Makefile 是对 meson 的向后兼容包装:

$ make # make install

注意:旧版本中 libnvme 需要手工安装,nvme-cli 3.x 及之后不再需要。Makefile 内部即通过MESON_ARGS转发给meson setup/meson compile/meson install(见 Makefile)。

Makefile 还提供两个额外目标:

RPM 构建(基于 meson):

$ make rpm

静态无依赖二进制构建:

$ make static

若不清楚如何使用,可先查看顶层文档:

$ man nvme

或查看命令简要摘要:

$ nvme help

按需构建特定厂商插件

默认情况下所有厂商插件都会构建。若只想构建特定插件,使用plugins选项:

$ meson setup .build -Dplugins=intel,wdc,ocp $ meson compile -C .build

或通过 Makefile 包装层:

$ make PLUGINS="intel,wdc,ocp"

未使用PLUGINS时其值默认为all,即选择全部插件:

$ make PLUGINS="all"

不带任何厂商插件构建:

$ make PLUGINS=""

Makefile 将PLUGINS变量转换为-Dplugins=追加到MESON_ARGS(见 Makefile)。plugins选项的可选值在 meson_options.txt 中完整列出,包括 amzn、config、dell、intel、wdc、ocp、micron、samsung、seagate、huawei、nvidia、solidigm 等四十余项;选项留空([])即不构建任何插件。

Windows 构建(MSYS2 UCRT64)

nvme-cli 可在 Windows 上通过 MSYS2 的 UCRT64 环境构建。安装 MSYS2(winget install MSYS2.MSYS2)后,在 UCRT64 环境中运行 scripts/win-ucrt64-setup.sh 即可安装所需的构建系统与 nvme-cli 依赖。

该脚本基于 pacman 安装以下组件(见 scripts/win-ucrt64-setup.sh):

  • git
  • mingw-w64-ucrt-x86_64-toolchain(MinGW 工具链)
  • mingw-w64-ucrt-x86_64-meson
  • mingw-w64-ucrt-x86_64-ninja
  • mingw-w64-ucrt-x86_64-ccache
  • mingw-w64-ucrt-x86_64-json-c
  • mingw-w64-ucrt-x86_64-python-jsonschema

脚本支持-u参数,在安装前先刷新软件包数据库并升级全部软件包(对应 pacman 的-Syu)。环境就绪后,即可按上文的标准 meson 流程(meson setup→meson compile→meson install)完成构建。

发行版打包

nvme-cli 已在众多主流发行版中提供(Alpine、Arch、Debian、Fedora、FreeBSD、Gentoo、Ubuntu、Nix(OS)、openSUSE 等),常见软件包名为nvme-cli。

  • OpenEmbedded/Yocto:meta-openembedded层集合中提供 nvme-cli recipe。
  • Buildroot:nvme-cli以nvme为包名提供。

内核版本要求

libnvme 依赖/sys/class/nvme-subsystem接口,该接口自 Linux 内核 v4.15 起引入,因此nvme-cli 要求内核 v4.15 或更高版本(见 Documentation/BUILDING.md)。构建或部署前请先确认目标系统的内核版本满足此门槛。

总结:如何选择构建路径

根据环境差异,可按以下原则选择构建方式:

场景推荐路径
现代发行版、常规开发meson setup .build && meson compile -C .build
需要兼容旧工具链习惯顶层make/make install
CI 或多配置验证scripts/build.sh(含 clang、asan、valgrind、交叉编译等参数)
老旧发行版、工具链受限scripts/build.sh -m muon(samurai + muon,静态二进制)
WindowsMSYS2 UCRT64 +scripts/win-ucrt64-setup.sh
最小化功能集按需-Djson-c=disabled、-Dopenssl=disabled等显式关闭,或-Dplugins=精简约插件

无论选择哪条路径,配置完成后都可用meson test -C .build运行单元测试、用meson configure .build查看全部可用选项,确保构建产物与预期功能集一致。

  • CLI
  • 存储

【免费下载链接】nvme-cli

NVMe management command line interface.

项目地址:https://gitcode.com/gh_mirrors/nv/nvme-cli
点击查看免费下载
上一篇:Regal 规则详解:用 Rego 函数参数模式匹配替代相等性判断(equals-pattern-matching)
下一篇:解锁ROG笔记本隐藏潜力:G-Helper全攻略,颠覆你的Anime Matrix使用体验

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询