代码仓
中
sensor_mgmt
更新时间: 2026/11/05
在AtomGit上查看源码

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/PEFSDR 存储库管理与 PEF 平台事件过滤告警
资源协作接口ThresholdSensor/DiscreteSensor/Entity/DiscreteEvent/Sensors/SensorSelInfo/BootError
IPMI 接口NetFn 0x04(传感器/PEF)、0x0A(SDR/SEL)、OEM 0x30/0x2C

术语解释 ​

术语解释
门限型传感器(ThresholdSensor)读值为连续量的传感器,与 6 个门限值比较产生/恢复事件
离散型传感器(DiscreteSensor)读值为离散量的传感器,关联离散事件产生事件
Entity传感器依赖/所属的硬件实体,在位/上下电状态影响传感器与 SEL
SELSystem Event Log,系统事件日志,按 IPMI 规范记录
SDRSensor Data Record,传感器数据记录,描述传感器能力与配置
PEFPlatform Event Filtering,平台事件过滤,对平台事件执行告警等动作
Assert/DeassertSEL 事件方向:产生/恢复

外部系统交互边界 ​

说明:sensor_mgmt 订阅 Fru/FruCtrl/Frus 等外部接口获取部件在位与上下电状态,作为传感器读值与 SEL 事件生成的数据源;平台事件通过信号转发给 bmc_health 等管理组件。

功能简介 ​

传感器主要用于监测如 CPU、内存、硬盘、风扇、电源、卡等部件的信息,如部件在位、温度、电压、风扇转速等信息,并相应记录 IPMI SEL 以及通过传感器健康状态进行表征,以此达到监管部件的运行状态及健康状况的目的。

关键特性 ​

门限型传感器 ​

门限传感器又叫做连续性传感器,表征传感器的值是连续变化的(对比了解:数学中的连续值/曲线),如:温度、电压、功耗、转速等。通过门限传感器可描述性资源表征传感器的运行状态和健康状况。

关联类:ThresholdSensor

门限型传感器可描述资源 ​

门限传感器可描述资源均使用 ThresholdSensorDisplay 类来进行表示,该类不需要 CSR 配置,由 sensor 组件进行解析和完成资源协作接口注册。

属性名称属性类型读写取值范围属性说明
UpperNonrecoverableDisplaystringRONA传感器紧急门限上限可读描述,精度3位有效数字
UpperCriticalDisplaystringRONA传感器严重门限上限可读描述,精度3位有效数字
UpperNoncriticalDisplaystringRONA传感器一般门限上限可读描述,精度3位有效数字
LowerNonrecoverableDisplaystringRONA传感器紧急门限下限可读描述,精度3位有效数字
LowerNoncriticalDisplaystringRONA传感器一般门限下限可读描述,精度3位有效数字
LowerCriticalDisplaystringRONA传感器严重门限下限可读描述,精度3位有效数字
PositiveHysteresisDisplaystringRONA传感器正向迟滞量可读描述,精度3位有效数字
NegativeHysteresisDisplaystringRONA传感器负向迟滞量可读描述,精度3位有效数字
ReadingDisplaystringRWNA传感器读值可读描述,精度3位有效数字
UnitDisplaystringRONA传感器单位可读描述
StatusstringROEnabled/Disabled/InTest/Starting传感器当前状态:Enabled:传感器使能;Disabled:传感器禁用;InTest:传感器测试中;Starting:传感器更新中
HealthstringROCritical/Major/Minor/OK传感器健康状态:Critical:紧急;Major:严重;Minor:一般;OK:正常
AssertStatusuint16RO0-65535传感器SEL事件状态,16进制的数,bit4 - bit15依次对应12种门限事件状态,1:Assert;0:Deassert

离散型传感器 ​

离散传感器,表征传感器的值是离散的(对比了解:数学中的离散值/曲线),如:运行状态,隔离值等。通过离散型传感器可描述性资源表征传感器的运行状态和健康状况。

关联类:DiscreteSensor

离散型传感器可描述资源 ​

离散型传感器可描述资源均使用 DiscreteSensorDisplay 类来进行表示,该类不需要 CSR 配置,由 sensor 组件进行解析和完成资源协作接口注册。

属性名称属性类型读写取值范围属性说明
StatusstringROEnabled/Disabled/InTest/Starting传感器当前状态:Enabled:传感器使能;Disabled:传感器禁用;InTest:传感器测试中;Starting:传感器更新中
HealthstringROCritical/Major/Minor/OK传感器健康状态:Critical:紧急;Major:严重;Minor:一般;OK:正常
AssertStatusuint16RO0-65535传感器SEL事件状态,bit0 - bit14依次对应15种offset的离散事件状态,1:Assert;0:Deassert

实体资源 Entity ​

传感器实体资源,表征当前传感器依赖或者所属的硬件的实体描述,该实体的在位状态或者上下电状态会影响当前传感器的值以及状态,还有对应传感器事件 IPMI SEL 的生成状态。

关联类:Entity

IPMI SEL ​

连续型传感器触发事件 ​

连续传感器的事件生成条件即:读值与 6 个门限值比较后是否满足产生或恢复事件的条件:

  1. 触发产生:AssertMask 置位、读值超出门限范围、且尚未产生事件 → 填充 SEL 信息落库并更新传感器健康状态;
  2. 触发恢复: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/:ID

  • Interface: bmc.kepler.Systems.ThresholdSensor

属性:

属性名称属性类型读写取值范围属性说明
EntityIduint8RO0-255传感器对应的实体,来自于IPMI规范,需要关联传感器对应的Entity.Id
EntityInstanceuint8RO0-255传感器对应的实体,来自于IPMI规范,需要关联传感器对应的Entity.Instance
SensorIdentifierstringRONA传感器标识
SensorNamestringRONA传感器对外显示名称
Capabilitiesuint8RO0-255传感器支持能力,来自于IPMI规范 43.1
SensorTypeuint8RO0-255传感器类型,来自于IPMI规范 42.2
ReadingMaskuint16RO0-65535传感器读值掩码,来自于IPMI规范 43.1
UpperNonrecoverableuint8RO0-255传感器紧急事件上限
UpperCriticaluint8RO0-255传感器严重事件上限
UpperNoncriticaluint8RO0-255传感器一般事件上限
LowerNonrecoverableuint8RO0-255传感器紧急事件下限
LowerNoncriticaluint8RO0-255传感器严重事件下限
LowerCriticaluint8RO0-255传感器一般事件下限
PositiveHysteresisuint8RO0-255传感器正向迟滞量
NegativeHysteresisuint8RO0-255传感器负向迟滞量
SensorNumberuint8RO0-255传感器编号,默认255,由BMC自行生成;特殊编号需在传感器定制化定制(BMC正常运行时插入的部件传感器不支持定制)
OwnerLunuint8RO0-255传感器的Lun,默认0
Readinguint8RO0-255传感器原始读值,引用传感器的数据源(如Scanner)读值同步,默认值需在门限之内,防止产生SEL事件
ReadingStatusuint8RO0-255传感器读值状态,默认0,引用数据源读值状态同步
OriginalReadingdoubleRONA传感器的原始值,当线性标志配置0x70-0x7f时,需要此属性配合Reading(固定配置170)计算传感器读数系数以提升读值精度

Display 接口:bmc.kepler.Systems.ThresholdSensorDisplay(属性见「门限型传感器可描述资源」)

DiscreteSensor 离散传感器 ​

  • Path: /bmc/kepler/Systems/:SystemId/DiscreteSensors/:ID

  • Interface: bmc.kepler.Systems.DiscreteSensor

属性:

属性名称属性类型读写取值范围属性说明
EntityIduint8RO0-255传感器对应的实体,需要关联传感器对应的Entity.Id
EntityInstanceuint8RO0-255传感器对应的实体,需要关联传感器对应的Entity.Instance
SensorIdentifierstringRONA传感器标识
OwnerIduint8RO0-255传感器归属标识,默认32(归属于BMC)
OwnerLunuint8RO0-255传感器的Lun,默认0
Capabilitiesuint8RO0-255传感器支持能力
SensorNamestringRONA传感器对外显示的名称

Display 接口:bmc.kepler.Systems.DiscreteSensorDisplay(属性见「离散型传感器可描述资源」)

Entity 实体 ​

  • Path: /bmc/kepler/Systems/:SystemId/Entities/:ID

  • Interface: bmc.kepler.Systems.Entity

属性:

属性名称属性类型读写取值范围属性说明
Iduint8RO0-255Entity Id,IPMI 规范 43.14
Instanceuint8RO0-255Entity Instance,默认值 96
Slotuint8RO0-255Entity所在的槽位号,默认 255
NamestringRONAEntity的名称
PowerStateuint8RO0-255Entity的上下电状态,关联对应的上下电信号来源
Presenceuint8RO0-255Entity的在位状态,关联对应的在位信号来源
Healthuint8RO0-255Entity的健康状态,不需要配置,默认值 0

DiscreteEvent 离散事件 ​

  • Path: /bmc/kepler/Systems/:SystemId/DiscreteEvents/:Id

  • Interface: bmc.kepler.Systems.DiscreteEvent

属性:

属性名称属性类型读写取值范围属性说明
Propertyuint32RO0-4294967295离散事件监听的属性,如果监听类型是组合侦听则代表 IPMI SEL 产生使用的数据和方向
EventDiruint8RO0-255离散事件产生的方向:0 - 恢复;其他 - 产生,当监听类型是独立侦听时使用
SensorObjectstringRONA离散事件关联的离散传感器,当IPMI SEL产生或者恢复时体现在当前传感器的健康状态以及SEL上

类属性(CSR 配置):

属性名称属性类型取值范围属性说明
ListenTypeuint80-1离散事件监听类型:1 - 独立侦听;0 - 组合侦听
EventData1uint80-255离散事件产生的数据1,独立侦听时使用,用来表征同一类型离散传感器不同的离散状态方向
EventData2uint80-255离散事件产生的数据2,独立侦听时使用
EventData3uint80-255离散事件产生的数据3,独立侦听时使用
Conversionuint80-255离散事件翻转标识,高4bit用来组合侦听时EventData1的掩码,低4bit用来表征是否翻转:1 - 翻转;其他 - 不翻转
InvalidReadingIgnoreuint80-255离散事件是否忽略无效值(1:是,0:否)
InvalidReadinguint80-255离散事件的无效值
Severityuint80-255离散事件的事件等级,默认255

Sensors 传感器集合 ​

  • Path: /bmc/kepler/Chassis/:ChassisId/Sensors

  • Interface: bmc.kepler.Chassis.Sensors

属性:

属性名称属性类型读写取值范围属性说明
HealthstringRONormal/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):传感器单位,具体的描述单位,比如RPM
  • SensorStatus(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-1
  • SensorName(string):模拟传感器的名称
  • Value(string):模拟传感器读值,stop 表示停止模拟

输出:

  • 无

异常与触发条件:

异常触发条件
抛错 InvalidSensorValueValue 不是合法数字(strtod 转换失败)
抛错 InvalidSensorName(sensor_error_map(ERR_INVALID_MOCK_NAME))指定名称的传感器不存在(阈值+离散均未匹配)
无异常传感器存在且 Value 合法

首发版本: sensor_mgmt 0.0.113(bmcsdk 25.x)

应用场景与限制条件:

  • 典型场景:测试环境模拟某传感器读值,验证门限事件、SEL、健康状态;Value=stop 停止模拟恢复真实读值。
  • 限制条件:仅支持已注册的传感器(阈值/离散);模拟值需为数字字符串;模拟期间传感器读值不随数据源更新。

调试示例:

text
# 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):传感器单位,具体的描述单位,比如RPM
  • SensorStatus(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。

调试示例:

text
# 禁用离散传感器
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)。

调试示例:

text
# 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
GetReportedSelStartId(uint64)、Count(uint16)Total、SelList(结构同 GetSel)获取上报事件,分页方式同 GetSel
ExportSelPath(string)TaskId(uint32)导出 SEL 到指定路径,返回任务 ID 拼接任务路径
DumpSDRDumpMode(string,LAN/BT)无将 SDR 数据 dump 为二进制文件
AddOemSelRecordType(uint8)、Timestamp(uint32)、ManufactureID(uint32)、SELDatas(string)RecordId(uint32)添加一条 OEM SEL
ClearSel无无清空所有 SEL 事件
ClearSensorSel无无清空传感器事件
SetThresholdsSensorName(string)、PersistenceType(uint8 0/1)、Attributes(Dictionary<ThresholdAttributeItem>)无设置门限传感器门限值;ThresholdAttributeItem 的 key 取 UpperNonrecoverable/UpperCritical/UpperNoncritical/LowerNonrecoverable/LowerNoncritical/LowerCritical,value 为 3 位小数数字字符串
GetSensorDetailParams(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):

字段类型说明
RecordIduint16SEL 记录在主表的逻辑序号(管理板分配,1 起递增)
SelTypeuint8SEL 记录类型,系统事件为 0x02
Timestampuint32管理板落库时的系统时间戳
GenerateIduint16生成方 ID:高字节=请求源地址(src_addr,定位源节点板),低字节=BMC Owner ID(0x20),即 (src_addr<<8)|0x20
SelMsgVersionuint8上报消息版本号
SensorTypeuint8IPMI 传感器类型
SensorNumberuint8传感器编号(在 GenerateId 高字节源板范围内唯一)
SelEventTypeuint8事件类型:bit7=方向(Assert/Deassert),bit0~6=事件类型
SelData1uint8事件数据 1
SelData2uint8事件数据 2
SelData3uint8事件数据 3

SensorSelInfo SEL 信息 ​

  • Path: /bmc/kepler/Chassis/:ChassisId/SensorSelInfo

  • Interface: bmc.kepler.Chassis.SensorSelInfo

属性:

属性名称属性类型读写取值范围属性说明
SelModeuint8RW0/1SEL 记录的模式:0:默认模式,记录达到最大数量后清空;1:记录达到最大数量后滚动。读权限 ReadOnly,写权限 BasicSetting
RecordSequint64RO0-18446744073709551615当前事件的序列号,随着事件产生无限递增
ReportedSelCountuint16RO0-65535SEL事件总数量

BootError 启动错误事件 ​

  • Path: /bmc/kepler/Systems/:SystemId/EventEntries/BootError

  • Interface: bmc.kepler.Systems.IPMIEvent

属性:

属性名称属性类型读写取值范围属性说明
SensorTypeuint8RO0-255IPMI 事件的传感器类型,默认30
ReadingTypeuint8RO0-255IPMI 事件的事件读值类型,复位持久化,事件类型来自于HOST侧上报,默认111
EventDatauint32RO0-4294967295IPMI 事件的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描述
OEMGetSystemSel0x30/0x91查询系统健康事件(BMC内部使用),SubCmd 0x09
OEMGetSystemSel20x30/0x90查询系统健康事件(DFT),SubCmd 0x2B
SetBMCEnables0x06/0x2E设置BMC全局启用
GetBMCEnables0x06/0x2F获取BMC全局启用
SetBIOSEventData0x30/0x92设置BIOS事件数据,SubCmd 0x05
GetDeviceLocatorRecordId0x2C/0x0D获取设备定位器记录ID(PICMG)
GetTemperatureReadings0x2C/0x10获取温度读数(PICMG)

配置介绍 ​

传感器配置需要一定程度上参照 IPMI标准规范协议官方文档

实体资源配置 ​

传感器实体资源,表征当前的传感器依赖或者所属的硬件的实体描述,该实体的在位状态或者上下电状态会影响当前传感器的值以及状态,还有对应传感器事件 IPMI SEL 的生成状态。属性定义见「对外接口-Entity 实体」,另有多 Host 扩展属性:BelongsToSystem(bool,是否归属单一系统,默认 false 公共对象,SystemId 取 0)。

配置关键点: 实体资源在 CSR 中配置 Id/Instance/Name 等关键属性;在位/上下电信号来源与对应组件(如 Fru/FruCtrl)关联,影响传感器读值与 SEL 事件生成。

实际 CSR 配置示例:

json
"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 配置示例:

json
"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 配置示例:

json
"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 配置示例:

json
"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 对象的类属性配置:

属性名称属性类型取值范围属性说明
CurRecordIduint160-65535持久化复位之前记录的RecordId,默认0
QueryMaxCountuint160-65535SEL 支持 IPMI 查询的最大记录数,默认 2000
AddTimestampuint320-4294967295SEL 添加的时间戳,默认 0xFFFFFFFF
DelTimestampuint320-4294967295SEL 删除的时间戳,默认 0xFFFFFFFF
ReceiverAddruint80-255接收sensor事件上报的地址,默认 0xFF
Iduint80-255持久化数据主键,无实际意义,采用默认值配置
PlatformEventForwardEnablebooltrue/false平台事件转发使能开关:开启后 sensor 模块收到节点板平台事件时通过信号 EventReportSignal 转发给管理组件(产业组件)消费;关闭则仅记录 SEL 不转发

持久化表 ​

sensor_mgmt 通过以下持久化表保存传感器与 SEL 相关配置与数据:

表名数据表说明
IpmiSelDesct_ipmi_sel_descsIPMI SEL 事件描述配置,按传感器类型、读值类型与 SelData 匹配,含事件等级、描述与屏蔽标识(掉电持久化)
IpmiSelFiltert_ipmi_sel_filtersIPMI SEL 事件过滤配置,按传感器类型与读值类型匹配(掉电持久化)
IpmiSelListt_ipmi_sel_listSEL 事件记录列表
IpmiSelListDumpt_ipmi_sel_list_dumpSEL 事件导出缓存
SelMsgListt_sel_msg_listSEL 上报消息列表(复位持久化)
PersistPropertyt_persist_property持久化属性
IpmiPefConfigt_pef_configPEF 配置
IpmiPefControlt_pef_controlPEF 控制
IpmiPefFiltert_pef_filterPEF 过滤
IpmiPefAlertFiltert_pef_alert_filterPEF 告警过滤
IpmiPefAlertStringt_pef_alert_stringPEF 告警字符串
MCDLSDRt_mcdl_sdrMCDL SDR 数据
DEASDRt_dea_sdrDEA SDR 数据
BMCEnablest_bmc_enablesBMC 全局使能配置
BootErrort_boot_errorBIOS 上报事件持久化

问题定界指南 ​

典型问题定界 ​

现象描述是否为本组件问题判断依据关键证据收集方法
传感器读值异常/无读值是数据源订阅或配置问题查 /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)InvalidSensorNameMockSensor 指定传感器不存在
ERR_INVALID_MOCK_VALUE (104)InvalidSensorValueMockSensor 值非数字
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)0x81SEL 擦除进行中
ERR_CANNOT_SUPPORT (7)0xD5无法执行命令
ERR_OUT_OF_RANGE (8)0xC9参数超出范围
ERR_LENGTH_LARGE (9)0xC8请求数据字段长度超限
ERR_SDR_IN_UPDATE_MODE (10)0xD0SDR 存储库更新中
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。

text
# 查看服务运行日志
journalctl -u sensor_mgmt.service -f

# 查看传感器注册 dump(注册信息在启动后约 5s 落盘)
cat /var/log/sensor.log

# 复现:MockSensor 模拟读值验证事件联动,或调用 GetSel/GetThresholdSensorList 查询

IPMI 复现方法 ​

text
# 查 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_mgrINFO服务初始化完成无需处理
sensor %s of host %d is registered, number is %d.INFO传感器注册成功(写入 /var/log/sensor.log)校验传感器是否按 CSR 注册
Entity [%s] of host %d is registeredINFO实体注册成功无需处理
threshold sdr %s of host %d is registered.INFOSDR 注册成功无需处理
migrate: ${desc} failed: ${err}ERROR数据库迁移失败收集日志与数据库反馈
local db is incompatible and remove it. err: ${err}INFO本地数据库不兼容被删除重建确认数据可丢失后继续
open file[sensor.log] failed while dumping register infoERROR注册信息无法落盘检查 /var/log 可写性与空间
insert pef config failed:${err}ERRORPEF 配置落库失败检查数据库
ipmi_error_map: unknown error code ...ERRORIPMI 错误码映射缺失收集日志反馈

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 服务已就绪。

适用版本: 全版本。