无法读取nvme固态盘的固件信息问题分析
更新时间: 2026/05/28
在Gitcode上查看源码问题背景
- 单板类型:NA
- 软件版本:NA
- 涉及功能:NVME固件信息。
- 触发条件:Samsung PM9D3a nvme 硬盘的固件偏移量未适配。
- 业务表现:预期在BMC侧可正常获取nvme固件信息;实际在BMC侧nvme-mi+相同偏移量获取不到固件版本号。
问题复现步骤
- 在带内用相同偏移量可以获取到PM9D3a nvme 硬盘固件版本号。
- 在BMC侧nvme-mi+相同偏移量获取到为空。
关键日志信息
使用mdbctl lsobj Drive和mdbctl lsobj Chip查找所有硬盘对象和Chip对象。然后通过mdbctl lsprop <对象名>的Name属性找到对应的disk几,再根据最后的路径匹配对应的Chip_Virtual_SSD对象。
mdbctl lsprop <对象名>的Name属性找到对应的disk几,再根据最后的路径匹配对应的Chip_Virtual_SSD对象。
确定OS命令和BMC侧两边读取的数据不符。
定位过程
- 通过打印storage组件版本获取流程可知,此ssd固件偏移量未适配。
- 通过此固件手册可知固件偏移量为64。
- 添加此固态对应偏移量后依旧无法读取。
- 打印读出信息为空。
- 读取偏移量相同的情况下对比os下读取的数据不相同。
- 使用mdbctl lsobj Drive和mdbctl lsobj Chip查找所有硬盘对象和Chip对象。然后通过mdbctl lsprop <对象名>的Name属性找到对应的disk几,再根据最后的路径匹配对应的Chip_Virtual_SSD对象。确定OS命令和BMC侧两边读取的数据不符。
- 带内带外数据读取不一致需要咨询对应硬盘厂商:
- 确定带内os下的命令实现逻辑,是否为获取的VPD中的数据
- 带外管理中读取VPD的芯片的地址是否与标准协议一致
- 咨询三星硬盘厂商,Samsung PM9D3a nvme 硬盘不支持vpd 获取 firmware version,vpd 结构里没有固件版本信息,只支持Admin command (PCIe通道) 读固件版本信息。
问题原因
咨询三星硬盘厂商,Samsung PM9D3a nvme 硬盘不支持vpd 获取 firmware version,vpd 结构里没有固件版本信息,只支持Admin command (PCIe通道) 读固件版本信息。该盘支持nvme-mi协议,最新版本已支持带外通过mctp over pcie获取硬盘信息,可参考开源组件storage仓。并且identity command已实现部分,具体协议部分可参考src/lualib/nvme/nvme_mi_protocol文件夹下代码实现。
解决方案
通过identify命令获取版本成功: