传感器管理常见问题指南
更新时间: 2025/12/15
在Gitcode上查看源码

[TOC]

Q001:如何查询传感器列表?

A: 可通过以下 4 种方式查询传感器 1、Web iBMC Web 提供了门限传感器查询。Web 登录 iBMC 后,【系统管理】 -> 【系统信息】-> 【传感器】,即可查询当前的门限传感器。 2、IPMI iBMC 支持 IPMI 命令查询所有传感器。可通过带内与带外的方式查询,命令为 sensor list

  • 带内查询: ipmitool sensor list
  • 带外查询: ipmitool -I lanplus -H <host> -p 623 -U <username> -P <password> -C 17 sensor list3、CLI iBMC 支持 CLI 命令查询所有传感器。SSH 登录 iBMC 后执行命令 ipmcget -t sensor -d list4、redfish iBMC 支持 redfish 接口查询。通过 get 请求分别查询门限传感器离散传感器
  • 门限传感器 uri:redfish/v1/Chassis/:chassisid/ThresholdSensors
  • 离散传感器 uri:redfish/v1/Chassis/:chassisid/DiscreteSensors

Q002:传感器模块有哪些接口?

1、busctl接口

  • GetThresholdSensorList 获取连续传感器列表
c
busctl --user call bmc.kepler.sensor /bmc/kepler/Systems/1/Sensors bmc.kepler.Systems.Sensors GetThresholdSensorList a{ss} 3 Interface cli UserName Administrator ClientAddr 127.0.0.1
  • GetSensorList 获取所有传感器列表
c
busctl --user call bmc.kepler.sensor /bmc/kepler/Systems/1/Sensors bmc.kepler.Systems.Sensors GetSensorList a{ss} 3 Interface cli UserName Administrator ClientAddr 127.0.0.1
  • MockSensor 模拟传感器
参数名称参数签名参数解释
Enabledy使能模拟:1 = 开启模拟; 0 = 关闭模拟
SensorNames传感器名称
Values传感器读数,stop 表示停止模拟
c
busctl --user call bmc.kepler.sensor /bmc/kepler/Systems/1/Sensors bmc.kepler.Systems.Sensors MockSensor a{ss}yss 3 Interface cli UserName Administrator ClientAddr 127.0.0.1 1 '1711 Core Temp' 100
busctl --user call bmc.kepler.sensor /bmc/kepler/Systems/1/Sensors bmc.kepler.Systems.Sensors MockSensor a{ss}yss 3 Interface cli UserName Administrator ClientAddr 127.0.0.1 1 '1711 Core Temp' stop
  • SetSensorStatus 设置传感器使能
参数名称参数签名参数解释
SensorNames传感器名称
Statuss使能状态:enabled; disabled
c
busctl --user call bmc.kepler.sensor /bmc/kepler/Chassis/1/Sensors bmc.kepler.Chassis.Sensors SetSensorStatus a{ss}ss 3 Interface cli UserName Administrator ClientAddr 127.0.0.1 'Power Button' 'disabled'

Q003:门限传感器配置的原始值(Reading)如何转换到读值(ReadingDisplay)的?

A: 门限传感器的原始值到读值通过公式进行转换,具体如下。 1、转换公式涉及的属性

属性名称属性类型属性说明
Linearizationuint8传感器计算表达式
[7] - 保留字段
[6:0] - 公式
  00h-0bh:enum(linear, ln, log10, log2, ...)
  70h:non-linear
最常用线性表达式,配置为0x00
Muint8[7:0] - M(有符号,二补数),共10-bit,低8-bit
MTuint8[7:6] - M(有符号,二补数),共10-bit,高2-bit
[5:0] - 容差(无符号),共6-bit
Buint8[7:0] - B(有符号,二补数),共10-bit,低8-bit
BAuint8[7:6] - B(有符号,二补数),共10-bit,高2-bit
[5:0] - 精度(无符号),共10-bit,低6-bit
Accuracyuint8[7:4] - 精度(无符号),共10-bit,高4-bit
[3:2] - 精度指数(无符号),共2-bit
[1:0] - 传感器方向
RBExpuint8[7:4] - RExp(K2,有符号,二补数),共4-bit
[3:0] - BExp(K1,有符号,二补数),共4-bit
Readinguint8传感器原始值
2、计算公式
• 二补数:即补码,也就是需要先将属性值转化为有符号数
• 按以下计算公式,将原始值转换成读值
temp = (M * x + B * 10K1) * 10K2
y = L(temp)
如下示例:
M = 100,B = 3,K1 = 2,K2 = -2,ori_v = 200
L = 0x00 (线性表达式,计算出来是多少即是多少)
计算结果为:y = (100 * ori_v + 3 * 100) * 0.01 = ori_v + 3 = 203

Q004:门限传感器读值状态(ReadingStatus)定义及转换?

1、读值状态与Scanner的Status属性取值的含义对应

读值状态取值状态含义
SCAN_NORMAL0扫描正常
SCAN_FAILURE1扫描失败,连续持续N(可配置)个防抖周期均失败
失败之后传感器会禁用状态,并且上报SEL
SCAN_PRE_FAILURE2扫描预失败,一般为一个防抖周期,全部失败则为失败
失败之后传感器会禁用状态
SCAN_NOT_ACCESSIBLE3扫描不可访问,扫描的对象器件不支持扫描
比如:掉电、状态更新中、读值为NA
SCAN_NOT_SCANNED4初始未扫描状态
2、可支持的读值状态之间的转换及转换条件
当前状态变化状态转换条件
------------
02一次读取失败
03ScanEnable值由1->0
10连续M次读取成功
13ScanEnable值由1->0
20一次读取成功
21连续N次读取失败
23ScanEnable值由1->0
30ScanEnable值由0->1且下一次读取成功
32ScanEnable值由0->1且下一次读取失败

Q005:北向查看连续传感器,状态(status)与当前值(value)的关系?

A: 状态(status)当前值(value) 的关系如下 1、传感器处于禁止扫描或者扫描异常的状态

当前值(value)状态(status)
nana
确认具体为禁止扫描或者扫描异常以及其原因,见Q006
2、传感器处于使能扫描的状态
当前值(value)状态(status)
--------
为具体传感器的读值,且不满足任何门限值ok
为具体传感器的读值,且满足一般门限值nc
为具体传感器的读值,且满足严重门限值cr
为具体传感器的读值,且满足紧急门限值nr

Q006:确认连续传感器是否为禁止扫描或扫描异常?

1、传感器禁止扫描 查看该连续传感器的资源树属性Status,若为Disabled,则传感器当前为禁止扫描。禁止扫描状态与以下因素有关,具体对应关系见Q007 (1)与传感器关联的Entity的在位和上电状态相关(绝大多数是该原因) (2)通过IPMI或CLI接口主动变更传感器使能状态 2、传感器扫描异常 查看该连续传感器的资源树属性ReadingStatus,若其值非0(normal),则表示扫描异常。该属性配置自CSR,要确认扫描异常的原因,则确认配置的数据源的值

Q007: 组件内部管理的状态 self.sensor_status 以及与传感器状态(Status)的关系?通过什么方式可以获取 self.sensor_status 的内容取值?

1、self.sensor_status 为 U8 类型变量,每一位代表一个状态disable_scanning/disable_all/disable_scanning_local/disable_access_error:0 = disabled; 1 = enableddisable_override: 0 = false; 1 = trueinitial_update_progress:0 = update in progress; 1 = update end

状态变更条件
disable_scanning只能通过 IPMI 或 CLI 命令变更使能状态,与 disable_all 同步更改
disable_all只能通过 IPMI 或 CLI 命令变更使能状态,与 disable_scanning 同步更改
disable_scanning_local与传感器关联的 Entity 相关
`Entity 不在位
disable_override默认为 false,当 disable_scanning 和 disable_all 被更改时,置为 true
disable_access_error与读值状态相关
SCAN_FAILURE(1)/SCAN_PRE_FAILURE(2):disabled
SCAN_NORMAL(0)/SCAN_NOT_ACCESSIBLE(3)/SCAN_NOT_SCANNED(4):enabled
initial_update_progress与读值状态相关
SCAN_NOT_ACCESSIBLE(3)/SCAN_NOT_SCANNED(4):update in progress
SCAN_NORMAL(0)/SCAN_FAILURE(1)/SCAN_PRE_FAILURE(2):update end
auto_re_arm默认为 0, 暂无使用
ignore_if_disable默认为 0, 暂无使用
2、与传感器状态(Status)的关系
self.sensor_status传感器状态
--------
默认Enabled
disable_scanning == disabled or
disable_all == disabledor
disable_scanning_local == disabled
Disabled
3、获取 self.sensor_status 的取值
由于该状态为组件内部管理的变量,因此正常情况无法获知其具体取值,但我们也有特殊途径可以获知,比如 IPMI 命令
GetSensorEventStatus
0x04 0x2B <sensor number>
关注返回体中除 CompletionCode 外的第一个返回值的高三位
bit7:取值即 disable_all 的取值
bit6:取值即 disable_scanning 的取值
bit5:取值取反即 disable_scanning_local 的取值

GetSensorReading0x04 0x2D <sensor number>

关注返回体中除 CompletionCode 外的第二个返回值的高三位
bit7:取值即 disable_all 的取值
bit6:取值即 disable_scanning 的取值
bit5:取值为 1,表示 disable_scanning_local == disabled or disable_access_error == disabled or initial_update_progress == update in progress

Q008: AssertMask、DeassertMask、ReadingMask分别的作用?

属性名称属性说明
AssertMask
DeassertMask
ReadingMask
三种Mask的置位一定是匹配的。
1、AssertMask
当且仅当对应掩码置位时,满足对应的门限值才会更新传感器状态(见Q004)及上报事件。
2、DeassertMask
当且仅当对应掩码置位时,才可恢复对应事件。
3、ReadingMask
当前仅当对应掩码置位时,北向才可显示对应门限值。

Q009:清除sel日志,v3与v2的差异?

ipmcset -d sel -v clear 清除event • ipmitool sel clear 清除sensor和event v2:两条命令无差异,会同时清除 系统事件(属于event) 和 ipmi sel(属于sensor) v3:cli命令属于event,只清除系统事件,会记录一条 iBMC event records are cleared 的系统事件;ipmi命令属于sensor,只清除ipmi sel,会记录一条 SEL log area is cleared 的ipmi sel。

Q010:ipmi sel事件数据库是如何更新的?

Q011:如何解析sdr二进制文件以及解读sdr信息?

1、解析sdr二进制文件 先通过以下脚本将二进制文件转为可读的十进制文本

python
with open('sdr_info.txt', 'rb') as binary_file:
    with open('sdr_parsed.txt', 'w') as decimal_file:
        byte = binary_file.read(1)
        while byte:
            decimal = int.from_bytes(byte, byteorder='big')
            decimal_file.write(str(decimal) + ' ')
            byte = binary_file.read(1)

解析结果如下

Q012:定制了传感器名称后,传感器名字不符合预期?

1、确认当前环境是否定制为目标定制厂商 如Baidu定制组件将ACPI State传感器名称定制为ACPI_State,通过如下mdbctl命令查看当前环境是否已定制为Baidu

~ ~ $ mdbctl getprop Package_0 bmc.kepler.Managers.Package Customer
"Baidu"

2、检查定制组件的版本,确认该版本是否包含相应传感器定制配置 如Baidu定制组件将ACPI State传感器名称定制为ACPI_State,该配置实现在1.0.10版本,需确认当前环境上的组件版本是否高于该版本 3、检查启动阶段csr加载时,是否加载了定制相应传感器名称的csr文件 如Baidu定制组件将ACPI State传感器名称定制为ACPI_State,配置该定制传感器名称的csr文件为xxx_cust.sr,对应原csr文件为xxx.sr。当加载xxx.sr时预期会检查是否存在xxx_cust.sr文件,若存在则会进行加载。 在/var/log/framework.log日志中过滤hwdiscovery确认是否加载了xxx_cust.sr

Q013:Mngmnt Health传感器事件,如何确定是哪个传感器问题?

Mngmnt Health传感器事件是一个汇总信息,当某个传感器出现扫描异常(根本触发点为ReadingStatus属性值为1)时,该传感器会触发出Mngmnt Health传感器事件。以下为如何确定具体是哪个传感器扫描异常的定位流程 1、通过产生事件相应时间的日志或者sensor.db直接看事件原始数据,从中确定SelData2SelData3的取值,进一步确定传感器编号 这里分两种情况: (1)若SelData3取值为255,则为支持“传感器数量超出255限制”之前,那么SelData2就是扫描异常的传感器的编号 (2)若SelData3取值不为255,则为支持“传感器数量超出255限制”之前,那么扫描异常的传感器编号需要根据SelData2SelData3共同确定 SelData3 = 0:传感器编号为SelData2SelData3 = 1:传感器编号为SelData2 + 255SelData3 = 3:传感器编号为SelData2 + 5102、通过传感器编号,定位到具体是哪个传感器需要注意,传感器编号是动态分配的,也即bmc复位之后同一个传感器的编号可能会发生变化,所以需要确定产生事件当时的传感器编号 通过传感器的注册记录查看,5.5版本看AppDump/sensor/registered.txt(该版本仅记录最新一次的注册日志,若产生事件时间早于此次注册,则无法定位到是什么传感器扫描异常),5.8及以后版本看LogDump/sensor.log3、定位到传感器之后,则分析csr中传感器配置,确定ReadingStatus在什么场景下为1即可

Q014:北向接口传感器值不显示,可能是什么原因?

1. 北向接口传感器的值直接受本传感器的ReadingStatus属性及Status属性影响,查看ReadingStatus值是否非0或Status是否为Disabled,在这两种情况下传感器不会显示出读值。 2. ReadingStatus值完全来源于csr配置,若ReadingStatus值非0,则通过csr配置进行分析其值非0的原因。 3. Status的取值来源于传感器关联的Entity,若传感器的Capabilities属性的bit7配置为1,如下图所示,则表示传感器会受到Entity失效影响会被禁止。 因此当Entity的PowerStatePresence属性为0,则Entity失效,会进一步导致传感器Status为Disabled。

Q015:直接发送GetSDR(0xa 0x23)命令为什么响应失败?

失败报错如下所示: 1. GetSDR的请求消息中包含reserve id,需要先另外发送GetSDRReserveId获取当前的reserve id 2.GetSDRReserveId的响应放到GetSDR的请求消息的对应位置后,可发送成功