无法读取nvme固态盘的固件信息问题分析
更新时间: 2026/05/28
在Gitcode上查看源码

问题背景

  • 单板类型:NA
  • 软件版本:NA
  • 涉及功能:NVME固件信息。
  • 触发条件:Samsung PM9D3a nvme 硬盘的固件偏移量未适配。
  • 业务表现:预期在BMC侧可正常获取nvme固件信息;实际在BMC侧nvme-mi+相同偏移量获取不到固件版本号。

问题复现步骤

  1. 在带内用相同偏移量可以获取到PM9D3a nvme 硬盘固件版本号。
  2. 在BMC侧nvme-mi+相同偏移量获取到为空。

关键日志信息

使用mdbctl lsobj Drivemdbctl lsobj Chip查找所有硬盘对象和Chip对象。然后通过mdbctl lsprop <对象名>的Name属性找到对应的disk几,再根据最后的路径匹配对应的Chip_Virtual_SSD对象。

mdbctl lsprop <对象名>的Name属性找到对应的disk几,再根据最后的路径匹配对应的Chip_Virtual_SSD对象。

确定OS命令和BMC侧两边读取的数据不符。

定位过程

  1. 通过打印storage组件版本获取流程可知,此ssd固件偏移量未适配。

  1. 通过此固件手册可知固件偏移量为64。

  1. 添加此固态对应偏移量后依旧无法读取。

  1. 打印读出信息为空。

  1. 读取偏移量相同的情况下对比os下读取的数据不相同。

  1. 使用mdbctl lsobj Drive和mdbctl lsobj Chip查找所有硬盘对象和Chip对象。然后通过mdbctl lsprop <对象名>的Name属性找到对应的disk几,再根据最后的路径匹配对应的Chip_Virtual_SSD对象。确定OS命令和BMC侧两边读取的数据不符。
  2. 带内带外数据读取不一致需要咨询对应硬盘厂商:
    • 确定带内os下的命令实现逻辑,是否为获取的VPD中的数据
    • 带外管理中读取VPD的芯片的地址是否与标准协议一致
  3. 咨询三星硬盘厂商,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命令获取版本成功: