【NVME盘获取不到smart信息】

背景:华为1230版本

现象:NVME盘获取不到Smart信息

求助:请问是否有已知问题

目前定位情况:

1)现象:

2)硬件拓扑图

3)日志发现mctp over smbus建链失败,提前退出,没有走到更新smart信息流程

image

R2480V2_123456_20250207-1344.tar.split.zip.003.txt (4.2 MB)

R2480V2_123456_20250207-1344.tar.split.zip.002.txt (5 MB)

R2480V2_123456_20250207-1344.tar.split.zip.001.txt (5 MB)

答案内容由AI生成,仅供参考:

:receipt: 六、结论

项目 结论
是否已知问题? :white_check_mark: 是,属于 MCTP链路未建立导致SMART信息获取失败 的典型场景
是否为版本兼容问题? :white_check_mark: 很可能。旧版本(1230)可能不支持当前NVMe盘的 NVMe-MI 协议适配
主要根因 MCTP endpoint 未建立 → NVMe-MI 无法通信 → SMART 数据未更新
根本解决路径 1. 升级 openUBMC 到支持版本
2. 确保 MCTP Routing 正常
3. 确保 storage 注册了 Transport
点击此处查看详细分析解答

NVMe盘获取不到SMART信息问题分析与解决建议

根据您提供的信息,当前在华为1230版本系统中存在NVMe硬盘无法获取SMART健康信息的问题。以下是基于已知上下文的全面分析与建议。


:magnifying_glass_tilted_left: 一、问题现象总结

  • 设备背景:华为iBMC环境,版本1230

  • 核心现象

    • NVMe硬盘的SMART信息未能正常获取或显示异常(多数字段为2554294967295,表示无效/未获取)
    • 日志显示MCTP建链流程失败,未进入SMART信息更新逻辑
  • 典型日志特征

    ZZZ update_nvme_smart_log_info
    ZZZ obj.nvme_mi_mctp_obj table: 0x50a0e23338a0 obj.nvme_mi_mctp_obj.nvme_mi_obj ntl
    

    ntl 表示 nil to lightuserdata 转换失败,可能因底层协议调用中断或对象初始化失败。

  • 数据异常示例

    bmc.kepler.Systems.Storage.Drive.NVMe.SMART {
      AvailableSpare = 255,
      CriticalWarning = 255,
      UsedPercentage = 255,
      Status = 0
    }
    

    上述值表明:虽然状态为Active(Status=0),但关键健康指标缺失或非法


:puzzle_piece: 二、根本原因分析

1. MCTP over SMBus 通信建链失败

关键线索:

  • 您的日志显示:

    function c_drive:update_nvme_smart_log_info(obj)
        if not obj.nvme_mi_mctp_obj or not obj.nvme_mi_mctp_obj.nvme_mi_obj then
            return
        end
    

    表明:obj.nvme_mi_mctp_obj.nvme_mi_obj 为空(或为 ntl),说明 NVMe-MI over MCTP 通信对象未成功创建

  • 日志提示“mctp over smbus建链失败,提前退出”,这说明:

    • 系统尝试通过 SMBus通道建立MCTP endpoint 以访问NVMe设备
    • 但通信链路创建失败,导致后续 GetSmartInfo 等SMART获取流程无法执行

:white_check_mark: 影响范围:

  • 所有依赖 MCTP-over-SMBus 协议获取带外管理信息的NVMe盘
  • 若 PCIe 上的 MCTP endpoint 未建立,则无法访问NVMe-MI(Management Interface)

2. NVMe-MI 协议支持缺失或未启用

背景知识(来自知识库):

  • NVMe-MI (NVM Express Management Interface) 是用于带外(out-of-band)监控和管理NVMe SSD的标准协议。
  • 必须通过以下方式实现:
    • 支持 MCTP over PCIe 或 MCTP over SMBus
    • NVMe设备固件需支持 NVMe-MI 功能
    • 系统需正确建立 MCTP transport 和 endpoint
  • 在 OpenUBMC 中,mctpd 负责建立 MCTP 链路,storage 组件通过其调用 GetSmartInfo 获取SMART数据

:cross_mark: 当前问题点:

  • Endpoint未建立get_nvme_smart_info() 失败 → SMART字段填充默认/异常值(如255)

3. 可能的协议适配问题

根据知识库文档:

“全新的未适配过的NVMe盘可能需要适配NVME-mi/SSD-Format协议。”
——《硬盘背板开发指南》

  • 若该NVMe盘是新型号(例如 Samsung PM9D3A 已在 openUBMC 25.09 支持,但您使用的是 1230 版本),可能存在:
    • 缺少对应的 nvme_mi_standard 协议适配
    • VPD 中无协议识别信息,导致协议解析失败
    • 不支持 MCTP over SMBus 模式(仅支持 PCIe)

:hammer_and_wrench: 三、定位与排查建议

:white_check_mark: 排查步骤清单

步骤 操作 预期结果
1 检查是否有 MCTP PCI Endpoint 建立 busctl --user introspect bmc.kepler.storage /bmc/kepler/Systems/1/Mctp/Endpoint 应包含对应PCIe地址的endpoint
2 检查 mctpd 是否完成自发现流程 日志查看是否有 set owner_eid, set bmc_eid, add routing entry 成功记录
3 确认 Transport 是否注册 storage 组件必须注册对应物理地址的 Transport,否则不会创建endpoint
4 检查 NVMe 盘是否支持 NVMe-MI 使用 lspci -vvv -s <BDF> 查看是否列出 Management SidebandMCTP 能力
5 检查 VPD 中是否有协议标识 查看 VirtualVPDConnect 对象是否读取到正确协议信息并更新至 Connector_ComVPD.AuxId
6 确认是否使用了SMBus降级路径 PCIe链路异常时会降级使用SMBus,但部分NVMe盘仅支持PCIe-MCTP

:pushpin: 四、已知问题与版本建议

:warning: 已知相关问题(来自知识库)

  1. MCTP Endpoint 创建依赖路由表

    • mctpd 只有在从 IMU 获取到有效的 routing entry 后才会创建 Endpoint
    • 如果 没有路由信息返回,即使 Transport 已注册,也不会创建 Endpoint
    • 日志应含:start update route tableadd routing entry
  2. OpenUBMC 新增 NVMe 支持情况

    • openUBMC 25.09 版本 中明确新增了对 Samsung PM9D3A、Memblaze PBlaze7、Solidigm D7-PS1010 等 NVMe 盘的支持
    • 若您的 1230 版本早于该版本,很可能尚未适配您的NVMe型号
  3. 协议库支持

    • libmgmt_protocol.nvme_mi_standard 必须启用才能支持标准 SMART 信息获取
    • 若未配置正确协议对象,get_pd_sas_smart_info 类接口将返回空

:white_check_mark: 五、解决方案建议

1. 升级至支持更强的 openUBMC 版本

  • 建议升级到 openUBMC 25.09 或更高版本,确认:
    • 是否已支持您使用的NVMe型号(如 PM9D3A)
    • 是否完善了 NVMe-MI over MCTP 协议栈支持

2. 检查 MCTP 路由是否建立成功

# 查看路由对象
busctl --user tree bmc.kepler.mctpd | grep Routing
  • 若缺少对应物理地址(如 RootBDF="0000:72:04.0")的 routing entry,则说明 IMU 未返回路径

3. 确认 storage 是否注册了 Transport

  • storage 组件需调用 mctp_lib.get_endpoint_and_transport() 注册 transport
  • 若未注册,mctpd 不会创建 endpoint

4. 确认 NVMe 固件是否支持 NVMe-MI

  • 某些消费级 NVMe(如 M.2)不支持带外管理协议
  • 企业级 NVMe(如 U.2、E3.S)通常支持,需确认规格书是否支持 NVMe-MI v1.1+

5. 强制测试 PCIe-MCTP 链路(优于 SMBus)

  • 若硬件支持,优先配置使用 MCTP over PCIe,避免 SMBus 带宽和稳定性问题
  • 配置 OOB_TYPE_OVER_PCIE 类型通信(参考 sml.OOB_TYPE_OVER_PCIE

6. 代码级修复建议

c_drive:update_nvme_smart_log_info 中增加更多日志定位点:

log:notice("ZZZ nvme_mi_obj type: %s", type(obj.nvme_mi_mctp_obj.nvme_mi_obj))
if not obj.nvme_mi_mctp_obj then
    log:error("ZZZ Missing nvme_mi_mctp_obj!")
elseif not obj.nvme_mi_mctp_obj.nvme_mi_obj then
    log:error("ZZZ Missing nvme_mi_obj! Protocol adapter not loaded?")
end

:receipt: 六、结论

项目 结论
是否已知问题? :white_check_mark: 是,属于 MCTP链路未建立导致SMART信息获取失败 的典型场景
是否为版本兼容问题? :white_check_mark: 很可能。旧版本(1230)可能不支持当前NVMe盘的 NVMe-MI 协议适配
主要根因 MCTP endpoint 未建立 → NVMe-MI 无法通信 → SMART 数据未更新
根本解决路径 1. 升级 openUBMC 到支持版本
2. 确保 MCTP Routing 正常
3. 确保 storage 注册了 Transport

:link: 七、参考文档

  1. 《openUBMC 25.09 版本发布》 - 新增对 Samsung PM9D3A 等 NVMe 的支持
  2. 《mctpd使用说明》 - MCTP endpoint 创建机制
  3. 《硬盘背板开发指南》 - NVMe 协议适配要求
  4. 《南向硬件协议库》 - nvme_mi_standard 协议定义
  5. 《storage组件说明》 - MCTP与NVMe通信流程

如果您能提供以下信息,可进一步精准定位:

  • mctpd 日志中是否有 add routing entry 对应 0000:72:04.0 的记录?
  • NVMe盘具体型号(是否在 openUBMC 25.09 支持列表内)?
  • 是否确认该盘支持 NVMe-MI 协议?

如需继续深入,建议升级系统版本或联系华为技术支持提供补丁包。

需要看该nvme盘是否支持mctp
日志在该函数内

function c_nvme:check_support_mctp()
    local ok, capcacity = pcall(function ()
        local hex_str = utils.to_hex(self.VPDChip:Read(ctx.get_context_or_default(), 0, 250))
        local number_arr = string_split(hex_str, ' ', 16)
        return number_arr
    end)
    if not ok or not capcacity then
        log:error('Nvme:%s read chip failed, err:%s', self.Slot, capcacity)
        return false
    end
    local support
    if capcacity[capcacity[VENDOR_SPECIFIC] * 8 + 1] == MULTIRECORDAREA then
        if capcacity[(capcacity[VENDOR_SPECIFIC] * 8 + 1) + 64] == PORTMULTIRECORD then
            -- 该字节为12时,再偏移10字节的数值为是否支持mctp
            support = capcacity[(capcacity[VENDOR_SPECIFIC] * 8 + 1) + 64 + 10]
        end
    elseif capcacity[capcacity[VENDOR_SPECIFIC] * 8 + 1] == PORTMULTIRECORD then
        support = capcacity[(capcacity[VENDOR_SPECIFIC] * 8 + 1) + 10]
    end
    if support ~= MCTP_SUPPORT and self.Model ~= 'DAPUSTOR DPHV5508T0TB06T4000' then
        log:error('not support nvme mi over mctp, Slot: %s, support: %s', self.Slot, support)
        return false
    end
    log:notice('support nvme mi over mctp, Slot: %s, support: %s', self.Slot, support)
    return true
end

支持mctp:

image

另外,华为内部的NVME盘能获取到smart信息吗? 看起来是共性问题呢?

那就看endpoint是否创建成功,这个出问题一般都是盘的固件版本不支持或者没开启该nvmemi特性

log:notice('creat disk%s endpoint successfully', self.nvme.Slot) // mctp over pcie
log:notice('build mctp over smbus success, count: %s', count) // mctp over smbus

日志中没搜到,应该是创建失败了。可能是在create_mctp_endpoint_for_smbus中pcall(mctp_lib.get_endpoint_and_transport)卡住了:因为create_mctp_endpoint_for_smbus中的所有日志都没有打印

1 个赞

看你发的日志是chip走smbus发送请求失败了 需要框架配合定位 我让他们看下

支持MCTP的直通NVMe获取不到SMART信息 - #14,来自 zhaower 是否和这个帖子情况一样

当前smc在扩展的i2c通道,mctp over smbus over smc,需要smc硬件支持mctp over smbus主从切换,目前smc硬件还未支持该功能,导致信息获取失败

我看nvme硬盘获取smart信息首先尝试走mctp over pcie,如果mctp over pcie失败再走mctp over smbus, 那为什么mctp over pcie会失败?

  1. init_nvme_mi_mctp方法中 create_nvmemi_endpoint失败后再尝试create_mctp_endpoint_for_smbus

  2. create_nvmemi_endpoint–>create_endpoint_and_transport_obj方法看起来是卡住在pcall( mctp_lib.get_endpoint_and_transport

第一个失败常遇见的原因有以下几个
1.硬盘不支持mctp over pcie
2.硬盘当前固件不支持
3.硬盘当前未打开nvmemi特性