frudata
更新时间: 2026/04/16
在Gitcode上查看源码

功能简介

支持标准和非标准的电子标签管理,标准电子标签直接由frudata组件将存储在eeprom和file里面的数据按域和字段解析出来,非标准电子标签由多样化硬件APP负责数据读写和解析,将数据发送给frudata,并且由frudata组件统一对外提供电子标签的读写接口。

关键特性

1 frudata资源协作接口设计

Fru类描述的是现场可替换单元(fru)的相关信息,例如主板, Raid卡, Riser卡, 硬盘背板等,一个fru只有一个Fru对象; Frudata类描述的是Fru里面的eeprom存储的信息,一个fru最多有一个Frudata对象; Frus主要在fru对象分发过来后,给sensor发送fruid信号来管理sdr数据; Component类表示部件管理信息,如内存、硬盘、风扇等,一个fru里可以有多个部件,配置告警也会配一个Component对象,供event管理; Components供WEB页面查询系统事件,根据部件类型进行筛选,需要从资源协作接口获取当前存在的所有对象的部件类型。

2 frudata业务流程

电子标签通过CSR配置,通过硬件自发现解析成对象分发到frudata进行处理

frudata根据CSR配置解析eeprom数据并更新资源树

通过ipmi命令写电子标签时则向eeprom中写入

3 frudata业务代码分层设计

四层模型

APP层:只负责自发现对象注册和RPC、IPMI接口注册,业务进行下沉,单一职责; 对象服务层:承载对象的统一创建、代理,分离变化; 对象层:实现对象的差异化接口,高内聚,开闭原则; 数据层:使用统一的数据结构,存储不同格式的电子标签,向稳定方向依赖。

使用代理模式来屏蔽app层的调用接口差异

4 Area和field字段定义

Areafield
FRU_AREA_CHASSISINFO = 1 FRU_CHASSIS_TYPE = 0
FRU_CHASSIS_PART_NUMBER = 1
FRU_CHASSIS_SERIAL_NUMBER = 2
FRU_CHASSIS_EXTRA = 3
FRU_AREA_BOARDINFO = 2 FRU_BOARD_MFGDATE = 0
FRU_BOARD_MANUFACTURER = 1
FRU_BOARD_PRODUCTNAME = 2
FRU_BOARD_SERIALNUMBER = 3
FRU_BOARD_PARTNUMBER = 4
FRU_BOARD_FRUFILEID = 5
FRU_BOARD_EXTRA = 6
FRU_AREA_PRODUCT = 3 FRU_PRODUCT_MANUFACTURER = 0
FRU_PRODUCT_NAME = 1
FRU_PRODUCT_PARTNUMBER = 2
FRU_PRODUCT_VERSION = 3
FRU_PRODUCT_SERIALNUMBER = 4
FRU_PRODUCT_ASSETTAG = 5
FRU_PRODUCT_FRUFILEID = 6
FRU_PRODUCT_EXTRA = 7
FRU_AREA_SYS = 6 FRU_SYSTEM_MANUFACTURE = 0
FRU_SYSTEM_PRODUCTNAME = 1
FRU_SYSTEM_VERSION = 2
FRU_SYSTEM_SERIALNUMBER = 3

5 电子标签对外呈现形式

shell
> busctl --user introspect bmc.kepler.frudata /bmc/kepler/Systems/1/FruDatas/FruData_Fru0_010104

NAME                                TYPE      SIGNATURE   RESULT/VALUE                             FLAGS
bmc.kepler.FrudataService.Frudata   interface -           -                                        -
.SetProductAssetTag                 method    a{ss}ys     -                                        -
.SetSysProductName                  method    a{ss}ys     -                                        -
.Update                             method    a{ss}asas   -                                        -
bmc.kepler.Object.Properties        interface -           -                                        -
.GetAllWithContext                  method    a{ss}s      a{sv}                                    -
.GetOptions                         method    a{ss}ss     a{ss}                                    -
.GetPropertiesByNames               method    a{ss}sas    a{sv}a{sv}                               -
.GetPropertiesByOptions             method    a{ss}sa{ss} as                                       -
.GetWithContext                     method    a{ss}ss     v                                        -
.SetWithContext                     method    a{ss}ssv    -                                        -
.ClassName                          property  s           "FruData"                                emits-change
.ObjectIdentifier                   property  (ysss)      1 "1" "1" "010104"                       emits-change
.ObjectName                         property  s           "FruData_Fru0_010104"                    emits-change
bmc.kepler.Systems.FruData.Board    interface -           -                                        -
.BoardCustomInfo                    property  s           "5=96;1=44;2=1;3=1;4=4;6=96;7=96;8=9;9=… -
.BoardFRUFileID                     property  s           "5.07.00.01"                             -
.BoardManufacturer                  property  s           "openUBMC"                                 emits-change
.BoardPartNumber                    property  s           "0"                                      emits-change
.BoardProductName                   property  s           "1"                                      emits-change
.BoardSerialNumber                  property  s           "Bar"                                    emits-change
.MfgDate                            property  s           "2023/11/29 Wed 11:43:00"                emits-change
bmc.kepler.Systems.FruData.Chassis  interface -           -                                        -
.ChassisCustomInfo                  property  s           "1=11"                                   -
.ChassisPartNumber                  property  s           "3"                                      emits-change
.ChassisSerialNumber                property  s           "4"                                      -
.ChassisType                        property  s           "Defachable"                             -
bmc.kepler.Systems.FruData.Overview interface -           -                                        -
.FruId                              property  y           0                                        emits-change
.FruName                            property  s           "BMC"                                    -
.FruType                            property  s           "0"                                      -
bmc.kepler.Systems.FruData.Product  interface -           -                                        -
.AssetTag                           property  s           "000"                                    emits-change
.ManufacturerName                   property  s           "8"                                      emits-change
.ProductCustomInfo                  property  s           "2=22"                                   -
.ProductFRUFileID                   property  s           "5.07.00.01"                             -
.ProductName                        property  s           "5"                                      emits-change
.ProductPartNumber                  property  s           "12345678901234567890123456789012345678… emits-change
.ProductSerialNumber                property  s           "12345678901234567890123456789012345678… emits-change
.ProductVersion                     property  s           "9"                                      -
bmc.kepler.Systems.FruData.System   interface -           -                                        -
.SystemManufacturer                 property  s           "22"                                     -
.SystemProductName                  property  s           "23"                                     emits-change
.SystemSerialNumber                 property  s           "24"                                     emits-change
.SystemVersion                      property  s           "37"                                     -
org.freedesktop.DBus.Introspectable interface -           -                                        -
.Introspect                         method    -           s                                        -
org.freedesktop.DBus.ObjectManager  interface -           -                                        -
.GetManagedObjects                  method    -           a{oa{sa{sv}}}                            -
org.freedesktop.DBus.Peer           interface -           -                                        -
.GetMachineId                       method    -           s                                        -
.Ping                               method    -           -                                        -
org.freedesktop.DBus.Properties     interface -           -                                        -
.Get                                method    ss          v                                        -
.GetAll                             method    s           a{sv}                                    -
.Set                                method    ssv         -                                        -
.PropertiesChanged                  signal    sa{sv}as    -                                        -

Board Info Area :该区域提供单板上FRU存储设备的序列号、部件号和其它信息; Chassis Info Area :该区域通常用来保存有关系统机框的序列号、部件号和其它信息; Overview Info Area :该区域描述fru类型和fruid; Product Info Area :该区域提供产品的序列号、部件号、制造商和其它信息; Extended Info Area :该区域的信息都是键值对,也就是“key=value”的形式; System Info Area :该区域只在挂耳(fruid为0)可以查询,描述整机配置信息。

对外接口

资源协作接口

  • bmc.kepler.FrudataService.Frudata

Update 用于非标电子标签更新资源协作接口属性

参数签名描述
prop1as属性名称列表
prop2as属性值列表

SetProductAssetTag 设置产品资产标签

参数签名描述
prop1yFruId
prop2s资产标签

SetSysProductName 设置系统产品名称

参数签名描述
prop1yFruId
prop2s产品名
  • bmc.kepler.FrudataService.IpmiFrudata

Write 写电子标签

参数签名描述
prop1yFruId
prop2s属性名
prop3s属性值

Read 读电子标签

参数签名描述
prop1yFruId
prop2s属性名
  • bmc.kepler.Systems.Components

GetComponentTypes 获取当前所有的部件类型

IPMI接口

  • 具体参数参考本组件配置文件ipmi.json
方法描述
ClearElabelData清除电子标签
WriteElabelData设置电子标签
ReadElabelData查询电子标签
UpdateElabelData更新电子标签
GetPicmgProperties获取PICMG属性
GetAddressInfo获取地址信息
ComputePowerProperties计算功率属性
GetFruidInfo获取FRU信息
IpmiWriteFrudata写入FRU数据
GetComponentInfo获取组件信息
IpmiDftCustom设置定制化配置(Customize Flag)
IpmiGetDftCustom查询DFT全局参数(Customize Flag)
FruControlCapabilitiesFRU控制能力
GetFruInventory获取FRU库存区域信息
GetFruidFromUid通过UID获取组件的Fruid
ReadFruData读取FRU数据
GetComponentPositionInfo获取部件位置信息
GetDevicePresence获取设备信息(在位状态)
GetDeviceHealth获取设备信息(健康状态)
GetDeviceBoardID获取设备信息(BoardID)
GetDeviceLocation获取设备信息(物理位置)
GetDeviceFunction获取设备信息(功能组或逻辑分组)
GetDeviceName获取设备信息(名称)
GetDeviceGroupID获取设备信息(设备所属组ID)
GetDeviceFruid获取设备信息(Device ID)
GetDeviceUniqueId获取设备信息(组件唯一标识)
GetGeneralDeviceManufacture获取设备信息(设备厂商名称)

IPMI读写电子标签

IPMI读写电子标签的功能包括:清除电子标签、写电子标签、读电子标签、更新电子标签。

清除电子标签

命令格式

ipmicmd -k "0f 00 30 90 03 {fru_id} {action}" smi 0

参数说明
字节顺序域内容
NetFn30h
CMD90h
1Sub command,子命令=03h
2FRU Device ID
30xAA=initiate erase,启动erase操作
0x00=get erase status,查询erase操作结果
shMC:软件需要先通过0xAA启动erase,然后等一段时间再发送0x00进行查询
响应说明
字节顺序域内容
1Completion Code
2Erase progress
[7:4]-reserved
[3:0]-erase in progress
0h=erase in progress
1h=erase completed
使用实例

#清除电子标签

请求: ipmicmd -k "0f 00 30 90 03 00 00" smi 0

响应: 0f 31 00 90 00 01

写电子标签

命令格式

ipmicmd -k "0f 00 30 90 04 {fru_id} {area_number} {field_number} {flag} {length} {data}" smi 0

参数说明
字节顺序域内容
NetFn30h
CMD90h
1Sub command,子命令=04h
2FRU Device ID
3Area Number
0=Internal Use Area
1=Chassis Info Area
2=Board Info Area
3=Product Info Area
5=Extend Info Area,写入扩展电子标签时,使用“key=description”或“key:description”的格式,当写入多个不同的“key=”时,中间会用“;”进行分割
6=System Info Area
Other reserved
4Field Number
Area Number=0:
0=默认值
1=Internal Extend E-Lable
Area Number=1:
0=Chassis Type
1=Chassis Part Number
2=Chassis Serial Number
3=Chassis Extend E-Lable
Area Number=2:
0=Mfg.Date/Time
1=Board Manufacturer
2=Board Product Name
3=Board Serial Number
4=Board Part Number
5=Fru File ID
6=Board Extend E-Lable
Area Number=3:
0=Product Manufacturer Name
1=Product Name
2=Product Part/Model Number
3=Product Version
4=Product Serial Number
5=Asset Tag
6=FRU File ID
7=Product Extend E-Lable
Area Number=5:
Field Number填0
Area Number=6:
0=System Manufacturer Name
1=System Product Name
2=System Version
3=System Serial Number
5[7]:级联标志
0=最后一帧数据
1=后面还有数据
[6]:reserved
[5:0]: Offset,写入的数据偏移,从0开始
说明:当数据较长需要多次写入时,一定要从头到尾顺序写入,不能乱序
6Length,写入长度总支持最长的长度:309(63+246),每个区域:
Internal域支持的最长的长度:248;
Extend E-Lable区域,支持最长的长度:501(255+246);
Board域field 0固定只能写入3字节,其它field写入长度限制为48字节;
Chassis域field 0固定只能写入1字节,其它field写入长度限制为48字节;
System域field 2固定只能写入1字节,其它field写入长度限制为48字节;
7:N写入的数据
响应说明
字节顺序域内容
1Completion Code
使用实例

#写电子标签

请求: ipmicmd -k "0f 00 30 90 04 00 00 00 00 02 31 31" smi 0

响应: 0f 31 00 90 00

读电子标签

命令格式

ipmicmd -k "0f 00 30 90 05 {fru_id} {area_number} {field_number} {read_offset} {read_length}" smi 0

参数说明
字节顺序域内容
NetFn30h
CMD90h
1Sub command,子命令=05h
2FRU Device ID
3Area Number
0=Internal Use Area
1=Chassis Info Area
2=Board Info Area
3=Product Info Area
5=Board Extend E-Lable,Board域扩展电子标签
6=System Info Area
7=Internal Extend E-Lable,Internal域扩展电子标签
8=Chassis Extend E-Lable,Chassis域扩展电子标签
9=Product Extend E-Lable,Product域扩展电子标签
Other reserved
4Field Number
Area Number=0:
Field Number填0
Area Number=1:
0=Chassis Type
1=Chassis Part Number
2=Chassis Serial Number
Area Number=2:
0=Mfg.Date/Time
1=Board Manufacturer
2=Board Product Name
3=Board Serial Number
4=Board Part Number
5=Fru File ID
Area Number=3:
0=Product Manufacturer Name
1=Product Name
2=Product Part/Model Number
3=Product Version
4=Product Serial Number
5=Asset Tag
6=FRU File ID
Area Number=5,7,8,9:
Field Number从1顺序编号,1表示读第1条,2表示读第2条,以此类推。
Area Number=6:
0=System Manufacturer Name
1=System Product Name
2=System Version
3=System Serial Number
5Read offset
6Read length(支持读取最长的长度:255+246)
响应说明
字节顺序域内容
1Completion Code
2End of List,表示当前数据是否结束
当电子标签数据比较长的时候,可能需要分多次读取,通过此字段可以判断数据是否读完
[7]: End of list
1=last data
0=middle data
[6:0]:reserved
3Data,实际返回的数据可能小于等于Read length
使用实例

#读电子标签

请求: ipmicmd -k "0f 00 30 90 05 00 00 00 01 30" smi 0

响应: 0f 31 00 90 00 80 31

更新电子标签

命令格式

ipmicmd -k "0f 00 30 90 06 {fru_id} {param}" smi 0

参数说明
字节顺序域内容
NetFn30h
CMD90h
1Sub command,子命令=06h
2FRU Device ID
30xAA=initiate update,启动update操作
0x00=get update status,查询update操作结果
shMC:软件需要先通过0xAA启动update,然后等一段时间再发送0x00进行查询
响应说明
字节顺序域内容
1Completion Code
2Update progress
[7:4]-reserved
[3:0]-Updating in progress
0h=Updating in progress
1h=Updating completed
3Update result
0x00:Update电子标签成功
0xE0~0xED:Update电子标签失败
使用实例

#更新电子标签

请求: ipmicmd -k "0f 00 30 90 06 00 00" smi 0

响应: 0f 31 00 90 00 02 00

IPMI edit命令修改电子标签信息

fru edit <fruid> field <section> <index> <string>

section和index字段定义

sectionindex
Board = 'b'Manufacturer = 0
Product Name = 1
Serial Number = 2
Part Number = 3
Fru File ID = 4
Product = 'p'Manufacturer = 0
Name = 1
Part Number = 2
Version = 3
Serial Number = 4
Asset Tag = 5
Fru File Id = 6
Chassis = 'c'Part Number = 0
Serial Number = 1

注意:edit命令必须修改有内容的字段,否则会报错找不到

配置介绍

json
"Eeprom_EXU": {
  "OffsetWidth": 2,
  "AddrWidth": 1,
  "Address": 174,
  "WriteTmout": 100,
  "ReadTmout": 100,
  "RwBlockSize": 32,
  "WriteInterval": 20,
  "HealthStatus": 0
},
"Accessor_EXUWP": {
  "Chip": "#/Smc_ExpBoardSMC",
  "Size": 1,
  "Offset": 11776,
  "Mask": 255,
  "Type": 0,
  "Value": 0
},
"FruData_Expander": {
  "FruId": 1,
  "FruDev": "#/Eeprom_EXU",              -- 关联eeprom
  "EepromWp": "#/Accessor_EXUWP.Value",  -- 关联写保护寄存器
  "StorageType": "TianChi"               -- 存储介质类型
},
"Fru_Expander": {
  "PcbId": 1,                         -- 需要关联到硬件, 从硬件读取Id
  "PcbVersion": ".A",                 -- PCB版本
  "FruId": 1,
  "FruName": "ExpBoard{Slot}", 
  "PowerState": 1, 
  "Health": 0, 
  "EepStatus": "<=/Eeprom_EXU.HealthStatus", 
  "Type": 50, 
  "FruDataId": "#/FruData_Expander",  -- EEPROM状态, 当此属性关联到Accessor时进行EEPROM的监控
  "ConnectorGroupId": "{GroupId}",    -- 关联Anchor的GroupId
  "BoardId": 65535,                   -- 非天池:组件单板BoardID
  "UniqueId": "00000001010302023922"  -- 天池:组件唯一标识,Vendor + ComponentID
}

组件 eeprom头定义

整体偏移域内偏移段含义
0Eeprom Header0规范码天池规范校验码(只校验高4Byte: "0xA55A55A") eeprom header 域内偏移,预留8个字节,防篡改。
12SPEC Version天池规范版本,本次更新为0x02(此前为0x1)
13电子标签域偏移(Elable Address)电子标签的整体偏移,字长为2 Bytes
15OEM定制区域1 -- System Information BMC 使用OEM定制区域(产品定制化信息等)
17OEM定制区域2 -- 内部使用域(Internal Use Area Address) --硬件 MCU使用内部使用域的整体偏移,字长为2 Bytes
19产品子描述记录域偏移PSR(即产品自描述记录)域的整体偏移,字长为2 Bytes
...............
ElableElable0电子标签内容电子标签内容(长度2k)
...............
System InformationSystem0System域内容System域内容(定制化信息)

注意事项:

  1. fruid配置为1-63会自动分配fruid,默认可以配为1
  2. fruid为0保留给挂耳,配置64-255不会进行fruid分配
  3. Fru里面的FruDataId需要关联到对应的Frudata对象
  4. 天池规范的电子标签配置为TianChi,非天池的规范的标准电子标签配置为EepromV2
  5. 非标电子标签StorageType可以配为MCU等,不做限制