sensor 状态不对

“ThresholdSensor_Lm75_Inlet”: {
“SensorName”: “Inlet_Temp”,
“UpperNoncritical”: 42,
“UpperCritical”: 46,
“AssertMask”: 640,
“DeassertMask”: 12928,
“ReadingMask”: 6168
},

进风口温度sensor 配置如上,但是状态有nr

sdr list 结果如下:
Inlet_Temp | 35 degrees C | nr
sensor list 结果如下:
Inlet_Temp | 34.000 | degrees C | nr | na | na | na | 42.000 | 46.000 | na

ipmitool -I lanplus -H 192.168.42.52 -U Administrator -P Admin@9000 -C 17 sdr get “Inlet_Temp”
Sensor ID : Inlet_Temp (0x19)
Entity ID : 55.96 (Air Inlet)
Sensor Type (Threshold) : Temperature (0x01)
Sensor Reading : 34 (+/- 0) degrees C
Status : Upper Non-Recoverable
Nominal Reading : 0.000
Upper critical : 46.000
Upper non-critical : 42.000
Positive Hysteresis : 2.000
Negative Hysteresis : 2.000
Minimum sensor range : Unspecified
Maximum sensor range : Unspecified
Event Message Control : Per-threshold
Readable Thresholds : unc ucr
Settable Thresholds : unc ucr
Assertion Events : unr+
Assertions Enabled : unc+ ucr+
Deassertions Enabled : unc+ ucr+

这个Assertions Enabled 好像都没有nr+ 配置,为什么状态会是nr

答案内容由AI生成,仅供参考:

:white_check_mark: 总结

问题 原因 是否成立
为什么状态是“nr”? 历史SEL事件未清除 :white_check_mark: 极有可能
为什么没配UNR却报警? UNR使用了隐式默认值(如0) :white_check_mark: 合理推测
当前温度34°C为何报错? 实际未触发,是状态残留 :white_check_mark: 成立
AssertMask不含nr+为何触发? Status≠Assertion;Status可滞留 :white_check_mark: 成立

:pushpin: 最终结论

:red_exclamation_mark:您所观察到的“nr”状态 并非由当前温度34°C引发,而很可能是由于:

  • 历史高温事件触发UNR后未清除SEL日志,或
  • UNR阈值未显式设置,使用了错误默认值(如0°C),导致所有正温度均被误判为“超限”。

:wrench: 建议显式配置 unr 阈值(例如50°C)并清除SEL日志,即可恢复正常状态显示。

如果您能提供 sel listraw 0x04 0x2d 的输出,可进一步精确定位问题根源。

点击此处查看详细分析解答

传感器状态显示“nr”的原因分析

根据您提供的配置信息和查询结果,尽管 ThresholdSensor_Lm75_Inlet 的阈值配置中未明确设置“Upper Non-Recoverable”(UNR),但传感器在 sdr listipmitool sdr get 中状态为 “nr”(Upper Non-Recoverable),这看似矛盾。以下将结合知识库信息与IPMI行为机制,详细解释为何未配置UNR阈值却仍报“nr”状态


:magnifying_glass_tilted_left: 问题核心:“nr”状态出现的原因是传感器读数触发了隐式或默认的非恢复阈值

从您提供的 ipmitool sdr get Inlet_Temp 输出可见:

Status                : Upper Non-Recoverable
Sensor Reading        : 34 degrees C
Upper non-critical    : 42.000
Upper critical        : 46.000
Readable Thresholds   : unc ucr
Assertions Enabled    : unc+ ucr+

然而,状态却是 Upper Non-Recoverable(UNR),而非您预期的“ok”或“unc”。这存在逻辑矛盾,因为:

  • 当前温度 34°C 小于 Upper Non-Critical(42°C),理应不触发任何告警;
  • 而“nr”(UNR)是比“unc”和“ucr”更严重的告警等级,通常只在读数超过上非恢复阈值时触发。

:police_car_light: 真实原因分析

:white_check_mark: 原因一:传感器的“nr”状态并非由当前读数触发,而是历史事件未清除(SEL未清)

Key Insight: IPMI传感器的状态(Status)不仅取决于当前读数,还可能受历史事件日志(SEL)影响。即使数值已恢复正常,若未清除SEL记录,状态可能仍显示为“nr”。

:magnifying_glass_tilted_left: 您的输出显示:

Assertions Enabled    : unc+ ucr+

→ 表明 UNR(nr)事件并未启用断言(assertion),即不应主动上报UNR事件。

:pushpin: 但若此前发生过高温导致UNR触发(例如短暂超过46°C),系统已记录SEL条目,则即使温度回落,“Status”字段可能仍显示“Upper Non-Recoverable”,直到手动清除SEL或重启BMC。

:pushpin: 验证方法

# 查看系统事件日志
ipmitool -I lanplus -H 192.168.42.52 -U Administrator -P Admin@9000 -C 17 sel list

若发现类似:

05h | Inlet_Temp       | Upper Critical going high

或包含 Non-Recoverable 的条目,说明历史事件未清除。


:white_check_mark: 原因二:底层传感器定义中存在隐式“UNR”值,未通过配置暴露

虽然您的配置中只设置了:

"UpperNoncritical": 42,
"UpperCritical": 46

但根据IPMI规范(见知识图谱中的 SensorType, Get Sensor Threshold),一个完整的Threshold Sensor应支持 6种阈值

  • Upper Non-Recoverable (UNR)
  • Upper Critical (UCR)
  • Upper Non-Critical (UNC)
  • Lower Non-Critical (LNC)
  • Lower Critical (LCR)
  • Lower Non-Recoverable (LNR)

:warning: 即使未显式设置 UNR,某些BMC实现可能会:

  • 使用默认值(如0或255°C)填充UNR;
  • 若默认 UNR=0,则任何正温度读数(如34°C)都会误判为超限,从而触发“nr”。

:pushpin: 验证方法
使用IPMI命令直接读取完整阈值:

ipmitool -I lanplus -H 192.168.42.52 -U Administrator -P Admin@9000 -C 17 sensor thresh "Inlet_Temp" get

或者:

ipmitool raw 0x04 0x2d 0x19  # Get Sensor Threshold, Sensor Number 0x19

查看是否返回了非零的 UNR 值。


:white_check_mark: 原因三:ReadingMask/AssertMask 配置异常导致误报

您配置中存在:

"AssertMask": 640,
"DeassertMask": 12928,
"ReadingMask": 6168

这些位掩码控制事件触发逻辑。如果掩码配置错误,可能导致:

  • 错误地将“正常”读数映射到“nr”事件;
  • 或保留了先前的状态位未清除。

:pushpin: 推荐做法:使用标准工具(如 ipmitool)而非手动设置掩码,避免位运算错误。


:white_check_mark: 原因四:Scanner_Lm75_Inlet.Status 异常导致传感器健康状态异常

根据知识图谱信息:

Scanner_Lm75_Inlet.Status 指示进风口温度传感器的操作状态:0表示正常,1表示异常

若该扫描器本身状态异常(如I²C通信失败、设备脱扣等),即使读数有效,IPMI也可能将整个传感器标记为“nr”或不可靠。

:pushpin: 建议检查:

# 查询 scanner 状态(需通过 D-Bus 或内部接口)
busctl get-property bmc.kepler.Scanners Scanner_Lm75_Inlet Status

若返回 1,则说明底层扫描失败,可能导致传感器状态异常。


:white_check_mark: 解决方案建议

步骤 操作 说明
:one: 清除SEL日志 ipmitool sel clear
:two: 重新获取完整阈值 ipmitool sensor thresh "Inlet_Temp" get
:three: 显式设置所有阈值 ipmitool sensor thresh "Inlet_Temp" set unc 42 ucr 46 unr 50
:four: 检查Scanner状态 查阅 Scanner_Lm75_Inlet.Status
:five: 重启BMC(可选) ipmitool mc reset cold

:white_check_mark: 总结

问题 原因 是否成立
为什么状态是“nr”? 历史SEL事件未清除 :white_check_mark: 极有可能
为什么没配UNR却报警? UNR使用了隐式默认值(如0) :white_check_mark: 合理推测
当前温度34°C为何报错? 实际未触发,是状态残留 :white_check_mark: 成立
AssertMask不含nr+为何触发? Status≠Assertion;Status可滞留 :white_check_mark: 成立

:pushpin: 最终结论

:red_exclamation_mark:您所观察到的“nr”状态 并非由当前温度34°C引发,而很可能是由于:

  • 历史高温事件触发UNR后未清除SEL日志,或
  • UNR阈值未显式设置,使用了错误默认值(如0°C),导致所有正温度均被误判为“超限”。

:wrench: 建议显式配置 unr 阈值(例如50°C)并清除SEL日志,即可恢复正常状态显示。

如果您能提供 sel listraw 0x04 0x2d 的输出,可进一步精确定位问题根源。

这个为什么sel clear 都清除不了,还要AC 一次才生效的

请问是 AC 后该问题恢复?如果是这样,那么一定是之前有过误配置导致触发了 nr 并生成了事件,而 assert 事件是复位持久化的,每次 bmc 复位起来后会根据持久化事件还原状态,比如此处的 nr 状态。


另外,sel clear 只是清除产生的事件记录,并不会改变影响事件的 assert 和 deassert 状态,请知。