- CLI
- 存储
【免费下载链接】nvme-cli
NVMe management command line interface.
导读
本文基于 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-c | auto | 0.13 | /etc/nvme/config.json解析、全部厂商插件、JSON 输出格式 |
openssl | auto | 3.0 | NVMe-TCP 上的 TLS、主机认证;若 LibreSSL 提供openssl/core_names.h也可用 |
keyutils | auto | 1.5 | NVMe-oF 认证的密钥管理 |
libkmod | auto | 5 | 需要时加载 nvme-fabrics 模块 |
libdbus | disabled | — | NVMe-MI 的端点发现 |
liburing | disabled | 2.2 | 通过 io_uring 执行异步 admin 与 I/O passthrough 命令 |
python | auto | 3.6 | libnvme 的 Python 绑定 |
nvme-discoverd | auto | libsystemd 253 | nvme-discoverd 守护进程(见下文 Daemons 与 systemd) |
mdns | auto | libsystemd 258 | nvme-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-discoverd | 253 | 使用Type=notify-reload |
| nvme-discoverd 中的 mDNS | 258 | 使用 systemd-resolved 的BrowseServices方法 |
运行行为上,nvme-discoverd 启动时会检查 systemd-resolved 是否提供BrowseServices;若不提供,守护进程仅记录一条警告并以无 mDNS 模式运行,不会因此失败。这一点与 meson_options.txt 中对nvme-discoverd、mdns选项的说明(分别要求 libsystemd ≥ 253、≥ 258)相互印证。
标准 meson 构建流程
配置(Configure)
由于 libnvme 已并入源码树,配置无需任何特殊参数,直接:
$ meson setup .buildmeson 的--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 |
--sysconfdir | etc(相对 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 testUndefined Behavior Sanitizer 同样受支持:-Db_sanitize=undefined;同时启用两者:
$ meson setup .build -Db_sanitize=address,undefinedscripts/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-mesonmingw-w64-ucrt-x86_64-ninjamingw-w64-ucrt-x86_64-ccachemingw-w64-ucrt-x86_64-json-cmingw-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,静态二进制) |
| Windows | MSYS2 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.
相关推荐
radare2 Windows 原生构建指南:从 Meson/Ninja 编译到静态 Blob 与交叉编译
radare2 Windows 原生构建指南:从 Meson/Ninja 编译到静态 Blob 与交叉编译 导读 本文以 doc/windows.md http
逆向工程网络安全SciPy 从源码构建完全指南:系统依赖、Meson 构建与自定义配置
SciPy 从源码构建完全指南:系统依赖、Meson 构建与自定义配置 SciPy 使用大量编译型代码(C、C++、Cython、Fortran 等)实现高性能
科学计算数据科学高性能计算在 macOS 上从源码构建 Rnote:依赖安装、Meson 编译与安装全指南
在 macOS 上从源码构建 Rnote:依赖安装、Meson 编译与安装全指南 本篇技术指南以仓库中的 misc/building/rnote macos b
桌面应用图形学
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考