NVME配置问题:NVMe list is empty.

版本:2509

当前配置NVME,按照SEU→14140224_VPD_0.sr→14140224_PROTOCOL_0.sr流程加载,SEU参考的Huawei/TianChi/SEU/14100665_00000001030302044496.sr

配置好后,丝印正常

Handle 0x0016, DMI type 9, 24 bytes
System Slot Information
Designation: DISK46
Type: x2 PCI Express x2
Current Usage: In Use
Length: Other
ID: 46
Characteristics: None
Bus Address: 0000:05:00.0

Handle 0x0017, DMI type 9, 24 bytes
System Slot Information
Designation: DISK45
Type: x2 PCI Express x2
Current Usage: In Use
Length: Other
ID: 45
Characteristics: None
Bus Address: 0000:06:00.0

bmc下可以看到nvme的SerialNumber 等信息,当前nvme支持nvme-mi协议

NAME TYPE SIGNATURE RESULT/VALUE FLAGS
bmc.kepler.sms interface - - -
._40odata_2Econtext property v s "/redfish/v1/$metadata#Systems/Member… -
._40odata_2Eid property v s "/bmc/kepler/Systems/1/Sms/1/Computer… -
._40odata_2Etype property v s “#Storage.v1_0_0.OemPCIE_SSD” -
bmc.kepler.sms.redfish interface - - -
.CapableSpeedGbs property v s “null” -
.CapacityBytes property v x 240057409536 -
.Description property v s “null” -
.DeviceID property v s “0x5024” -
.DeviceLocation property v s “null” -
.DeviceName property v s “null” -
.DeviceSilkScreen property v s “null” -
.FirmwareVersion property v s “EIEK51.3” -
.Id property v s “0000:00:13.0_0000:06:00.0” -
.Manufacturer property v s “null” -
.MediaType property v s “null” -
.Model property v s “KINGSTON SEDC2000BYM8240G” -
.Name property v s “nvme1” -
.NegotiatedSpeedGbs property v s “null” -
.Protocol property v s “null” -
.SerialNumber property v s “50026B728395F71E” -
.Status property v s “healthy” -
.SubsystemDeviceID property v s “0x5024” -
.SubsystemVendorID property v s “0x2646” -
.VendorID property v s “0x2646” -
._40odata_2Econtext property v s "/redfish/v1/$metadata#Systems/Member… -
._40odata_2Eid property v s "/bmc/kepler/Systems/1/Sms/1/Computer… -
._40odata_2Etype property v s “#Storage.v1_0_0.OemPCIE_SSD” -
bmc.kepler.sms.redfish.BDFNumber interface - - -
.BDF property v s “0000:06:00.0” -
.RootBDF property v s “0000:00:13.0” -

查询disk45:mdbctl lsprop Drive_1_010102

bmc.kepler.Inventory.Hardware
AssetName=“Disk45”
AssetTag=“N/A”
AssetType=“Disk”
FirmwareVersion=“N/A”
ManufactureDate=“N/A”
Manufacturer=“N/A”
Model=“N/A”
PCBVersion=“N/A”
PartNumber=“N/A”
SerialNumber=“”
Slot=“45”
UUID=“”
bmc.kepler.Object.Properties
ClassName=“Drive”
ObjectIdentifier=[1,“1”,“1”,“010102”]
ObjectName=“Drive_1_010102”
TraceSamplingRate=0
bmc.kepler.Systems.Storage.Drive
BlockSizeBytes=65535
BootPriority=255
CapableSpeedGbs=255
CapacityMiB=4294967295
ContainerPhysicalContext=“Front”
DeviceName=“N/A”
EnclosureId=65535
FaultLed=0
FirmwareStatus=255
HotspareType=255
Id=45
LocateLed=0
Location=“HDD Plane”
LocationIndicatorState=0
Manufacturer=“N/A”
ManufacturerId=0
MediaErrorCount=4294967295
MediaType=255
Model=“N/A”
Name=“Disk45”
NegotiatedSpeedGbs=255
NodeId=“HDDPlaneDisk45”
OtherErrorCount=4294967295
PCIeLinkSpeed=0
PatrolState=0
PowerOnHours=4294967295
PowerState=255
PredictedFailCount=4294967295
PredictedMediaLifeLeftPercent=100
Presence=1
Protocol=5
RebuildProgress=255
RebuildState=0
RefControllerId=255
RefDiskArrayId=65535
RefVolumeList=
ResourceId=0
Revision=“N/A”
RotationSpeedRPM=65535
SASAddress1=“N/A”
SASAddress2=“N/A”
SerialNumber=“”
SlotNumber=255
TemperatureCelsius=0
bmc.kepler.Systems.Storage.Drive.AddrInfo
PortId=0
RootBDF=“N/A”
SlotId=0
SocketId=0
Type=“N/A”
bmc.kepler.Systems.Storage.Drive.DriveStatus
CapacityError=false
Failure=false
FirmwareStatusError=false
Health=0
InAFailedArray=0
Missing=0
PredictiveFailure=0
bmc.kepler.Systems.Storage.Drive.DriveSubHealth
EstimatedRemainingLifespan=4294967295
EstimatedRemainingLifespanInsufficient=0
IODeteriorationHealthCode=0
SLCSpareBlockPercentage=255
TLCSpareBlockPercentage=255
bmc.kepler.Systems.Storage.Drive.NVMe
LifeUsedPercentage=255
bmc.kepler.Systems.Storage.Drive.NVMe.SMART
AvailableSpare=255
CriticalWarning=255
Status=255
UsedPercentage=255
bmc.kepler.Systems.Storage.Drive.SAS.SMART
BlocksReceivedFromInitiator=4294967295
BlocksSentToInitiator=4294967295
ElementsInGrownDefectList=4294967295
ElementsInPrimaryDefectList=4294967295
LastPrefailEventSeqNum=4294967295
ManufacturedInWeekOfYear=“N/A”
StripTemperatureCelsius=4294967295
UntilNextInterSMARTTestMinutes=4294967295
Private
ActivationLed=0
CommandTimeoutTimes=0
FaultReg=0
HddBackplaneStartSlot=44
LinkFault=false
LocateReg=0
PassThrough=255
PhysicalLocation=“HDD Plane”
RelativeSlot=1
SetFaultLed=0
SetLocateLed=0

其中bmc.kepler.Systems.Storage.Drive.AddrInfo中portid/bdf全是N/A

web端没有详细数据,iBMA运行正常

app.log一直报错:NVMe list is empty

Q:NVME的信息传递流程是什么,当前情况应该从什么方向排查

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

六、结论

您目前的核心问题是:

虽然NVMe盘支持NVMe-MI协议,BMC也能获取其信息,但由于缺乏有效的匹配机制(SN为空或未传递),导致iBMA上报的数据无法正确关联到Drive对象,最终造成Web界面信息缺失与日志警告NVMe list is empty

:white_check_mark: 建议行动步骤:

  1. 确认NVMe对象是否存在并含SN
  2. 检查ComVPDConnect与BusinessConnector是否完整配置
  3. 配置PcieAddrInfo_NVMe_X以支持BDF定位
  4. 考虑启用BDF匹配逻辑替代SN匹配
  5. 评估是否需引入ReplicaDrive提升SN一致性

完成后重启storage服务并观察日志,即可解决该问题。

点击此处查看详细分析解答

NVMe信息传递流程与配置问题排查分析

您遇到的“NVMe list is empty”问题是openUBMC系统中常见的NVMe管理相关问题,涉及NVMe对象加载、信息传递、驱动匹配等多个环节。以下根据知识库内容对NVMe信息传递流程进行详细说明,并针对当前现象提供系统性排查方向


一、NVMe信息传递与加载流程

NVMe设备的信息获取与展示依赖于整套固件架构协同工作,其核心流程如下:

1. 硬件识别与SR配置加载

BMC启动 → 加载SEU背板Connector → 触发Connector_ComVPDConnect
                              ↓
                 根据BOM:14140224, Id:VPD, AuxId:0
                              ↓
              加载14140224_VPD_0.sr → 加载14140224_PROTOCOL_0.sr
                              ↓
                   创建NVMe对象(如Nvme_1)

:white_check_mark: 您已正确配置SEU参考文件,并成功加载VPD和PROTOCOL文件,初步建链应已完成。


2. NVMe对象属性获取

NVMe对象通过以下方式获取其产品信息:

  • 来源1:使用VPDChip读取Vital Product Data (VPD)
    • 方法:调用 self:vpd_nvme_mi_get_product_info()
    • 获取关键字段:SerialNumber, Model, Manufacturer
  • 来源2:通过NVM Express Management Interface (NVMe-MI) 协议
    • 要求:NVMe盘支持NVMe-MI协议,且固件实现符合规范
    • 工具:GetNvmeInfo API 或 D-Bus 方法 GetNvmeDriveData

:white_check_mark: 您已确认当前NVMe支持NVMe-MI协议,且BMC下可查到SN等信息,说明协议通信基本正常。


3. 信息同步至Drive对象(关键!)

在openUBMC架构中,最终在Web界面展示的是 Drive 对象(如 Drive_1_010102),而非原始的NVMe对象。

信息同步逻辑为:

-- 匹配逻辑(常见于handler_nvme.lua)
function c_handler_nvme:find_object(_, data)
    if not data.SerialNumber then
        return nil  -- 没有SN → 匹配失败
    end

    local SN = data.SerialNumber
    local object = c_nvme.collection:find(function(obj)
        return obj.SerialNumber == SN  -- 依赖SN匹配
    end)
    if object then return object end
    return nil
end

:cross_mark: 根本问题点:如果 Drive 对象未正确更新SN或NVMe未传SN,就无法匹配,导致信息无法更新。


4. iBMA上传 → BMC更新Drive

iBMA(Intelligent Bare Metal Agent)在OS侧运行,上报NVMe盘详细信息:

  1. 通过Redfish/IPMI将NVMe信息(含BDF、SN、温度、容量等)上传
  2. BMC通过 SerialNumberBDF 匹配已有Drive对象
  3. 更新 bmc.kepler.Systems.Storage.Drive.* 中的字段供前端展示

:white_check_mark: iBMA运行正常,但Web界面信息缺失 → 说明信息未成功绑定到Drive对象


二、当前问题现象分析

现象 分析
:white_check_mark: OS中DMI有正确槽位信息 BIOS识别正常,DMI Type 9正常加载
:white_check_mark: Busctl可查SerialNumber NVMe盘能被host_agent识别,支持NVMe-MI
:cross_mark: bmc.kepler.Systems.Storage.Drive.AddrInfo为空(PortId/BDF=N/A) AddrInfo未初始化,Drive对象无法定位硬件
:cross_mark: Web端信息缺失(接口、模型、固件等为N/A) Drive对像未接收到更新数据
:cross_mark: app.log 报错 NVMe list is empty Storage组件无法获取任何NVMe设备列表
:cross_mark: SerialNumber="" 在mdbctl lsprop中 Drive未获取或未更新SN

三、重点排查方向建议

:magnifying_glass_tilted_left: 1. 检查NVMe对象是否被正确创建

运行命令检查是否存在NVMe对象:

# 列出所有Drive
mdbctl lsobj Drive

# 查找是否有NVMe类对象
mdbctl lsobj | grep -i nvme

查看NVMe对象内容(如Nvme_1):

mdbctl lsprop Nvme_1

应包含:

  • SerialNumber
  • Model
  • Manufacturer
  • TemperatureCelsius
  • Slot

若无此类对象 → 检查 14140224_PROTOCOL_X.sr 是否正确加载


:magnifying_glass_tilted_left: 2. 验证VPDChip是否配置且可读

检查CSR中 VPDChip 配置:

{
  "Nvme_1": {
    "VPDChip": "/bmc/dev/Chip/VPDChip_01010C0103",  // 必须存在
    ...
  }
}

手动测试读取SN:

-- 进入Lua调试模式或添加日志
local raw_sn = self:vpd_nvme_mi_get_product_info(common_def.RECORD_ITEM_SERIAL_NUMBER)
print("Raw SN:", raw_sn)

-- 必须满足:
-- 1. 返回字符串类型
-- 2. UTF-8有效:utils_core.utf8_validate(raw_sn)
-- 3. 无不可见字符:not nvme_utils.has_invisible_chars(raw_sn)

如果返回空或无效 → 表明VPD读取失败(常见于非标准盘或CPLD映射异常)


:magnifying_glass_tilted_left: 3. 确认BusinessConnector与ComVPDConnect配置完整

参考规范文档,NVMe支持必须包含:

  • BusinessConnector
  • Connector_ComVPDConnect,且其属性为:
"Bom": "14140224",
"Id": "VPD",
"AuxId": "0"

示例SR配置:

"Connector_ComVPDConnect_0": {
  "Bom": "14140224",
  "Id": "VPD",
  "AuxId": "0",
  "RefConnector": "/bmc/dev/Connector/SEU_Connector"
}

:warning: 缺少这些对象会导致协议无法解析,NVMe不会被加载


:magnifying_glass_tilted_left: 4. 检查PcieAddrInfo是否配置(BDF匹配关键)

若您希望启用BDF匹配机制(尤其适合消费级M.2 NVMe无SN时):

"PcieAddrInfo_NVMe_1": {
  "Segment": 0,
  "SocketId": 3,
  "PortId": 0,
  "SlotId": 45,
  "Type": 2  // 2 = NVMe
}

:white_check_mark: 您有BDF信息(0000:06:00.0),建议配置此对象,让iBMA可通过BDF定位Drive对象。


:magnifying_glass_tilted_left: 5. 查看storage日志确认NVMe list is empty来源

执行:

grep "NVMe list is empty" app.log

定位文件 drive_collection.lua(68)

  • 此处调用了 GetNvmeDriveCount()GetNvmeInfo()
  • 返回空列表 → 可能原因:
    • NVMe设备未连接
    • PCIe链路未激活(Port0PCIeLinkActive=0)
    • NVMe-MI通信失败(如Chip BlockIO错误)

添加调试日志验证:

# 手动调用获取信息
busctl call bmc.kepler.Storage /bmc/kepler/Systems/1 Storage GetNvmeInfo

:magnifying_glass_tilted_left: 6. 排查Drive与NVMe对象的关联逻辑

检查是否配置了 ReplicaDrive 对象以解决SN上报问题:

:link: 参考《【已评审】新增资源协作接口对象ReplicaDrive》文档
若未配置ReplicaDrive对象,则Component无法同步SN,导致告警与监控中SN为空。

路径应为:

/bmc/kepler/Systems/1/Storage/ReplicaDrives/1

接口:

bmc.kepler.Systems.Storage.ReplicaDrive

并在CSR中通过同步语法绑定:

"SerialNumber": "<=/ReplicaDrive/SerialNumber"

四、解决方案建议总结

排查项 是否满足 解决方案
NVMe对象是否存在 :red_question_mark: mdbctl lsobj | grep Nvme
VPDChip能读SN吗 :red_question_mark: 调试 vpd_nvme_mi_get_product_info
BusinessConnector和ComVPDConnect存在? :red_question_mark: 添加完整配置
PcieAddrInfo_NVMe_X是否配置 :cross_mark:(推测) 添加BDF映射
Drive对象中SerialNumber为空 :white_check_mark: 主因:未完成SN匹配
使用BDF匹配替代SN? 修改handler_nvme.lua支持BDF优先匹配
是否需要ReplicaDrive :red_question_mark: 增加资源协作对象以传递SN

五、临时修复建议

目标:让Drive对象能更新信息,即使不依赖SN

:white_check_mark: 方法一:强制通过BDF匹配

修改 /usr/share/lua/bma/handles/handler_nvme.lua

function c_handler_nvme:find_object(_, data)
    -- 新增:尝试通过BDF匹配
    if data.BDF then
        local object = c_nvme.collection:find(function(obj)
            local bdfInfo = obj:get_PcieAddrInfo()
            return bdfInfo and bdfInfo.BDF == data.BDF
        end)
        if object then return object end
    end

    -- 原有SN匹配逻辑
    if not data.SerialNumber then return nil end
    ...
end

参考帖子中用户建议:“可以通过BDF来匹配NVMe对象”


六、结论

您目前的核心问题是:

虽然NVMe盘支持NVMe-MI协议,BMC也能获取其信息,但由于缺乏有效的匹配机制(SN为空或未传递),导致iBMA上报的数据无法正确关联到Drive对象,最终造成Web界面信息缺失与日志警告NVMe list is empty

:white_check_mark: 建议行动步骤:

  1. 确认NVMe对象是否存在并含SN
  2. 检查ComVPDConnect与BusinessConnector是否完整配置
  3. 配置PcieAddrInfo_NVMe_X以支持BDF定位
  4. 考虑启用BDF匹配逻辑替代SN匹配
  5. 评估是否需引入ReplicaDrive提升SN一致性

完成后重启storage服务并观察日志,即可解决该问题。