.. _nvme-cli: ================= nvme-cli用户工具 ================= 由于数据中心需要很多监控SSD健康度和耐用度,以及更新firmware,安全擦除数据,读取设备日志等管理功能, `NVMe组织 `_ 开发了Linux用户空间命令行工具 ``nvme-cli`` ,可以在Linux系统中管理NVM-Express设备。 .. note:: 有关NVMe监控、管理和故障报告,请参考 :ref:`nvme_ssd_management` 安装 ===== 源代码编译安装 ---------------- - clone源代码是需要 ``libnvme`` 子模块,所以使用以下命令clone:: git clone --recurse-submodules https://github.com/linux-nvme/nvme-cli - 如果没有使用上述包含子模块方式clone但已经clone过源代码,则可以使用以下命令重新初始化并更新:: git submodule update --init 当然,上述命令也可以分为2个命令执行:: git submodule init git submodule update - 编译安装:: make make install 发行版安装 --------------- 主要的Linux发行版都包含了 ``nvme-cli`` ,可以使用对应包管理器安装: - Debian/Ubuntu安装:: sudo apt install nvme-cli 使用 ======= .. csv-table:: nvme-cli 命令案例和说明 :file: nvme-cli/nvme-cli.csv :widths: 25, 75 :header-rows: 1 - 列出系统所有安装的NVMe SSD: .. literalinclude:: nvme-cli/nvme_list :caption: 列出系统安装NVMe 在我的 :ref:`hpe_dl360_gen9` 上通过 :ref:`pcie_bifurcation` 安装了3根 :ref:`samsung_pm9a1` : .. literalinclude:: nvme-cli/nvme_list.txt :language: bash :caption: nvme list 输出 - 检查NVMe控制器以及支持的功能:: sudo nvme id-ctrl /dev/nvme0 输出类似: .. literalinclude:: nvme-cli/nvme_id-ctrl.txt :language: bash :linenos: :caption: nvme id-ctrl 输出 - 重要: 检查NVMe SMART健康状态,温度等:: sudo nvme smart-log /dev/nvme0n1 输出: .. literalinclude:: nvme-cli/nvme_smart-log.txt :language: bash :linenos: :caption: nvme smart-log 输出 ``smart-log-add`` 输出信息中参数说明(不是所有设备都支持, ``smart-log`` 包含了部分参数): .. csv-table:: nvme smart-log输出参数说明 :file: nvme-cli/nvme_smart-log.csv :widths: 15, 15, 70 :header-rows: 1 - 安装 ``smartmontools`` 工具之后,使用 ``smartctl`` 可以更为方便检查SMART信息:: smartctl --all /dev/nvme0n1 输出: .. literalinclude:: nvme-cli/nvme_smartctl.txt :language: bash :caption: smartctl --all /dev/nvme0n1 输出信息 - 检查firmware 日志页面:: sudo nvme fw-log /dev/nvme0n1 输出: .. literalinclude:: nvme-cli/nvme_fw-log.txt :language: bash :linenos: :caption: nvme fw-log 输出 - 输出NVMe错误日志页面:: sudo nvme error-log /dev/nvme0n1 输出部分案例: .. literalinclude:: nvme-cli/nvme_error-log.txt :language: bash :linenos: :caption: nvme error-log 输出 - (警告:我没有使用过)重置NVMe controller / NVMe SSD:: sudo nvme reset /dev/nvme0n1 NVMe Namespace解析 =================== NVMe的namespace就是NVMe技术中用于存储用户数据的结构。一个NVMe可以具有多个namespace。不过大多数情况下,现在NVMe只使用一个namespace。但是,如果是多租户(multi-tenant)应用程序,虚拟化以及安全要求等业务场景,需要使用多名字空间(multiple namespaces)。 所谓namespace就是一组逻辑块,这些逻辑块地址范围从0到这个namespace的size; 名字空间ID (namespace ID, NSID)是控制器用来访问该名字空间的标识。 你会发现namespace的size和namespace的utilization(使用)对于生成LBA使用的比例非常有用。在标识namespace的命令输出的有用数据中能够用来优化主机软件的性能、数据一致性,TRIM(回收),LBA大小(例如512B,4kB)等等 - 检查NVMe的namesapce:: sudo nvme id-ns /dev/nvme0n1 输出: .. literalinclude:: nvme-cli/nvme_id-ns.txt :language: bash :linenos: :caption: nvme id-ns 输出 更新firmware ================ SSD厂商通常会在SSD的生产周期内多次发布firmware更新,不过一个SSD的5年生命期发布4~5次更新则很少见。firmware更新可以提供安全补丁,bug修复以及可靠性提高。OEM通常使用自己的管理工具来更新,比且会加密签名firmware以确保匹配其OEM产品,不过NVMe SSD可以从渠道分销获得通用firmware进行更新。请联系SSD供应商获取最新firmware。 请参考 NVMe 1.4 规范的 ``Firmware Update Process`` 部分,可以详细了解在哪里需要reset,firmware slot的概念(一些NVMe SSD有多个firmware副本存储在设备上,可以通过激活指定副本来运行,这样出现问题可以回退) - 查看当前firmware版本:: sudo nvme id-ctrl /dev/nvme0 | grep "fr " 可以看到firmware版本:: fr : GXA7401Q - 下载firmware到目标设备:: nvme fw-download /dev/nvme0 - nvme fw-commit /dev/nvme0 -a 0 这里 ``-a`` 参数: - ``0`` 表示将镜像替换掉 ``Firmware slot`` 字段指定的镜像,这个镜像没有激活 - ``1`` 将镜像替换掉 ``Firmware slot`` 字段指定的镜像,这个镜像在下次reset时激活 - ``2`` 通过 ``Firmware slot`` 字段制定的镜像在下次reset时激活 - ``3`` 立即激活 ``Firmware slot`` 字段指定的镜像,无需reset - 完成firmware下载之后,需要reset设备(如果这个设备不支持无需reset设备就激活镜像):: sudo nvme reset /dev/nvme0 .. warning:: 实际上firmware升级需要非常谨慎,我还没有机会实践,以上仅是一些资料整理,后续有机会再实践 参考 ====== - `NVMe management command line interface `_ - `Open Source NVMe™ Management Utility – NVMe Command Line Interface (NVMe-CLI) `_ - `Using NVMe Command Line Tools to Check NVMe Flash Health `_