实体FruCtrl_1_0_00的CurrentRestartType 字段无效

下面SR 配置一个sensor 事件关联ipmitool power up / cycle /reset

但是关联的资源树CurrentRestartType 字段一直为255,看上树接口描述,如下:

这个CurrentRestartType 怎么不生效的?

“DiscreteSensor_SysRestart”: {
“OwnerId”: 32,
“OwnerLun”: 0,
“EntityId”: “<=/Entity_MainBoard.Id”,
“EntityInstance”: “<=/Entity_MainBoard.Instance”,
“Initialization”: 99,
“Capabilities”: 64,
“SensorType”: 29,
“ReadingType”: 111,
“SensorName”: “SYS_Boot”,
“AssertMask”: 247,
“DeassertMask”: 0,
“DiscreteMask”: 247,
“Unit”: 192,
“BaseUnit”: 0,
“ModifierUnit”: 0,
“DiscreteType”: 1,
“RecordSharing”: 1,
“Reading”: 0
},
“DiscreteEvent_SysRestartPowerup”: {
“Property”: 0,
“ListenType”: 1,
“EventData1”: 0,
“EventData2”: “<=/FruCtrl_1_0.CurrentRestartCauseId”,
“EventData3”: 0,
“EventDir”: “<=/FruCtrl_1_0.SysResetDetected;<=/FruCtrl_1_0.CurrentRestartType |> expr(($2 == 0) && $1 != 0)”,
“Conversion”: 0,
“SensorObject”: “#/DiscreteSensor_SysRestart”
},
“DiscreteEvent_SysRestartHardRest”: {
“Property”: 0,
“ListenType”: 1,
“EventData1”: 1,
“EventData2”: “<=/FruCtrl_1_0.CurrentRestartCauseId”,
“EventData3”: 0,
“EventDir”: “<=/FruCtrl_1_0.SysResetDetected;<=/FruCtrl_1_0.CurrentRestartType |> expr(($2 == 1) && $1 != 0)”,
“Conversion”: 0,
“SensorObject”: “#/DiscreteSensor_SysRestart”
},
“DiscreteEvent_SysRestartWarnRest”: {
“Property”: 0,
“ListenType”: 1,
“EventData1”: 2,
“EventData2”: “<=/FruCtrl_1_0.CurrentRestartCauseId”,
“EventData3”: 0,
“EventDir”: “<=/FruCtrl_1_0.SysResetDetected;<=/FruCtrl_1_0.CurrentRestartType |> expr(($2 == 2) && $1 != 0)”,
“Conversion”: 0,
“SensorObject”: “#/DiscreteSensor_SysRestart”
},

~ ~ $ mdbctl lsprop FruCtrl_1_0_00 bmc.kepler.Systems.FruCtrl
bmc.kepler.Systems.FruCtrl
ACCycleEnabled=false
CurrentRestartCause=“Unknown”
CurrentRestartCauseId=2
CurrentRestartType=255
FruType=“OS”
GracefulShutdownDefaultTimeoutSeconds=600
GracefulShutdownMaxTimeoutSeconds=6000
GracefulShutdownMinTimeoutSeconds=10
GracefulShutdownTimeoutEnabled=0
GracefulShutdownTimeoutSeconds=600
HotswapState=“M4”
LastPowerEvent=0
PanelPowerButtonEnabled=true
PowerCtrlFault=0
PowerCycleType=0
PowerOnStrategy=“AlwaysPowerOn”
PowerOnStrategyExceptions=0
PowerState=“ON”
PreviousPowerState=“ON”
RestartCauseRecords=[“Unknown”,“Unknown”,“Unknown”,“Unknown”,“Unknown”,“PowerUpViaPushButton”,“PowerUpViaPushButton”,“Unknown”,“Unknown”,“ChassisControlCommand”]
RestartCount=0
SysResetDetected=0
Private
ACPIDevicePowerState=“”
ACPISystemPowerState=“”
ActionModified=false
BmcResetFlag=0
FruID=0
Id=0
IsValid=true
PowerOffLockedRecord=
PowerOnTimeoutSeconds=600
PwrCycleDelaySeconds=10
PwrOnLockedRecord=
PwrRestoreRecord=
PwrStateBeforeACLost=true
TimeDelaySecondsModified=false

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

:pushpin: 总结

项目 内容
根本原因 CurrentRestartType=255 是因为系统重启未通过 cpower_api:system_reset 接口,导致属性未被正确初始化。
核心机制 CurrentRestartTypefructrl 组件在调用 cpower_api:system_reset 时设置,非被动检测所得。
解决方案 1. 所有重启路径统一走 cpower_api:system_reset
2. 改用 SysRestart 硬件传感器事件做触发源,提高兼容性。
推荐配置变更 EventDir 中避免依赖 CurrentRestartType,改用更底层稳定的事件源。

:repeat_button: 最终建议:若您的场景包含 AC掉电恢复、强制复位等非受控重启,建议放弃对 CurrentRestartType 的依赖,转而使用 DiscreteSensor_SysRestart 配合 IPMI SEL 进行事件识别,以确保事件上报的完整性与可靠性。

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

关于 FruCtrl_1_0_00.CurrentRestartType 字段无效问题的分析与解决方案

根据您提供的配置、日志及现象,CurrentRestartType 字段值为 255 且未正确反映系统重启类型(应为 0、1 或 2),导致关联的 IPMI Sensor Event 无法触发。以下将从原理、原因和解决方案三方面进行系统性分析。


:magnifying_glass_tilted_left: 问题现象总结

  • 配置意图:通过 DiscreteEvent_SysRestartPowerup/HardReset/WarmReset 配置离散事件,监听不同类型的系统重启(Power Up、Hard Reset、Warm Reset)。
  • 核心依赖
    • CurrentRestartType 字段:定义当前系统重启的类型(U8,0=PowerUp, 1=HardReset, 2=WarmReset)。
    • SysResetDetected:系统是否检测到复位。
  • 实际问题
    • 查看 mdbctl lsprop FruCtrl_1_0_00 显示 CurrentRestartType=255,表示“无效或未设置”。
    • 因此,表达式 expr(($2 == 0) && $1 != 0)$2 恒为 255,导致事件匹配失败。

:puzzle_piece: 原理分析:CurrentRestartType 是如何被设置的?

1. CurrentRestartType 的作用

该字段是 fructrl 组件用来记录最近一次系统重启原因的关键属性,用于支持以下功能:

  • 支撑 IPMI 规范中 42.2 节定义的 “System Boot / Restart Initiated” 事件
  • 配合传感器事件(如 DiscreteSensor_SysRestart)上报不同启动类型。
  • 被多种策略使用(如通电开机策略判断是否执行上电)。

:white_check_mark: 正确值范围:

  • 0: Initiated by Power Up
  • 1: Initiated by Hard Reset
  • 2: Initiated by Warm Reset
  • 255: Invalid / Unknown(当前状态)

2. CurrentRestartType 的赋值机制

根据知识库和社区讨论,该字段由 fructrl 组件在重启前或重启后通过 cpower_api:system_reset 函数设置

调用链路如下:

调用者 (如 CLI、Redfish、IPMI) 
    → 调用 cpower_api:system_reset(reason) 
        → fructrl 的 powerapi.lua 处理 
            → 设置 CurrentRestartType 和 CurrentRestartCause 
            → 记录到 FruCtrl 对象中

:link: 参考文档:

  • reference_id: 3xijie 明确指出:

    “CurrentRestartType 通过调用方调用 cpower_api:system_reset 函数传入的参数进行记录,该函数在 fructrl 组件中 powerapi.lua 函数中。”


3. 什么情况下会设置失败?为何值为 255?

原因 说明
非标准方式触发重启 如直接断电(AC掉电)、强制复位按钮、CPLD触发,未走 cpower_api:system_reset 接口,则 CurrentRestartType 无法被设置。
硬件复位信号解析错误 fructrl 依赖 mc_sys_info.get_reset_type 从 BMC 芯片信号中读取复位类型,若此接口返回错误(如问题#3178所述,AC掉电误判为 soft_reset),可能导致逻辑跳过设置。
初始化时机问题 系统刚上电时,fructrl 尚未完成加载,无法及时捕获早期复位事件。

:warning: 特别注意:当系统进行 AC Power Cycle(整机掉电再上电)时,BMC 可能未主动调用 cpower_api:system_reset,而是被动检测到 SysResetDetected=1,但 CurrentRestartType 仍保持默认值 255


:hammer_and_wrench: 解决方案建议

:white_check_mark: 方案一:确保所有重启都通过 cpower_api:system_reset 触发(推荐)

所有外部重启命令(如 IPMI、Redfish、CLI)必须调用 cpower_api:system_reset 并传递正确的 RestartCause 参数

示例:

-- Lua 调用示例(在 BMC 应用中)
cpower_api:system_reset {
    pctrl_type = "ForceRestart",
    restart_cause = "PowerUpViaPushButton"  -- 或 ChassisControlCommand, AcPowerRestored 等
}

:light_bulb: 说明:只要经过 cpower_api:system_resetfructrl 内部会自动设置 CurrentRestartTypeCurrentRestartCauseId


:white_check_mark: 方案二:使用 SysRestart 离散传感器 + 外部逻辑判断重启类型(兼容性方案)

若无法保证所有路径都走 cpower_api:system_reset,可改为监听底层硬件传感器事件(更可靠)。

推荐做法:

  1. 使用 SysRestart 传感器作为事件源

    • 它是由 BMC IPMI 层直接上报的硬件传感器事件,可靠度更高。
    • 日志中可见:
      sensor NOTICE: sel_management.lua(688): add sel[...] SensorName: SysRestart ...
      
  2. 在 SR 配置中绑定 ReadingType=111 (System Restart) 的事件

    • 此事件不依赖 CurrentRestartType,直接由硬件上报。

修改建议:

"DiscreteEvent_SysRestartPowerup": {
  "Property": 0,
  "ListenType": 1,
  "EventData1": 0,  // Power Up
  "EventData2": 0,
  "EventData3": 0,
  "EventDir": "<=/DiscreteSensor_SysRestart.Reading |> expr($1 == 1)",  // 检测到重启即触发
  "Conversion": 0,
  "SensorObject": "#/DiscreteSensor_SysRestart"
}

:white_check_mark: 优点:不受 CurrentRestartType 是否生效影响,底层事件更可靠。


:white_check_mark: 方案三:通过 Sensor Event Log (SEL) 补偿判断

即使 CurrentRestartType=255SEL 中通常仍会记录完整事件:

ipmitool sel list
# 输出示例:
# 563 | 08/12/2025 | 16:23:45 | System Restart  | Restart        | Asserted    | 

可通过分析 SEL 记录中的 Sensor Type 和 Event Data 自动推断重启类型。


:white_check_mark: 验证方法

1. 检查 CurrentRestartType 是否被正确设置

# 触发一次标准重启
ipmitool chassis power cycle

# 立即检查属性
mdbctl lsprop FruCtrl_1_0_00 bmc.kepler.Systems.FruCtrl | grep CurrentRestartType

预期输出:

CurrentRestartType=0   # Power Cycle 应设为 0

2. 查看日志是否记录 system_reset 调用

grep -i "cpower_api:system_reset" /var/log/app.log

预期输出类似:

powerapi1.lua (157): [System:|]pctrl_type=ForceRestart, restart_cause=ChassisControlCommand, fruid=0

:pushpin: 总结

项目 内容
根本原因 CurrentRestartType=255 是因为系统重启未通过 cpower_api:system_reset 接口,导致属性未被正确初始化。
核心机制 CurrentRestartTypefructrl 组件在调用 cpower_api:system_reset 时设置,非被动检测所得。
解决方案 1. 所有重启路径统一走 cpower_api:system_reset
2. 改用 SysRestart 硬件传感器事件做触发源,提高兼容性。
推荐配置变更 EventDir 中避免依赖 CurrentRestartType,改用更底层稳定的事件源。

:repeat_button: 最终建议:若您的场景包含 AC掉电恢复、强制复位等非受控重启,建议放弃对 CurrentRestartType 的依赖,转而使用 DiscreteSensor_SysRestart 配合 IPMI SEL 进行事件识别,以确保事件上报的完整性与可靠性。

这个值主要是执行了相应的动作再设置,设置完2s后恢复。可以查看开源代码 fructrl中set_CurrentRestartType,设置完等待2s,等待传感器事件生成后恢复默认值255。

我执行了ipmitool power up /cycle /reset ,然后写了个shell 间隔0.2s 去读取这个值,一直发现都是255。 那是不是这个不是执行上面命令相关的动作吗?

这个mdbctl 好像获取不到变化