sensor_mgmt 主要用于承接传感器管理
组件概述
组件是什么、解决什么问题
sensor_mgmt 是基于 C++ 重构的高性能版传感器管理组件(服务名 sensor,D-Bus 总线名 bmc.kepler.sensor,部署服务 sensor_mgmt.service),通过 discovery 框架注册 D-Bus / IPMI 对象,负责监测 CPU、内存、硬盘、风扇、电源、卡等部件的在位、温度、电压、风扇转速等信息,并据此生成 IPMI SEL 事件与传感器健康状态,实现监管部件运行状态及健康状况的目的。
演进策略:稳定前 sensor(Lua 版)与 sensor_mgmt 均需同步新特性;稳定后 sensor 仅维护缺陷,新增功能主要由 sensor_mgmt 支持。具体使用哪个组件可通过 manifest.yml 配置。
核心功能
| 功能 | 说明 |
|---|---|
| 门限型传感器 | 连续量(温度/电压/功耗/转速)监测,门限比较触发事件 |
| 离散型传感器 | 离散状态(运行状态/隔离值)监测,关联离散事件触发事件 |
| Entity 实体 | 表征传感器所属硬件,在位/上下电状态影响读值与事件生成 |
| IPMI SEL | 传感器事件按 IPMI 规范记录 SEL 并更新健康状态 |
| 平台事件转发 | 通过 EventReportSignal 信号将平台事件转发给管理组件消费 |
| SDR/PEF | SDR 存储库管理与 PEF 平台事件过滤告警 |
| 资源协作接口 | ThresholdSensor/DiscreteSensor/Entity/DiscreteEvent/Sensors/SensorSelInfo/BootError |
| IPMI 接口 | NetFn 0x04(传感器/PEF)、0x0A(SDR/SEL)、OEM 0x30/0x2C |
术语解释
| 术语 | 解释 |
|---|---|
| 门限型传感器(ThresholdSensor) | 读值为连续量的传感器,与 6 个门限值比较产生/恢复事件 |
| 离散型传感器(DiscreteSensor) | 读值为离散量的传感器,关联离散事件产生事件 |
| Entity | 传感器依赖/所属的硬件实体,在位/上下电状态影响传感器与 SEL |
| SEL | System Event Log,系统事件日志,按 IPMI 规范记录 |
| SDR | Sensor Data Record,传感器数据记录,描述传感器能力与配置 |
| PEF | Platform Event Filtering,平台事件过滤,对平台事件执行告警等动作 |
| Assert/Deassert | SEL 事件方向:产生/恢复 |
外部系统交互边界
说明:sensor_mgmt 订阅 Fru/FruCtrl/Frus 等外部接口获取部件在位与上下电状态,作为传感器读值与 SEL 事件生成的数据源;平台事件通过信号转发给 bmc_health 等管理组件。
功能简介
传感器主要用于监测如 CPU、内存、硬盘、风扇、电源、卡等部件的信息,如部件在位、温度、电压、风扇转速等信息,并相应记录 IPMI SEL 以及通过传感器健康状态进行表征,以此达到监管部件的运行状态及健康状况的目的。
关键特性
门限型传感器
门限传感器又叫做连续性传感器,表征传感器的值是连续变化的(对比了解:数学中的连续值/曲线),如:温度、电压、功耗、转速等。通过门限传感器可描述性资源表征传感器的运行状态和健康状况。
关联类:ThresholdSensor
门限型传感器可描述资源
门限传感器可描述资源均使用 ThresholdSensorDisplay 类来进行表示,该类不需要 CSR 配置,由 sensor 组件进行解析和完成资源协作接口注册。
| 属性名称 | 属性类型 | 读写 | 取值范围 | 属性说明 |
|---|---|---|---|---|
| UpperNonrecoverableDisplay | string | RO | NA | 传感器紧急门限上限可读描述,精度3位有效数字 |
| UpperCriticalDisplay | string | RO | NA | 传感器严重门限上限可读描述,精度3位有效数字 |
| UpperNoncriticalDisplay | string | RO | NA | 传感器一般门限上限可读描述,精度3位有效数字 |
| LowerNonrecoverableDisplay | string | RO | NA | 传感器紧急门限下限可读描述,精度3位有效数字 |
| LowerNoncriticalDisplay | string | RO | NA | 传感器一般门限下限可读描述,精度3位有效数字 |
| LowerCriticalDisplay | string | RO | NA | 传感器严重门限下限可读描述,精度3位有效数字 |
| PositiveHysteresisDisplay | string | RO | NA | 传感器正向迟滞量可读描述,精度3位有效数字 |
| NegativeHysteresisDisplay | string | RO | NA | 传感器负向迟滞量可读描述,精度3位有效数字 |
| ReadingDisplay | string | RW | NA | 传感器读值可读描述,精度3位有效数字 |
| UnitDisplay | string | RO | NA | 传感器单位可读描述 |
| Status | string | RO | Enabled/Disabled/InTest/Starting | 传感器当前状态:Enabled:传感器使能;Disabled:传感器禁用;InTest:传感器测试中;Starting:传感器更新中 |
| Health | string | RO | Critical/Major/Minor/OK | 传感器健康状态:Critical:紧急;Major:严重;Minor:一般;OK:正常 |
| AssertStatus | uint16 | RO | 0-65535 | 传感器SEL事件状态,16进制的数,bit4 - bit15依次对应12种门限事件状态,1:Assert;0:Deassert |
离散型传感器
离散传感器,表征传感器的值是离散的(对比了解:数学中的离散值/曲线),如:运行状态,隔离值等。通过离散型传感器可描述性资源表征传感器的运行状态和健康状况。
关联类:DiscreteSensor
离散型传感器可描述资源
离散型传感器可描述资源均使用 DiscreteSensorDisplay 类来进行表示,该类不需要 CSR 配置,由 sensor 组件进行解析和完成资源协作接口注册。
| 属性名称 | 属性类型 | 读写 | 取值范围 | 属性说明 |
|---|---|---|---|---|
| Status | string | RO | Enabled/Disabled/InTest/Starting | 传感器当前状态:Enabled:传感器使能;Disabled:传感器禁用;InTest:传感器测试中;Starting:传感器更新中 |
| Health | string | RO | Critical/Major/Minor/OK | 传感器健康状态:Critical:紧急;Major:严重;Minor:一般;OK:正常 |
| AssertStatus | uint16 | RO | 0-65535 | 传感器SEL事件状态,bit0 - bit14依次对应15种offset的离散事件状态,1:Assert;0:Deassert |
实体资源 Entity
传感器实体资源,表征当前传感器依赖或者所属的硬件的实体描述,该实体的在位状态或者上下电状态会影响当前传感器的值以及状态,还有对应传感器事件 IPMI SEL 的生成状态。
关联类:Entity
IPMI SEL
连续型传感器触发事件
连续传感器的事件生成条件即:读值与 6 个门限值比较后是否满足产生或恢复事件的条件:
- 触发产生:
AssertMask置位、读值超出门限范围、且尚未产生事件 → 填充 SEL 信息落库并更新传感器健康状态; - 触发恢复:
DeassertMask置位、读值恢复到门限范围内(门限值经迟滞调整:上门限值 = 上门限 - 正向迟滞量,下门限值 = 下门限 + 负向迟滞量)、且已产生事件未恢复 → 记录恢复事件。
离散型传感器触发事件
离散传感器的事件生成条件即关联的离散事件的方向是否发生改变,判定流程与连续型一致。
| 监听方式 | 数据组成 |
|---|---|
| 组合监听 | Property:event_dir | event_data3 | event_data2 | event_data1 |
| 独立监听 | 本对象属性:EventDir、EventData1、EventData2、EventData3 |
| 事件翻转 | Conversion 低 4 位为翻转位:Conversion & 0x0F == 1 时 assert 与 deassert 互转 |
平台事件转发
sensor 组件收到节点板平台事件(系统健康事件)并落库 SEL 后,若 PlatformEventForwardEnable 使能开关打开,则通过 Sensors 对象的 EventReportSignal 信号将 sel_record 结构化字段(11 字段)转发给管理组件(订阅该信号的组件)消费;关闭则仅记录 SEL 不转发。
对外接口
资源协作接口
ThresholdSensor 门限传感器
Path:
/bmc/kepler/Systems/:SystemId/ThresholdSensors/:IDInterface:
bmc.kepler.Systems.ThresholdSensor
属性:
| 属性名称 | 属性类型 | 读写 | 取值范围 | 属性说明 |
|---|---|---|---|---|
| EntityId | uint8 | RO | 0-255 | 传感器对应的实体,来自于IPMI规范,需要关联传感器对应的Entity.Id |
| EntityInstance | uint8 | RO | 0-255 | 传感器对应的实体,来自于IPMI规范,需要关联传感器对应的Entity.Instance |
| SensorIdentifier | string | RO | NA | 传感器标识 |
| SensorName | string | RO | NA | 传感器对外显示名称 |
| Capabilities | uint8 | RO | 0-255 | 传感器支持能力,来自于IPMI规范 43.1 |
| SensorType | uint8 | RO | 0-255 | 传感器类型,来自于IPMI规范 42.2 |
| ReadingMask | uint16 | RO | 0-65535 | 传感器读值掩码,来自于IPMI规范 43.1 |
| UpperNonrecoverable | uint8 | RO | 0-255 | 传感器紧急事件上限 |
| UpperCritical | uint8 | RO | 0-255 | 传感器严重事件上限 |
| UpperNoncritical | uint8 | RO | 0-255 | 传感器一般事件上限 |
| LowerNonrecoverable | uint8 | RO | 0-255 | 传感器紧急事件下限 |
| LowerNoncritical | uint8 | RO | 0-255 | 传感器严重事件下限 |
| LowerCritical | uint8 | RO | 0-255 | 传感器一般事件下限 |
| PositiveHysteresis | uint8 | RO | 0-255 | 传感器正向迟滞量 |
| NegativeHysteresis | uint8 | RO | 0-255 | 传感器负向迟滞量 |
| SensorNumber | uint8 | RO | 0-255 | 传感器编号,默认255,由BMC自行生成;特殊编号需在传感器定制化定制(BMC正常运行时插入的部件传感器不支持定制) |
| OwnerLun | uint8 | RO | 0-255 | 传感器的Lun,默认0 |
| Reading | uint8 | RO | 0-255 | 传感器原始读值,引用传感器的数据源(如Scanner)读值同步,默认值需在门限之内,防止产生SEL事件 |
| ReadingStatus | uint8 | RO | 0-255 | 传感器读值状态,默认0,引用数据源读值状态同步 |
| OriginalReading | double | RO | NA | 传感器的原始值,当线性标志配置0x70-0x7f时,需要此属性配合Reading(固定配置170)计算传感器读数系数以提升读值精度 |
Display 接口:bmc.kepler.Systems.ThresholdSensorDisplay(属性见「门限型传感器可描述资源」)
DiscreteSensor 离散传感器
Path:
/bmc/kepler/Systems/:SystemId/DiscreteSensors/:IDInterface:
bmc.kepler.Systems.DiscreteSensor
属性:
| 属性名称 | 属性类型 | 读写 | 取值范围 | 属性说明 |
|---|---|---|---|---|
| EntityId | uint8 | RO | 0-255 | 传感器对应的实体,需要关联传感器对应的Entity.Id |
| EntityInstance | uint8 | RO | 0-255 | 传感器对应的实体,需要关联传感器对应的Entity.Instance |
| SensorIdentifier | string | RO | NA | 传感器标识 |
| OwnerId | uint8 | RO | 0-255 | 传感器归属标识,默认32(归属于BMC) |
| OwnerLun | uint8 | RO | 0-255 | 传感器的Lun,默认0 |
| Capabilities | uint8 | RO | 0-255 | 传感器支持能力 |
| SensorName | string | RO | NA | 传感器对外显示的名称 |
Display 接口:bmc.kepler.Systems.DiscreteSensorDisplay(属性见「离散型传感器可描述资源」)
Entity 实体
Path:
/bmc/kepler/Systems/:SystemId/Entities/:IDInterface:
bmc.kepler.Systems.Entity
属性:
| 属性名称 | 属性类型 | 读写 | 取值范围 | 属性说明 |
|---|---|---|---|---|
| Id | uint8 | RO | 0-255 | Entity Id,IPMI 规范 43.14 |
| Instance | uint8 | RO | 0-255 | Entity Instance,默认值 96 |
| Slot | uint8 | RO | 0-255 | Entity所在的槽位号,默认 255 |
| Name | string | RO | NA | Entity的名称 |
| PowerState | uint8 | RO | 0-255 | Entity的上下电状态,关联对应的上下电信号来源 |
| Presence | uint8 | RO | 0-255 | Entity的在位状态,关联对应的在位信号来源 |
| Health | uint8 | RO | 0-255 | Entity的健康状态,不需要配置,默认值 0 |
DiscreteEvent 离散事件
Path:
/bmc/kepler/Systems/:SystemId/DiscreteEvents/:IdInterface:
bmc.kepler.Systems.DiscreteEvent
属性:
| 属性名称 | 属性类型 | 读写 | 取值范围 | 属性说明 |
|---|---|---|---|---|
| Property | uint32 | RO | 0-4294967295 | 离散事件监听的属性,如果监听类型是组合侦听则代表 IPMI SEL 产生使用的数据和方向 |
| EventDir | uint8 | RO | 0-255 | 离散事件产生的方向:0 - 恢复;其他 - 产生,当监听类型是独立侦听时使用 |
| SensorObject | string | RO | NA | 离散事件关联的离散传感器,当IPMI SEL产生或者恢复时体现在当前传感器的健康状态以及SEL上 |
类属性(CSR 配置):
| 属性名称 | 属性类型 | 取值范围 | 属性说明 |
|---|---|---|---|
| ListenType | uint8 | 0-1 | 离散事件监听类型:1 - 独立侦听;0 - 组合侦听 |
| EventData1 | uint8 | 0-255 | 离散事件产生的数据1,独立侦听时使用,用来表征同一类型离散传感器不同的离散状态方向 |
| EventData2 | uint8 | 0-255 | 离散事件产生的数据2,独立侦听时使用 |
| EventData3 | uint8 | 0-255 | 离散事件产生的数据3,独立侦听时使用 |
| Conversion | uint8 | 0-255 | 离散事件翻转标识,高4bit用来组合侦听时EventData1的掩码,低4bit用来表征是否翻转:1 - 翻转;其他 - 不翻转 |
| InvalidReadingIgnore | uint8 | 0-255 | 离散事件是否忽略无效值(1:是,0:否) |
| InvalidReading | uint8 | 0-255 | 离散事件的无效值 |
| Severity | uint8 | 0-255 | 离散事件的事件等级,默认255 |
Sensors 传感器集合
Path:
/bmc/kepler/Chassis/:ChassisId/SensorsInterface:
bmc.kepler.Chassis.Sensors
属性:
| 属性名称 | 属性类型 | 读写 | 取值范围 | 属性说明 |
|---|---|---|---|---|
| Health | string | RO | Normal/Minor/Major/Critical | 系统健康状态,取值有0:Normal,1:Minor,2:Major,3:Critical |
方法:
| 方法 | 描述 |
|---|---|
| GetThresholdSensorList | 查询门限传感器列表 |
| MockSensor | 模拟传感器 |
| GetSensorList | 查询所有传感器列表 |
| SetSensorStatus | 设置传感器使能状态 |
| ExportSel | 导出传感器事件列表 |
| GetSel | 获取传感器事件列表 |
| GetDiscreteSensorList | 查询离散传感器列表 |
| GetReportedSel | 获取上报事件 |
| DumpSDR | 将SDR数据dump为二进制文件 |
| AddOemSel | 添加OEM SEL |
| ClearSel | 清空所有SEL事件 |
| ClearSensorSel | 清空传感器事件 |
| SetThresholds | 设置门限传感器门限值 |
| GetSensorDetail | 按过滤条件查询指定传感器的详细信息 |
信号:
| 信号 | 描述 |
|---|---|
| EventReportSignal | 平台事件转发信号,Ctx(a{ss},请求上下文,含 Interface/UserName/ClientAddr)+ EventRecord(a{sv},sel_record 结构化字段字典,11 字段) |
查询门限传感器列表 GetThresholdSensorList
输入:
- 无
输出:
SensorList(Array<ThresholdSensorItem>):门限传感器列表
ThresholdSensorItem 结构:
SensorNumber(uint16):传感器编号SensorName(string):传感器名称SensorIdentifier(string):传感器标识SensorUnit(string):传感器单位,具体的描述单位,比如RPMSensorStatus(string):传感器状态SensorReading(string):传感器读数,经过单位转换之后LowerThresholdFatal(string):传感器紧急事件下限LowerThresholdCritical(string):传感器严重事件下限LowerThresholdNonCritical(string):传感器一般事件下限UpperThresholdNonCritical(string):传感器一般事件上限UpperThresholdCritical(string):传感器严重事件上限UpperThresholdFatal(string):传感器紧急事件上限SensorType(uint8):传感器类型Status(string):传感器状态Health(string):传感器健康状态SystemId(uint8):传感器归属host的编号EntityName(string):传感器关联实体名称(Entity.Name 原值)
模拟传感器 MockSensor
用于调试:将指定传感器的读值模拟为固定值,便于验证门限事件、SEL 生成与健康状态联动。
输入:
Enabled(uint8):是否使能模拟,取值范围:0-1SensorName(string):模拟传感器的名称Value(string):模拟传感器读值,stop表示停止模拟
输出:
- 无
异常与触发条件:
| 异常 | 触发条件 |
|---|---|
抛错 InvalidSensorValue | Value 不是合法数字(strtod 转换失败) |
抛错 InvalidSensorName(sensor_error_map(ERR_INVALID_MOCK_NAME)) | 指定名称的传感器不存在(阈值+离散均未匹配) |
| 无异常 | 传感器存在且 Value 合法 |
首发版本: sensor_mgmt 0.0.113(bmcsdk 25.x)
应用场景与限制条件:
- 典型场景:测试环境模拟某传感器读值,验证门限事件、SEL、健康状态;
Value=stop停止模拟恢复真实读值。 - 限制条件:仅支持已注册的传感器(阈值/离散);模拟值需为数字字符串;模拟期间传感器读值不随数据源更新。
调试示例:
# 1) 查询门限传感器列表确认名称
busctl --user call bmc.kepler.sensor /bmc/kepler/Chassis/1/Sensors \
bmc.kepler.Chassis.Sensors GetThresholdSensorList
# 2) 将名为 "CPU0 Temp" 的传感器模拟为 85.000
busctl --user call bmc.kepler.sensor /bmc/kepler/Chassis/1/Sensors \
bmc.kepler.Chassis.Sensors MockSensor yss 1 'CPU0 Temp' '85.000'
# 3) 停止模拟
busctl --user call bmc.kepler.sensor /bmc/kepler/Chassis/1/Sensors \
bmc.kepler.Chassis.Sensors MockSensor yss 1 'CPU0 Temp' stop查询所有传感器列表 GetSensorList
输入:
- 无
输出:
SensorList(Array<AllSensorItem>):查询到的传感器列表
AllSensorItem 结构:
SensorNumber(uint16):传感器编号SensorName(string):传感器名称SensorUnit(string):传感器单位,具体的描述单位,比如RPMSensorStatus(string):传感器状态SensorReading(string):传感器读数,经过单位转换之后LowerFatal(string):传感器紧急事件下限LowerCritical(string):传感器严重事件下限LowerNonCritical(string):传感器一般事件下限UpperNonCritical(string):传感器一般事件上限UpperCritical(string):传感器严重事件上限UpperFatal(string):传感器紧急事件上限PosHysteresis(string):传感器正向迟滞量NegHysteresis(string):传感器负向迟滞量SensorType(uint8):传感器类型BaseUnit(uint8):单位(数字描述)ReadingType(uint8):读值类型SystemId(uint8):传感器归属host的编号EntityName(string):传感器关联实体名称(Entity.Name 原值)
设置传感器使能状态 SetSensorStatus
输入:
SensorName(string):传感器的名称Status(string):使能状态(enabled,disabled)
输出:
- 无
异常与触发条件:
| 异常 | 触发条件 |
|---|---|
抛错 sensor_error(msg 含 Disable/Enable fail) | 离散传感器使能状态设置失败 |
抛错 SensorNotSupported | 目标为门限传感器(不支持状态设置) |
抛错 InvalidSensorName | 传感器不存在 |
首发版本: sensor_mgmt 0.0.113(bmcsdk 25.x)
应用场景与限制条件:
- 典型场景:禁用故障传感器避免误报 SEL,或重新启用。
- 限制条件:仅离散传感器支持使能/禁用,门限传感器调用会抛
SensorNotSupported。
调试示例:
# 禁用离散传感器
busctl --user call bmc.kepler.sensor /bmc/kepler/Chassis/1/Sensors \
bmc.kepler.Chassis.Sensors SetSensorStatus ss 'SensorName' disabled
# 相应: (无输出)
# 重新启用
busctl --user call bmc.kepler.sensor /bmc/kepler/Chassis/1/Sensors \
bmc.kepler.Chassis.Sensors SetSensorStatus ss 'SensorName' enabled获取传感器事件列表 GetSel
输入:
StartId(uint16):事件索引,取值范围:0-65535。StartId 大于等于 1,超过总条数会返回空表Count(uint16):事件条数,取值范围:0-65535。Count 大于等于 0,超过总条数会返回所有事件
输出:
Total(uint16):事件总条数SelList(Array<SelInfo>):事件列表
SelInfo 结构:
MappingTable(Array<KeyValueTable>):Sel信息键值表,键的值包括:序号,时间戳,传感器名称,传感器类型,传感器事件级别,传感器事件状态,传感器事件描述
KeyValueTable 结构:
Key(string)Value(string)
异常与触发条件:
| 异常 | 触发条件 |
|---|---|
| 无异常 | 正常查询(StartId 超过总条数返回空表,不会抛错) |
抛错 IPMIRequestLengthInvalid(IPMI 通道) | StartId/Count 超出 IPMI 长度限制 |
首发版本: sensor_mgmt 0.0.113(bmcsdk 25.x)
应用场景与限制条件:
- 典型场景:北向查询传感器事件列表(分页查询:StartId 起查 Count 条)。
- 限制条件:StartId 大于等于 1,超过总条数返回空表;Count 超过总条数返回所有事件;SEL 查询最大记录数由
QueryMaxCount配置(默认 2000)。
调试示例:
# D-Bus 查询前 10 条 SEL
busctl --user call bmc.kepler.sensor /bmc/kepler/Chassis/1/Sensors \
bmc.kepler.Chassis.Sensors GetSel qq 1 10
# 相应: q a(av) ... (Total + SelList)
# IPMI 查询 SEL 信息(GetSelInfo 0x0A/0x40)
ipmitool raw 0x0a 0x40
# 相应: 00 51 02 02 00 ...
# IPMI 查询传感器读数(GetSensorReading 0x04/0x2D,参数为传感器编号)
ipmitool raw 0x04 0x2d 0x01
# 相应: 00 55 00 ...其余方法速查
| 方法 | 输入 | 输出 | 说明 |
|---|---|---|---|
| GetDiscreteSensorList | 无 | SensorList(Array<DiscreteSensorItem>) | 查询离散传感器列表;DiscreteSensorItem 含 SensorNumber/SensorName/SensorIdentifier/SensorStatus/SystemId/EntityName |
| GetReportedSel | StartId(uint64)、Count(uint16) | Total、SelList(结构同 GetSel) | 获取上报事件,分页方式同 GetSel |
| ExportSel | Path(string) | TaskId(uint32) | 导出 SEL 到指定路径,返回任务 ID 拼接任务路径 |
| DumpSDR | DumpMode(string,LAN/BT) | 无 | 将 SDR 数据 dump 为二进制文件 |
| AddOemSel | RecordType(uint8)、Timestamp(uint32)、ManufactureID(uint32)、SELDatas(string) | RecordId(uint32) | 添加一条 OEM SEL |
| ClearSel | 无 | 无 | 清空所有 SEL 事件 |
| ClearSensorSel | 无 | 无 | 清空传感器事件 |
| SetThresholds | SensorName(string)、PersistenceType(uint8 0/1)、Attributes(Dictionary<ThresholdAttributeItem>) | 无 | 设置门限传感器门限值;ThresholdAttributeItem 的 key 取 UpperNonrecoverable/UpperCritical/UpperNoncritical/LowerNonrecoverable/LowerNoncritical/LowerCritical,value 为 3 位小数数字字符串 |
| GetSensorDetail | Params(Dictionary<FilterMap>) | Detail(Array<DetailItem>) | 按过滤条件查询传感器详细信息;FilterMap 支持 SensorNumber/SensorIdentifier(后者同时匹配 SensorName),DetailItem 为对象/Display/Entity 原属性名到值的键值数组 |
平台事件转发信号 EventReportSignal
Ctx(a{ss}):请求上下文键值表(String->String),键由框架 SignalContext 注入,含 Interface、UserName、ClientAddr
EventRecord(a{sv}):sel_record 结构化字段字典,按 sel_record 声明顺序含 11 字段(SelRecordDict):
| 字段 | 类型 | 说明 |
|---|---|---|
| RecordId | uint16 | SEL 记录在主表的逻辑序号(管理板分配,1 起递增) |
| SelType | uint8 | SEL 记录类型,系统事件为 0x02 |
| Timestamp | uint32 | 管理板落库时的系统时间戳 |
| GenerateId | uint16 | 生成方 ID:高字节=请求源地址(src_addr,定位源节点板),低字节=BMC Owner ID(0x20),即 (src_addr<<8)|0x20 |
| SelMsgVersion | uint8 | 上报消息版本号 |
| SensorType | uint8 | IPMI 传感器类型 |
| SensorNumber | uint8 | 传感器编号(在 GenerateId 高字节源板范围内唯一) |
| SelEventType | uint8 | 事件类型:bit7=方向(Assert/Deassert),bit0~6=事件类型 |
| SelData1 | uint8 | 事件数据 1 |
| SelData2 | uint8 | 事件数据 2 |
| SelData3 | uint8 | 事件数据 3 |
SensorSelInfo SEL 信息
Path:
/bmc/kepler/Chassis/:ChassisId/SensorSelInfoInterface:
bmc.kepler.Chassis.SensorSelInfo
属性:
| 属性名称 | 属性类型 | 读写 | 取值范围 | 属性说明 |
|---|---|---|---|---|
| SelMode | uint8 | RW | 0/1 | SEL 记录的模式:0:默认模式,记录达到最大数量后清空;1:记录达到最大数量后滚动。读权限 ReadOnly,写权限 BasicSetting |
| RecordSeq | uint64 | RO | 0-18446744073709551615 | 当前事件的序列号,随着事件产生无限递增 |
| ReportedSelCount | uint16 | RO | 0-65535 | SEL事件总数量 |
BootError 启动错误事件
Path:
/bmc/kepler/Systems/:SystemId/EventEntries/BootErrorInterface:
bmc.kepler.Systems.IPMIEvent
属性:
| 属性名称 | 属性类型 | 读写 | 取值范围 | 属性说明 |
|---|---|---|---|---|
| SensorType | uint8 | RO | 0-255 | IPMI 事件的传感器类型,默认30 |
| ReadingType | uint8 | RO | 0-255 | IPMI 事件的事件读值类型,复位持久化,事件类型来自于HOST侧上报,默认111 |
| EventData | uint32 | RO | 0-4294967295 | IPMI 事件的SEL数据,复位持久化,事件数据来自于HOST侧上报或者HOST上下电状态变化感知 |
IPMI接口
- 具体参数参考本组件配置文件 ipmi.json
传感器与 PEF 接口(NetFn 0x04)
| 方法 | 描述 |
|---|---|
| SetSensorEventReceiver | 设置传感器事件接收器 |
| GetSensorEventReceiver | 获取传感器事件接收器 |
| ReportSensorEvent | 传感器事件消息 |
| GetPEFCapabilities | 获取PEF能力 |
| SetPEFPostponeTimer | 设置PEF延迟定时器 |
| SetPEFParameters | 设置PEF参数 |
| GetPEFParameters | 获取PEF参数 |
| SetPEFLastEventId | 设置PEF最新事件ID |
| GetPEFLastEventId | 获取PEF最新事件ID |
| GetDeviceSDRInfo | 获取设备SDR信息 |
| GetDeviceSDR | 获取设备SDR |
| ReserveDeviceSDR | 预留设备SDR存储库 |
| GetSensorFactors | 获取传感器读数计算系数 |
| SetSensorHysteresis | 设定传感器迟滞 |
| GetSensorHysteresis | 获取传感器迟滞 |
| SetSensorThreshold | 设置传感器阈值 |
| GetSensorThreshold | 获取传感器阈值 |
| SetSensorEventEnable | 设置传感器事件启用状态 |
| GetSensorEventEnable | 获取传感器事件启用状态 |
| RearmSensorEvent | 重新布置传感器事件 |
| GetSensorEventStatus | 获取传感器事件状态 |
| GetSensorReading | 获取传感器读数 |
| GetSensorType | 获取传感器类型 |
SDR 存储库接口(NetFn 0x0A)
| 方法 | 描述 |
|---|---|
| GetSDRRepoInfo | 获取SDR存储库信息 |
| GetSDRRepoAllocInfo | 获取SDR存储库分配信息 |
| GetSDRReserveId | 获取SDR预约ID |
| GetSDR | 获取SDR |
| AddSDR | 添加一条SDR |
| AddPartialSDR | 添加部分SDR |
| DeleteSDR | 删除一条SDR |
| ClearSDR | 清除SDR |
| EnterSDRRepoUpdate | 进入SDR存储库更新模式 |
| ExitSDRRepoUpdate | 退出SDR存储库更新模式 |
| RunSDRInitAgent | 运行SDR初始化代理 |
SEL 接口(NetFn 0x0A)
| 方法 | 描述 |
|---|---|
| GetSelInfo | 获取SEL信息 |
| GetSelAllocInfo | 获取SEL分配信息 |
| GetSelReserveId | 获取SEL预约ID |
| GetSelEntry | 获取SEL条目 |
| AddSelEntry | 添加SEL条目 |
| DeleteSelEntry | 删除SEL条目 |
| ClearSel | 清除SEL |
OEM 扩展接口
| 方法 | NetFn/Cmd | 描述 |
|---|---|---|
| OEMGetSystemSel | 0x30/0x91 | 查询系统健康事件(BMC内部使用),SubCmd 0x09 |
| OEMGetSystemSel2 | 0x30/0x90 | 查询系统健康事件(DFT),SubCmd 0x2B |
| SetBMCEnables | 0x06/0x2E | 设置BMC全局启用 |
| GetBMCEnables | 0x06/0x2F | 获取BMC全局启用 |
| SetBIOSEventData | 0x30/0x92 | 设置BIOS事件数据,SubCmd 0x05 |
| GetDeviceLocatorRecordId | 0x2C/0x0D | 获取设备定位器记录ID(PICMG) |
| GetTemperatureReadings | 0x2C/0x10 | 获取温度读数(PICMG) |
配置介绍
传感器配置需要一定程度上参照 IPMI标准规范协议官方文档
实体资源配置
传感器实体资源,表征当前的传感器依赖或者所属的硬件的实体描述,该实体的在位状态或者上下电状态会影响当前传感器的值以及状态,还有对应传感器事件 IPMI SEL 的生成状态。属性定义见「对外接口-Entity 实体」,另有多 Host 扩展属性:BelongsToSystem(bool,是否归属单一系统,默认 false 公共对象,SystemId 取 0)。
配置关键点: 实体资源在 CSR 中配置 Id/Instance/Name 等关键属性;在位/上下电信号来源与对应组件(如 Fru/FruCtrl)关联,影响传感器读值与 SEL 事件生成。
实际 CSR 配置示例:
"Entity_GPUCard": {
"Id": 11,
"Name": "GPUCard",
"PowerState": 1,
"Presence": 1,
"Instance": 101
}连续型传感器配置
属性定义见「对外接口-ThresholdSensor 门限传感器」,此处补充 CSR 关键点:
- 传感器原始读值
Reading需填写一个默认值,用于数据源未更新时显示,需在门限之内防止产生 SEL 事件。 - 线性计算相关配置(
Linearization/M/MT/B/BA/Accuracy/RBExp/Analog)来自 IPMI 规范 36.3,用于计算传感器读值系数。 - 当
Linearization配置 0x70-0x7f 时,需配置OriginalReading属性配合Reading(固定配置 170)计算传感器读数系数以提升读值精度。 - 传感器编号
SensorNumber默认 255 由 BMC 自行生成;特殊编号需在传感器定制化中定制(BMC 正常运行时插入的部件传感器不支持定制)。 - 多 Host 扩展属性:
BelongsToSystem(bool)、IsValid(bool,多 host 下判断对象是否生效)。
实际 CSR 配置示例:
"ThresholdSensor_VA1AGPUTemp": {
"OwnerId": 32,
"OwnerLun": 0,
"EntityId": "<=/Entity_GPUCard.Id",
"EntityInstance": "<=/Entity_GPUCard.Instance",
"Capabilities": 232,
"SensorType": 1,
"ReadingType": 1,
"SensorName": "GPU${Slot} Temp",
"NominalReading": 25,
"MaximumReading": 127,
"ReadingMask": 2056,
"Reading": "<=/Scanner_GPUTemp.Value |> expr($1 // 25600)",
"SensorNumber": 255,
"UpperNoncritical": 85,
"PositiveHysteresis": 2,
"NegativeHysteresis": 2
}离散型传感器配置
属性定义见「对外接口-DiscreteSensor 离散传感器」。
配置关键点: 离散传感器需关联对应的离散事件(DiscreteEvent)来产生 IPMI SEL;健康状态与 SEL 事件状态体现在 DiscreteSensorDisplay 接口的 Health 与 AssertStatus 属性上。
实际 CSR 配置示例:
"DiscreteSensor_SelStatus": {
"OwnerId": 32,
"OwnerLun": 0,
"EntityId": "<=/Entity_MainBoard.Id",
"EntityInstance": "<=/Entity_MainBoard.Instance",
"Capabilities": 64,
"SensorType": 16,
"ReadingType": 111,
"SensorName": "SEL Status",
"AssertMask": 52,
"DeassertMask": 32,
"DiscreteMask": 36,
"Reading": 0
}离散事件配置
离散事件配置用于表征离散传感器的事件产生与恢复逻辑。属性定义见「对外接口-DiscreteEvent 离散事件」,其类属性(CSR 配置)为 ListenType/EventData1-3/Conversion/InvalidReadingIgnore/InvalidReading/Severity。
实际 CSR 配置示例:
"DiscreteEvent_OperateLogFull": {
"Property": "<=/LogServices_1.OperationLogAlmostFull",
"ListenType": 1,
"EventData1": 8,
"EventData2": 255,
"EventData3": 255,
"EventDir": "<=/LogServices_1.OperationLogAlmostFull",
"Conversion": 0,
"SensorObject": "#/DiscreteSensor_OperateLogFull",
"InvalidReadingIgnore": 1,
"InvalidReading": 255
}SEL 相关配置
SEL 记录模式与查询上限等通过 SensorSelInfo 对象的类属性配置:
| 属性名称 | 属性类型 | 取值范围 | 属性说明 |
|---|---|---|---|
| CurRecordId | uint16 | 0-65535 | 持久化复位之前记录的RecordId,默认0 |
| QueryMaxCount | uint16 | 0-65535 | SEL 支持 IPMI 查询的最大记录数,默认 2000 |
| AddTimestamp | uint32 | 0-4294967295 | SEL 添加的时间戳,默认 0xFFFFFFFF |
| DelTimestamp | uint32 | 0-4294967295 | SEL 删除的时间戳,默认 0xFFFFFFFF |
| ReceiverAddr | uint8 | 0-255 | 接收sensor事件上报的地址,默认 0xFF |
| Id | uint8 | 0-255 | 持久化数据主键,无实际意义,采用默认值配置 |
| PlatformEventForwardEnable | bool | true/false | 平台事件转发使能开关:开启后 sensor 模块收到节点板平台事件时通过信号 EventReportSignal 转发给管理组件(产业组件)消费;关闭则仅记录 SEL 不转发 |
持久化表
sensor_mgmt 通过以下持久化表保存传感器与 SEL 相关配置与数据:
| 表名 | 数据表 | 说明 |
|---|---|---|
| IpmiSelDesc | t_ipmi_sel_descs | IPMI SEL 事件描述配置,按传感器类型、读值类型与 SelData 匹配,含事件等级、描述与屏蔽标识(掉电持久化) |
| IpmiSelFilter | t_ipmi_sel_filters | IPMI SEL 事件过滤配置,按传感器类型与读值类型匹配(掉电持久化) |
| IpmiSelList | t_ipmi_sel_list | SEL 事件记录列表 |
| IpmiSelListDump | t_ipmi_sel_list_dump | SEL 事件导出缓存 |
| SelMsgList | t_sel_msg_list | SEL 上报消息列表(复位持久化) |
| PersistProperty | t_persist_property | 持久化属性 |
| IpmiPefConfig | t_pef_config | PEF 配置 |
| IpmiPefControl | t_pef_control | PEF 控制 |
| IpmiPefFilter | t_pef_filter | PEF 过滤 |
| IpmiPefAlertFilter | t_pef_alert_filter | PEF 告警过滤 |
| IpmiPefAlertString | t_pef_alert_string | PEF 告警字符串 |
| MCDLSDR | t_mcdl_sdr | MCDL SDR 数据 |
| DEASDR | t_dea_sdr | DEA SDR 数据 |
| BMCEnables | t_bmc_enables | BMC 全局使能配置 |
| BootError | t_boot_error | BIOS 上报事件持久化 |
问题定界指南
典型问题定界
| 现象描述 | 是否为本组件问题 | 判断依据 | 关键证据收集方法 |
|---|---|---|---|
| 传感器读值异常/无读值 | 是 | 数据源订阅或配置问题 | 查 /var/log/sensor.log 注册记录、资源树属性 Reading;ipmitool raw 0x04 0x2d <num> 查读数 |
| SEL 事件未产生 | 是 | 门限/事件配置或事件掩码问题 | 查 AssertMask/DeassertMask、门限值与迟滞;MockSensor 复现 |
| SEL 查询为空 | 是 | SEL 记录为空或查询参数错误 | ipmitool sel list、GetSel 分页查询;检查 QueryMaxCount |
| 传感器健康状态与预期不符 | 是 | 事件/实体联动问题 | 查 Entity 在位/上下电状态、Health 属性 |
| 传感器注册信息丢失 | 是 | 注册信息 dump 缓冲问题 | 查 /var/log/sensor.log(注册 dump 5s 后落盘) |
| 服务无法启动 | 是 | 数据库损坏或依赖未就绪 | journalctl -u sensor_mgmt.service;检查 /data/opt/bmc/persistence.local/sensor.db |
| 平台事件未转发到 bmc_health | 否(跨组件) | PlatformEventForwardEnable 开关或订阅端问题 | 查开关配置与 bmc_health 侧 EventReportSignal 订阅日志 |
错误码速查表
资源协作接口错误(sensor_error_map)
| 错误码 | 错误名称 | 触发条件 |
|---|---|---|
| ERR_INVALID_MOCK_NAME (103) | InvalidSensorName | MockSensor 指定传感器不存在 |
| ERR_INVALID_MOCK_VALUE (104) | InvalidSensorValue | MockSensor 值非数字 |
| ERR_INVALID_MOCK_FAILED (105) | SensorTestFailed | 模拟失败 |
| ERR_INVALID_ENABLE_FAILED (106) | SensorEnableFailed | 使能/禁用失败 |
| ERR_INVALID_NOT_SUPPORTED (107) | SensorNotSupported | 门限传感器不支持状态设置 |
| ERR_INVALID_PATH (15) | InvalidPath | 路径非法 |
| DUPLICATE_EXPORTING_ERR (16) | DuplicateExportingErr | 重复导出 |
| PROPERTY_VALUE_FORMAT_ERROR (17) | PropertyValueFormatError | 属性值格式错误 |
| ERR_UNSPECIFIED (12) | UnspecifiedError | 未知错误 |
IPMI 完成码(与 custom.json 的 IpmiCompletionCode 对齐)
IPMI 命令的完成码由 mdb_interface 的 custom.json 定义,sensor_mgmt 通过错误引擎(ipmi_error_map 映射到错误名)在运行时解析得到。下表为各错误码对应的完成码。
| 错误码 | IPMI 完成码 | 含义 |
|---|---|---|
| ERR_INVALID_ID (1) | 0xCB | 请求的传感器、数据或记录不存在 |
| ERR_INVALID_FIELD (2) | 0xCC | 请求中的无效数据字段 |
| ERR_CANNOT_RESPONSE (3) | 0xCE | 命令响应无法提供 |
| ERR_ILLEGAL (4) | 0xCD | 对指定传感器或记录类型非法 |
| ERR_INVALID_RSVID (5) | 0xC5 | 预留取消或无效预留 ID |
| ERR_SEL_ERASED (6) | 0x81 | SEL 擦除进行中 |
| ERR_CANNOT_SUPPORT (7) | 0xD5 | 无法执行命令 |
| ERR_OUT_OF_RANGE (8) | 0xC9 | 参数超出范围 |
| ERR_LENGTH_LARGE (9) | 0xC8 | 请求数据字段长度超限 |
| ERR_SDR_IN_UPDATE_MODE (10) | 0xD0 | SDR 存储库更新中 |
| ERR_OUT_OF_SPACE (11) | 0xC4 | 空间不足 |
| ERR_UNSPECIFIED (12) | 0xFF | 未指定错误 |
| ERR_INVALID_CMD (13) | 0xC1 | 无效命令 |
| ERR_DES_UNAVAILABLE (14) | 0xD3 | 目的不可达 |
| ERR_INVALID_LENGTH (18) | 0xC7 | 请求数据长度无效 |
| ERR_PEF_CANNOT_SUPPORT (100) | 0x80 | 无法执行命令,参数不支持 |
| ERR_PEF_IN_PROGRESS (101) | 0x81 | 无法执行命令,设置进行中 |
| ERR_PEF_READONLY (102) | 0x82 | 无法执行命令,参数只读 |
调试方法
开启调试日志
sensor_mgmt 使用 libmcpp 日志框架,配置文件 config.json(logging 默认 level=notice),日志写到 sensor_file appender。
# 查看服务运行日志
journalctl -u sensor_mgmt.service -f
# 查看传感器注册 dump(注册信息在启动后约 5s 落盘)
cat /var/log/sensor.log
# 复现:MockSensor 模拟读值验证事件联动,或调用 GetSel/GetThresholdSensorList 查询IPMI 复现方法
# 查 SEL 信息
ipmitool raw 0x0a 0x40
# 查传感器读数
ipmitool raw 0x04 0x2d <sensor_number>
# 查传感器类型
ipmitool raw 0x04 0x2f <sensor_number>
# 清 SEL(需预留 ID,先 0x0a 0x42 获取)
ipmitool sel clear日志说明
一键日志收集
一键日志收集(AppDump/日志导出)涉及 sensor_mgmt 的日志文件如下:
| 文件路径 | 内容说明 |
|---|---|
/var/log/sensor.log | 传感器/实体/SDR/事件/PEF 注册 dump(启动约 5s 后落盘,格式 [时间] xxx is registered) |
| journald / syslog(sensor 模块) | 运行日志:sensor init_mgr、migrate: ... ok、db journal_mode set to PERSIST 等 |
/data/opt/bmc/persistence.local/sensor.db | 持久化数据库:SEL 列表、SDR、PEF 配置、BMC 使能、BootError 等 |
/opt/bmc/pram/persistence.local/sensor.db | 复位持久化数据库(掉电/复位保留数据) |
关键日志信息
| 日志片段 | 级别 | 含义解读 | 建议处理动作 |
|---|---|---|---|
sensor init_mgr | INFO | 服务初始化完成 | 无需处理 |
sensor %s of host %d is registered, number is %d. | INFO | 传感器注册成功(写入 /var/log/sensor.log) | 校验传感器是否按 CSR 注册 |
Entity [%s] of host %d is registered | INFO | 实体注册成功 | 无需处理 |
threshold sdr %s of host %d is registered. | INFO | SDR 注册成功 | 无需处理 |
migrate: ${desc} failed: ${err} | ERROR | 数据库迁移失败 | 收集日志与数据库反馈 |
local db is incompatible and remove it. err: ${err} | INFO | 本地数据库不兼容被删除重建 | 确认数据可丢失后继续 |
open file[sensor.log] failed while dumping register info | ERROR | 注册信息无法落盘 | 检查 /var/log 可写性与空间 |
insert pef config failed:${err} | ERROR | PEF 配置落库失败 | 检查数据库 |
ipmi_error_map: unknown error code ... | ERROR | IPMI 错误码映射缺失 | 收集日志反馈 |
FAQ
Q1:传感器读值为空或异常?
一句话答案: 检查数据源订阅、CSR 配置与注册记录。
根因: 传感器读值引用数据源(如 Fru/FruCtrl/Scanner)同步;数据源未就绪或 CSR 配置缺失会导致读值异常。
解决方案: ① 查 /var/log/sensor.log 注册记录确认传感器是否注册;② 校验 CSR 配置属性名;③ ipmitool raw 0x04 0x2d <num> 验证读值。
适用版本: 全版本。
Q2:MockSensor 报 InvalidSensorName?
一句话答案: 指定名称的传感器未注册,检查传感器名称。
根因: MockSensor 需精确匹配已注册的阈值/离散传感器 SensorName。
解决方案: 先用 GetThresholdSensorList/GetDiscreteSensorList 查询正确名称。
适用版本: sensor_mgmt 0.0.113 及以上。
Q3:SEL 事件未产生?
一句话答案: 检查门限/事件配置、事件掩码与迟滞量。
根因: 连续传感器需读值超出(含迟滞调整后的)门限且 AssertMask 置位才产生事件;离散传感器需离散事件方向变化。
解决方案: 用 MockSensor 模拟边界值复现;检查 AssertMask/DeassertMask、门限值与迟滞配置。
适用版本: 全版本。
Q4:平台事件没有转发到 bmc_health?
一句话答案: 检查 PlatformEventForwardEnable 开关与 bmc_health 订阅。
根因: 开关关闭时仅记录 SEL 不转发;或 bmc_health 侧 EventReportSignal 订阅异常。
解决方案: ① 置 PlatformEventForwardEnable=true;② 检查 bmc_health 订阅日志与信号签名(a{sv}a{sv})。
适用版本: 全版本。
Q5:服务启动失败或数据库异常?
一句话答案: 检查数据库文件与依赖服务(framework/dbus)。
根因: 数据库损坏或不兼容、journal_mode 设置失败、依赖服务未就绪导致启动失败。
解决方案: ① journalctl -u sensor_mgmt.service 定位;② 数据库不兼容时组件会自动删除重建;③ 确认 framework/dbus 服务已就绪。
适用版本: 全版本。