点击此处查看详细分析解答
通过Redfish接口获取NVMe的SMART信息多字段为空值null的问题分析与解决方案
问题描述
在使用Redfish接口 /redfish/v1/Chassis/1/Drives/HDDPlaneDisk11/Metrics 获取NVMe disk的SMART信息时,除PowerOnHours外,其余SMART相关字段(如AvailableSparePercent、PercentageUsed、CriticalWarnings等)均返回为null。而通过操作系统内部命令(如nvme smart-log)可正常获取完整的SMART信息。
环境信息
- 软件版本:OpenUBMC 2512(推断)
- 硬件平台:支持NVMe设备管理的服务器平台
- 目标设备:NVMe SSD(型号:SAMSUNG MZWL63TBFLT-00B07)
- 故障磁盘标识:
HDDPlaneDisk11
信息对比分析
带内OS获取的SMART信息(完整)
在操作系统中执行nvme smart-log等命令,可查看到完整的SMART数据:
{
"Critical Warning": "0x00",
"Temperature": "29 Celsius",
"Available Spare": "100%",
"Percentage Used": "15%",
"Power On Hours": 2471,
...
}
说明:NVMe磁盘本身功能正常,SMART数据可读。
Redfish接口获取的SMART信息(部分为空)
"NVMeSMART": {
"PowerOnHours": 2471,
"AvailableSparePercent": null,
"PercentageUsed": null,
"CriticalWarnings": {
"SpareCapacityWornOut": null,
"OverallSubsystemDegraded": null,
...
}
}
结论:数据链路在BMC侧未能正确解析或传递SMART信息至Redfish接口层。
数据获取流程分析
根据上下文和架构信息,完整的NVMe SMART数据获取路径如下:
[NVMe Disk]
↓ (NVMe-MI协议 via PCIe/SMBus/MCTP)
[BMC nvme_mi_admin.command.lua]
↓ (update_smart_log → obj.smart_log)
[c_handler_nvme → update_smart_info()]
↓ (D-Bus对象更新)
[bmc.kepler.Systems.Storage.Drive.NVMe.SMART]
↓ (Redfish映射)
[/redfish/v1/Chassis/.../Metrics]
关键环节
GetSmartInfo方法:通过标准NVMe-MI协议获取SMART/Health信息(bmc.dev.NVMe.NVMeMI.GetSmartInfo)。
update_smart_log函数:解析原始二进制SMART日志并填充obj.smart_log对象。
c_handler_nvme模块:处理NVMe设备对象的数据更新。
- Redfish转换层:将
bmc.kepler.Systems.Storage.Drive.NVMe.SMART属性映射为/Metrics中的NVMeSMART结构。
问题定位分析
1. 代码中发现空指针风险
从用户提供的日志截图可见以下代码片段存在潜在问题:
function nvme_admin_command.update_smart_log(obj)
local rsp = NVME_MI_OPTIONS.smart_log_response:unpack(smart_log, true)
if not rsp then
log:info('get Disk%s smart log identifiers failed', obj.nvme.Slot)
return -- ⚠️ 直接退出,未设置 obj.smart_log
end
obj.smart_log = { ... } -- 只有在rsp存在时才赋值
end
如果 unpack(smart_log) 失败(例如smart_log为nil),则整个函数直接return,导致obj.smart_log未初始化。
后果
c_handler_nvme调用update_smart_info时无法读取有效字段。
- Redfish接口最终返回
null。
2. SMART信息传递链中断可能原因
| 阶段 |
可能问题 |
证据支持 |
| MCTP/SMBUS建链失败 |
NVMe-MI通信链路未建立 |
文档DC2提及“mctp over smbus建链失败” |
GetSmartInfo调用失败 |
缺少Vendor参数或响应异常 |
KG关系:GetSmartInfo需传入Vendor参数 |
| SMART日志未更新 |
update_smart_log失败导致obj.smart_log=nil |
日志中打印update_nvme_smart_log_info但后续未见成功日志 |
| Redfish映射失败 |
/Metrics未正确绑定bmc.kepler.Systems.Storage.Drive.NVMe.SMART |
返回仅PowerOnHours有效,其余为null |
根本原因综合判断
根本原因:BMC在通过NVMe-MI协议获取并处理SMART信息的过程中,因底层通信失败或解析流程异常,导致obj.smart_log对象未成功构建,从而使上游Redfish接口获取不到有效数据。
具体可能包括:
MCTP over SMBus建链失败(见文档ID2:mctp over smbus建链失败,提前退出)
smart_log数据包解析为空,进入if not rsp then return分支
obj对象未正确初始化(如SerialNumber为""或BDF=N/A),导致匹配不到NVMe设备对象
磁盘无SMART信息 → 排除(OS内可读)
解决方案建议
步骤一:排查通信链路状态
-
检查MCTP通道状态
# 查询MCTP链路是否存在
ipmitool raw 0x0a 0x7f
查看是否返回cc(no error)。
-
确认SMBus连接是否正常
- 检查I²C总线状态(
i2cdetect -l)
- 验证BMC能否探测到NVMe背板控制器(如PCA9545)
步骤二:增强日志追踪与调试
在关键位置添加日志输出:
-- 在 nvme_admin_command.update_smart_log 中
if not smart_log then
log:error("smart_log is nil for Disk%s", obj.nvme.Slot)
return
end
local rsp = NVME_MI_OPTIONS.smart_log_response:unpack(smart_log, true)
if not rsp then
log:error("Failed to unpack SMART log for Disk%s, raw: %s", obj.nvme.Slot, tostring(smart_log))
return
end
同时:
- 在
c_handler_nvme调用前打印obj结构,确保SerialNumber、RootBDF非空。
- 添加日志:
log:notice("Updating SMART info for %s", obj.SerialNumber)。
步骤三:强制触发SMART信息更新测试
通过资源树直接调用GetSmartInfo方法:
# 路径示例
/bmc/kepler/Systems/1/Storage/Drives/11/NVMe/GetSmartInfo
参数:
{
"Vendor": 0
}
观察返回的MessageResponse是否为有效二进制数据。
若返回为空或错误码,说明BMC与NVMe盘之间NVMe-MI通信异常。
步骤四:验证地址信息正确性(BDF/PortId)
在文档DC4中显示:
bmc.kepler.Systems.Storage.Drive.AddrInfo
RootBDF = "N/A"
PortId = 0
RootBDF=N/A 表示PCIe路径未知 —— 这会导致无法定位NVMe设备进行通信!
解决方向:
- 检查固件是否正确上报NVMe设备的BDF地址。
- 确保RAID卡或背板控制器支持带外NVMe-MI管理。
- 验证
vpd_nvme_mi_get_product_info()是否能正确读取SerialNumber。
步骤五:启用日志收集辅助诊断
使用标准命令收集NVMe SMART日志文件:
# 触发SMART日志转储
/bmc/kepler/Systems/1/Storage/Drives/11/NVMe/DumpSmartInfo
# 参数 Path: /data/var/log/storage/drivelog/Disk11/nvme_smart.log
参考决策点9,该日志应在CriticalWarning异常时自动记录。
建议修复措施
| 措施 |
说明 |
修复update_smart_log错误处理逻辑 |
即使解析失败,也应设置默认值(如percent_used=0),避免null穿透到Redfish接口 |
确保GetSmartInfo定期重试机制 |
在MCTP链路恢复后能主动重建连接 |
增加SMART获取失败告警日志 |
记录“SMART数据获取失败”事件,便于运维感知 |
完善对象初始化验证 |
在c_handler_nvme中检查SerialNumber和BDF有效性 |
总结
| 项目 |
结论 |
| 是否磁盘问题? |
否,OS内可正常读取SMART |
| 是否Redfish配置错误? |
否,PowerOnHours已映射成功 |
| 是否BMC处理逻辑缺陷? |
是,update_smart_log失败导致数据未更新 |
| 主要怀疑点 |
MCTP建链失败 + smart_log解析失败 → obj.smart_log=nil |
| 推荐操作 |
增加日志 → 验证MCTP/BDF → 手动调用GetSmartInfo测试 |
最终结论:BMC端SMART信息获取流程因底层通信或对象解析失败而中断,导致Redfish接口返回null。建议优先检查MCTP建链状态与obj对象完整性。