功能简介
支持标准和非标准的电子标签管理,标准电子标签直接由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字段定义
| Area | field |
|---|---|
| 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 电子标签对外呈现形式
> 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 用于非标电子标签更新资源协作接口属性
| 参数 | 签名 | 描述 |
|---|---|---|
| prop1 | as | 属性名称列表 |
| prop2 | as | 属性值列表 |
SetProductAssetTag 设置产品资产标签
| 参数 | 签名 | 描述 |
|---|---|---|
| prop1 | y | FruId |
| prop2 | s | 资产标签 |
SetSysProductName 设置系统产品名称
| 参数 | 签名 | 描述 |
|---|---|---|
| prop1 | y | FruId |
| prop2 | s | 产品名 |
- bmc.kepler.FrudataService.IpmiFrudata
Write 写电子标签
| 参数 | 签名 | 描述 |
|---|---|---|
| prop1 | y | FruId |
| prop2 | s | 属性名 |
| prop3 | s | 属性值 |
Read 读电子标签
| 参数 | 签名 | 描述 |
|---|---|---|
| prop1 | y | FruId |
| prop2 | s | 属性名 |
- 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) |
| FruControlCapabilities | FRU控制能力 |
| 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
参数说明
| 字节顺序 | 域内容 |
|---|---|
| NetFn | 30h |
| CMD | 90h |
| 1 | Sub command,子命令=03h |
| 2 | FRU Device ID |
| 3 | 0xAA=initiate erase,启动erase操作 0x00=get erase status,查询erase操作结果 shMC:软件需要先通过0xAA启动erase,然后等一段时间再发送0x00进行查询 |
响应说明
| 字节顺序 | 域内容 |
|---|---|
| 1 | Completion Code |
| 2 | Erase 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
参数说明
| 字节顺序 | 域内容 |
|---|---|
| NetFn | 30h |
| CMD | 90h |
| 1 | Sub command,子命令=04h |
| 2 | FRU Device ID |
| 3 | Area 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 |
| 4 | Field 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开始 说明:当数据较长需要多次写入时,一定要从头到尾顺序写入,不能乱序 |
| 6 | Length,写入长度总支持最长的长度: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 | 写入的数据 |
响应说明
| 字节顺序 | 域内容 |
|---|---|
| 1 | Completion 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
参数说明
| 字节顺序 | 域内容 |
|---|---|
| NetFn | 30h |
| CMD | 90h |
| 1 | Sub command,子命令=05h |
| 2 | FRU Device ID |
| 3 | Area 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 |
| 4 | Field 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 |
| 5 | Read offset |
| 6 | Read length(支持读取最长的长度:255+246) |
响应说明
| 字节顺序 | 域内容 |
|---|---|
| 1 | Completion Code |
| 2 | End of List,表示当前数据是否结束 当电子标签数据比较长的时候,可能需要分多次读取,通过此字段可以判断数据是否读完 [7]: End of list 1=last data 0=middle data [6:0]:reserved |
| 3 | Data,实际返回的数据可能小于等于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
参数说明
| 字节顺序 | 域内容 |
|---|---|
| NetFn | 30h |
| CMD | 90h |
| 1 | Sub command,子命令=06h |
| 2 | FRU Device ID |
| 3 | 0xAA=initiate update,启动update操作 0x00=get update status,查询update操作结果 shMC:软件需要先通过0xAA启动update,然后等一段时间再发送0x00进行查询 |
响应说明
| 字节顺序 | 域内容 |
|---|---|
| 1 | Completion Code |
| 2 | Update progress [7:4]-reserved [3:0]-Updating in progress 0h=Updating in progress 1h=Updating completed |
| 3 | Update 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字段定义
| section | index |
|---|---|
| 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命令必须修改有内容的字段,否则会报错找不到
配置介绍
"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头定义
| 整体偏移 | 域 | 域内偏移 | 段 | 段含义 |
|---|---|---|---|---|
| 0 | Eeprom Header | 0 | 规范码 | 天池规范校验码(只校验高4Byte: "0xA55A55A") eeprom header 域内偏移,预留8个字节,防篡改。 |
| 12 | SPEC Version | 天池规范版本,本次更新为0x02(此前为0x1) | ||
| 13 | 电子标签域偏移(Elable Address) | 电子标签的整体偏移,字长为2 Bytes | ||
| 15 | OEM定制区域1 -- System Information BMC 使用 | OEM定制区域(产品定制化信息等) | ||
| 17 | OEM定制区域2 -- 内部使用域(Internal Use Area Address) --硬件 MCU使用 | 内部使用域的整体偏移,字长为2 Bytes | ||
| 19 | 产品子描述记录域偏移 | PSR(即产品自描述记录)域的整体偏移,字长为2 Bytes | ||
| ... | ... | ... | ... | ... |
| Elable | Elable | 0 | 电子标签内容 | 电子标签内容(长度2k) |
| ... | ... | ... | ... | ... |
| System Information | System | 0 | System域内容 | System域内容(定制化信息) |
注意事项:
- fruid配置为1-63会自动分配fruid,默认可以配为1
- fruid为0保留给挂耳,配置64-255不会进行fruid分配
- Fru里面的FruDataId需要关联到对应的Frudata对象
- 天池规范的电子标签配置为TianChi,非天池的规范的标准电子标签配置为EepromV2
- 非标电子标签StorageType可以配为MCU等,不做限制