在FruData中添加的属性为什么看不到?

问题描述

如题,在sr文件中添加了一个FruData对象,但是通过busctl和ipmitool都看不到里面的属性

环境信息

  • 操作系统:[如 Ubuntu 24.04]

  • 软件版本:[如 OpenUBMC2506]

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

:white_check_mark: 结论

:red_exclamation_mark: 您在 FruData 中添加的属性不可见,是因为 属性没有写入正确的 D-Bus 接口路径下,导致 frudata 组件无法识别和暴露这些数据。

:white_check_mark: 解决方案总结:

  • :white_check_mark: 将属性分别写入:
    • bmc.kepler.Systems.FruData.Board
    • bmc.kepler.Systems.FruData.Product
    • bmc.kepler.Systems.FruData.System
    • bmc.kepler.Systems.FruData.Overview
  • :white_check_mark: 确保属性名拼写正确(如 MfgDate,非 MfdDate
  • :white_check_mark: 使用 busctlmdbctl 验证资源树是否更新
  • :white_check_mark: 使用 ipmitool fru print <id> 查看最终输出

完成以上步骤后,属性即可正常显示。

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

在 FruData 中添加的属性为什么看不到?

FruData 中添加了属性但无法通过 busctlipmitool 查看,其根本原因在于 属性必须通过 D-Bus 接口进行正确映射并分配到对应的接口类中,否则无法被外部工具识别和访问

根据您提供的信息(包括 sr 配置文件、busctl introspect 输出和 ipmitool fru print 结果),以下为详细分析与解决方案。


:magnifying_glass_tilted_left: 问题现象分析

1. sr 文件中已配置属性

您已在 sr 文件中定义了一个 FruData_Fru1 对象,并为其设置了多个属性,例如:

{
  "FruData_Fru1": {
    "BoardManufacturer": "hjkl",
    "ProductSerialNumber": "1234qwer",
    "SystemSerialNumber": "5678asdf",
    "SystemProductName": "zxcv"
  }
}

2. busctl introspect 显示接口属性为空

使用命令:

busctl --user introspect bmc.kepler.frudata /bmc/kepler/Systems/1/FruDatas/FruData_Fru1_0101

输出显示:

bmc.kepler.Systems.FruData.Board
  .BoardManufacturer                 "Huawei"
  .BoardPartNumber                   ""
  ...

但您设置的值(如 BoardManufacturer = hjkl)未生效,且 ProductSerialNumberSystemSerialNumber 等字段为空。

3. ipmitool fru print 显示数据缺失或无效

输出中:

  • Board Mfg 显示为 "Huawei"(默认值)
  • 没有显示 Product NameSerial Number 等关键字段

:pushpin: 根本原因

:white_check_mark: Rule:属性必须绑定到具体 D-Bus 接口才能被访问

在 OpenUBMC 架构中,即使你在 sr 文件中直接写入属性,这些属性不会自动映射到 D-Bus 接口属性上sr 文件中的结构需遵循 CSR(Component Self-description Register)模型规范,并通过 硬件自发现机制 解析后,由 frudata 组件解析 EEPROM 数据并更新资源树。

您的问题根源在于:

:cross_mark: 您直接在 FruData_Fru1 下写了属性,但没有将这些属性正确映射到 bmc.kepler.Systems.FruData.Board.Product.System 等标准接口中。

这些接口有固定的结构定义,只有写入对应接口路径下的属性才会生效并对外暴露


:hammer_and_wrench: 正确做法:按接口层级配置属性

应将属性分配到对应的标准 D-Bus 接口对象下,而不是平铺在 FruData_Fru1 根节点。

:white_check_mark: 正确的 sr 配置方式(示例):

{
  "FruData_Fru1": {
    "FruId": 1,
    "FruDev": "#/Eeprom_BMC",
    "EepromWp": 0,
    "StorageType": "Others",
    
    // ✅ 正确:将属性归入各自接口域
    "bmc.kepler.Systems.FruData.Board": {
      "BoardManufacturer": "hjkl",
      "BoardPartNumber": "N/A",
      "BoardSerialNumber": "N/A",
      "BoardProductName": "",
      "MfgDate": "2023/11/29 Wed 11:43:00"
    },
    
    "bmc.kepler.Systems.FruData.Product": {
      "ManufacturerName": "hjkl",
      "ProductSerialNumber": "1234qwer",
      "ProductPartNumber": "PART-001",
      "ProductName": "MyProduct"
    },
    
    "bmc.kepler.Systems.FruData.System": {
      "SystemManufacturer": "hjkl",
      "SystemProductName": "zxcv",
      "SystemSerialNumber": "5678asdf",
      "SystemVersion": "1.0"
    },
    
    "bmc.kepler.Systems.FruData.Overview": {
      "FruId": 1,
      "FruName": "Fru1",
      "FruType": "0"
    }
  }
}

:puzzle_piece: 原理说明:FruData 的接口结构

frudata 服务通过 D-Bus 暴露以下主要接口,每个接口管理特定类型的信息:

接口名称 用途 关键属性
bmc.kepler.Systems.FruData.Board 板级信息 BoardManufacturer, BoardSerialNumber, MfgDate
bmc.kepler.Systems.FruData.Product 产品信息 ProductSerialNumber, ProductName, ManufacturerName
bmc.kepler.Systems.FruData.System 系统信息 SystemSerialNumber, SystemProductName
bmc.kepler.Systems.FruData.Overview FRU 概览 FruId, FruName, FruType

:warning: 如果不将属性放在上述接口路径下,它们不会被 frudata 解析,也无法被 ipmitool 或 Redfish API 访问。


:magnifying_glass_tilted_right: 验证方法

1. 使用 busctl 查看完整对象属性

busctl --user introspect bmc.kepler.frudata /bmc/kepler/Systems/1/FruDatas/FruData_Fru1_0101

确保各接口下的属性已正确填充。

2. 检查资源树是否加载

busctl --user tree bmc.kepler.frudata

查看 /bmc/kepler/Systems/1/FruDatas/FruData_Fru1_... 是否存在。

3. 使用 mdbctl 查看实际资源树属性

mdbctl lsprop FruData_Fru1_0101

可查看运行时的实际属性值。

4. 使用 ipmitool 查看 FRU 内容

ipmitool -H <IP> -I lanplus -U Administrator -P password fru print 1

此时应能正确显示 Product NameSerial Number 等字段。


:prohibited: 常见错误排查清单

问题 原因 解决方案
属性写在 FruData_FruX 根下 未归属于标准接口 将属性移至 bmc.kepler.Systems.FruData.Board 等接口下
使用默认值(如 "Huawei" 属性未覆盖或未生效 确认接口路径正确,重启 frudata 服务
ipmitool fru print 显示 Device not present FRU ID 不匹配或未激活 检查 FruId 是否被正确识别,确认 EEPROM 存在
属性名拼写错误(如 MfdDate 应为 MfgDate 检查属性名是否符合标准定义
服务未加载 FruData 对象 CSR 未正确分发 使用 busctl tree bmc.kepler.frudata 验证对象是否存在

:white_check_mark: 推荐调试流程

  1. 修改 sr 文件,确保属性按接口分类;
  2. 升级整包或 debug 包;
  3. 重启 BMC 或执行:
    systemctl restart bmc.kepler.frudata
    
  4. 检查对象是否存在:
    busctl --user tree bmc.kepler.frudata
    
  5. 查看具体属性:
    busctl --user introspect bmc.kepler.frudata /bmc/kepler/Systems/1/FruDatas/FruData_Fru1_0101
    
  6. 使用 ipmitool fru print 1 验证输出。

:white_check_mark: 结论

:red_exclamation_mark: 您在 FruData 中添加的属性不可见,是因为 属性没有写入正确的 D-Bus 接口路径下,导致 frudata 组件无法识别和暴露这些数据。

:white_check_mark: 解决方案总结:

  • :white_check_mark: 将属性分别写入:
    • bmc.kepler.Systems.FruData.Board
    • bmc.kepler.Systems.FruData.Product
    • bmc.kepler.Systems.FruData.System
    • bmc.kepler.Systems.FruData.Overview
  • :white_check_mark: 确保属性名拼写正确(如 MfgDate,非 MfdDate
  • :white_check_mark: 使用 busctlmdbctl 验证资源树是否更新
  • :white_check_mark: 使用 ipmitool fru print <id> 查看最终输出

完成以上步骤后,属性即可正常显示。

这是值不是csr配置的,是从eeprom读的