[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 list。 4、redfish iBMC 支持 redfish 接口查询。通过 get 请求分别查询门限传感器和离散传感器。 - 门限传感器 uri:
redfish/v1/Chassis/:chassisid/ThresholdSensors - 离散传感器 uri:
redfish/v1/Chassis/:chassisid/DiscreteSensors
Q002:传感器模块有哪些接口?
1、busctl接口
- GetThresholdSensorList 获取连续传感器列表
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 获取所有传感器列表
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 模拟传感器
| 参数名称 | 参数签名 | 参数解释 |
|---|---|---|
| Enabled | y | 使能模拟:1 = 开启模拟; 0 = 关闭模拟 |
| SensorName | s | 传感器名称 |
| Value | s | 传感器读数,stop 表示停止模拟 |
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 设置传感器使能
| 参数名称 | 参数签名 | 参数解释 |
|---|---|---|
| SensorName | s | 传感器名称 |
| Status | s | 使能状态:enabled; disabled |
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、转换公式涉及的属性
| 属性名称 | 属性类型 | 属性说明 |
|---|---|---|
| Linearization | uint8 | 传感器计算表达式 [7] - 保留字段 [6:0] - 公式 00h-0bh:enum(linear, ln, log10, log2, ...) 70h:non-linear 最常用线性表达式,配置为0x00 |
| M | uint8 | [7:0] - M(有符号,二补数),共10-bit,低8-bit |
| MT | uint8 | [7:6] - M(有符号,二补数),共10-bit,高2-bit [5:0] - 容差(无符号),共6-bit |
| B | uint8 | [7:0] - B(有符号,二补数),共10-bit,低8-bit |
| BA | uint8 | [7:6] - B(有符号,二补数),共10-bit,高2-bit [5:0] - 精度(无符号),共10-bit,低6-bit |
| Accuracy | uint8 | [7:4] - 精度(无符号),共10-bit,高4-bit [3:2] - 精度指数(无符号),共2-bit [1:0] - 传感器方向 |
| RBExp | uint8 | [7:4] - RExp(K2,有符号,二补数),共4-bit [3:0] - BExp(K1,有符号,二补数),共4-bit |
| Reading | uint8 | 传感器原始值 |
| 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_NORMAL | 0 | 扫描正常 |
| SCAN_FAILURE | 1 | 扫描失败,连续持续N(可配置)个防抖周期均失败 失败之后传感器会禁用状态,并且上报SEL |
| SCAN_PRE_FAILURE | 2 | 扫描预失败,一般为一个防抖周期,全部失败则为失败 失败之后传感器会禁用状态 |
| SCAN_NOT_ACCESSIBLE | 3 | 扫描不可访问,扫描的对象器件不支持扫描 比如:掉电、状态更新中、读值为NA |
| SCAN_NOT_SCANNED | 4 | 初始未扫描状态 |
| 2、可支持的读值状态之间的转换及转换条件 | ||
| 当前状态 | 变化状态 | 转换条件 |
| ---- | ---- | ---- |
| 0 | 2 | 一次读取失败 |
| 0 | 3 | ScanEnable值由1->0 |
| 1 | 0 | 连续M次读取成功 |
| 1 | 3 | ScanEnable值由1->0 |
| 2 | 0 | 一次读取成功 |
| 2 | 1 | 连续N次读取失败 |
| 2 | 3 | ScanEnable值由1->0 |
| 3 | 0 | ScanEnable值由0->1且下一次读取成功 |
| 3 | 2 | ScanEnable值由0->1且下一次读取失败 |
Q005:北向查看连续传感器,状态(status)与当前值(value)的关系?
A: 状态(status) 与 当前值(value) 的关系如下 1、传感器处于禁止扫描或者扫描异常的状态
| 当前值(value) | 状态(status) |
|---|---|
| na | na |
| 确认具体为禁止扫描或者扫描异常以及其原因,见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):disabledSCAN_NORMAL(0)/SCAN_NOT_ACCESSIBLE(3)/SCAN_NOT_SCANNED(4):enabled |
| initial_update_progress | 与读值状态相关SCAN_NOT_ACCESSIBLE(3)/SCAN_NOT_SCANNED(4):update in progressSCAN_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 ordisable_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 progressQ008: 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二进制文件 先通过以下脚本将二进制文件转为可读的十进制文本
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直接看事件原始数据,从中确定SelData2及SelData3的取值,进一步确定传感器编号 这里分两种情况: (1)若SelData3取值为255,则为支持“传感器数量超出255限制”之前,那么SelData2就是扫描异常的传感器的编号 (2)若SelData3取值不为255,则为支持“传感器数量超出255限制”之前,那么扫描异常的传感器编号需要根据SelData2及SelData3共同确定 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的PowerState或Presence属性为0,则Entity失效,会进一步导致传感器Status为Disabled。
Q015:直接发送GetSDR(0xa 0x23)命令为什么响应失败?
失败报错如下所示: 1. GetSDR的请求消息中包含reserve id,需要先另外发送GetSDRReserveId获取当前的reserve id 2. 将GetSDRReserveId的响应放到GetSDR的请求消息的对应位置后,可发送成功