背景:华为1230版本
现象:NVME盘获取不到Smart信息
求助:请问是否有已知问题
目前定位情况:
1)现象:
2)硬件拓扑图
3)日志发现mctp over smbus建链失败,提前退出,没有走到更新smart信息流程

R2480V2_123456_20250207-1344.tar.split.zip.003.txt (4.2 MB)
背景:华为1230版本
现象:NVME盘获取不到Smart信息
求助:请问是否有已知问题
目前定位情况:
1)现象:
2)硬件拓扑图
3)日志发现mctp over smbus建链失败,提前退出,没有走到更新smart信息流程

R2480V2_123456_20250207-1344.tar.split.zip.003.txt (4.2 MB)
答案内容由AI生成,仅供参考:
| 项目 | 结论 |
|---|---|
| 是否已知问题? | |
| 是否为版本兼容问题? | |
| 主要根因 | MCTP endpoint 未建立 → NVMe-MI 无法通信 → SMART 数据未更新 |
| 根本解决路径 | 1. 升级 openUBMC 到支持版本 2. 确保 MCTP Routing 正常 3. 确保 storage 注册了 Transport |
根据您提供的信息,当前在华为1230版本系统中存在NVMe硬盘无法获取SMART健康信息的问题。以下是基于已知上下文的全面分析与建议。
设备背景:华为iBMC环境,版本1230
核心现象:
255或4294967295,表示无效/未获取)典型日志特征:
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),但关键健康指标缺失或非法。
您的日志显示:
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建链失败,提前退出”,这说明:
GetSmartInfo 等SMART获取流程无法执行NVMe-MI (NVM Express Management Interface) 是用于带外(out-of-band)监控和管理NVMe SSD的标准协议。mctpd 负责建立 MCTP 链路,storage 组件通过其调用 GetSmartInfo 获取SMART数据get_nvme_smart_info() 失败 → SMART字段填充默认/异常值(如255)根据知识库文档:
“全新的未适配过的NVMe盘可能需要适配NVME-mi/SSD-Format协议。”
——《硬盘背板开发指南》
nvme_mi_standard 协议适配MCTP over SMBus 模式(仅支持 PCIe)| 步骤 | 操作 | 预期结果 |
|---|---|---|
| 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 Sideband 或 MCTP 能力 |
| 5 | 检查 VPD 中是否有协议标识 | 查看 VirtualVPDConnect 对象是否读取到正确协议信息并更新至 Connector_ComVPD.AuxId |
| 6 | 确认是否使用了SMBus降级路径 | PCIe链路异常时会降级使用SMBus,但部分NVMe盘仅支持PCIe-MCTP |
MCTP Endpoint 创建依赖路由表
mctpd 只有在从 IMU 获取到有效的 routing entry 后才会创建 Endpointstart update route table 和 add routing entryOpenUBMC 新增 NVMe 支持情况
协议库支持
libmgmt_protocol.nvme_mi_standard 必须启用才能支持标准 SMART 信息获取get_pd_sas_smart_info 类接口将返回空NVMe-MI over MCTP 协议栈支持# 查看路由对象
busctl --user tree bmc.kepler.mctpd | grep Routing
RootBDF="0000:72:04.0")的 routing entry,则说明 IMU 未返回路径storage 组件需调用 mctp_lib.get_endpoint_and_transport() 注册 transportmctpd 不会创建 endpointOOB_TYPE_OVER_PCIE 类型通信(参考 sml.OOB_TYPE_OVER_PCIE)在 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
| 项目 | 结论 |
|---|---|
| 是否已知问题? | |
| 是否为版本兼容问题? | |
| 主要根因 | MCTP endpoint 未建立 → NVMe-MI 无法通信 → SMART 数据未更新 |
| 根本解决路径 | 1. 升级 openUBMC 到支持版本 2. 确保 MCTP Routing 正常 3. 确保 storage 注册了 Transport |
nvme_mi_standard 协议定义如果您能提供以下信息,可进一步精准定位:
mctpd 日志中是否有 add routing entry 对应 0000:72:04.0 的记录?如需继续深入,建议升级系统版本或联系华为技术支持提供补丁包。
需要看该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:
![]()
另外,华为内部的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中的所有日志都没有打印
看你发的日志是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会失败?
init_nvme_mi_mctp方法中 create_nvmemi_endpoint失败后再尝试create_mctp_endpoint_for_smbus
create_nvmemi_endpoint–>create_endpoint_and_transport_obj方法看起来是卡住在pcall( mctp_lib.get_endpoint_and_transport
第一个失败常遇见的原因有以下几个
1.硬盘不支持mctp over pcie
2.硬盘当前固件不支持
3.硬盘当前未打开nvmemi特性