上下电配置指导
更新时间: 2025/11/21
在Gitcode上查看源码

上下电配置指导

上下电配置主要涉及的模块是:fructl组件,vpd组件

fructl代码路径是:fructl

功能介绍

BMC作为服务器的带外管理系统,可以控制OS的开关机,重启等操作,本篇主要介绍如何配置开机关机功能;

整体设计实现

fructl模块负责逻辑处理,需要vpd模块内部配置的数据,完成最终的操作动作,正常适配开关机时,仅需要配置vpd模块即可,为了方便理解和学习,两个模块都进行介绍

fructrl_obj_mgnt模块启动介绍

fructrl的入口函数是src\lualib\payload_app.lua里面的cpayload:init()

在fructrl_obj_mgnt:object_manage_callback()里面,调用add_objects_callback完成了主要对象的加载;

模块内部管理有分层设计,机箱(Chassis)-> 多主机(Multihost)-> 多个系统(System,即主机)

机箱级的FRU控制(ChassisFruCtrl),管理整个机箱的电源操作,这些操作会影响到所有的主机系统。目前的设备未配置机箱级系统,属于单主机系统。 每个主机系统(system)有自己的FRU控制(FruCtrl)对象,用于管理该主机系统的电源操作。

以920X的正常的启动流程为例,需要加载ObjectGroup/00的对象(4个对象),对应的配置在vpd\vendor\Huawei\Server\Kunpeng\S920X20\platform\platform.sr

text
FruCtrlCapabilities_00: FRU控制能力对象
SystemLockDown_1_00: 系统锁定对象
Multihost_00: 多主机对象(但实际只有单主机)
FruCtrl_1_0_00: 主机1的FRU控制对象

添加ObjectGroup/0101的对象(6个对象),对应配置在vendor\Huawei\TianChi\EXU\14100513_00000001010302044492.sr

text
DftPowerButton_1_0101: 装备电源按钮
PowerAction_1_0101: 电源动作对象
PGSignal_1_0101: 电源正常信号
ButtonEvt_1_0101: 按钮事件
ACCycle_1_0101: AC循环控制
PowerButton_1_0101: 电源按钮

添加ObjectGroup/010101的对象(5个对象)对应配置在vendor\openUBMC\14060876_00000001020302031825_soft.sr

text
Nmi_1_010101: NMI控制
SysReset_1_010101: 系统复位
ThermTrip_1_010101: 热保护
RecordFault_1_010101: 故障记录
ForceReset_1_010101: 强制复位

fructl模块必要配置

fructrl_obj是最主要的对象,创建之后,会匹配到add_object_callback里面完成下面五个对象的创建,正常情况下,这五个配置是必须的,且不能重复定义,原始代码如下;

text
['FruCtrl'] = 'NA',
['PGSignal'] = 'NA',
['PowerButton'] = 'NA',
['ThermTrip'] = 'NA',
['RecordFault'] = 'NA',

匹配到这些对象之后,对应值设为Added,不再是NA,在add_fruobj_complete_callback函数中检查是否都获取到,如果获取不到,则无法实现开关机操作;会有如下打印:

text
objs_bef_init distribute failed.

命令开机流程

首先接收和处理电源控制命令,可以是ipmi,也可以是web或者其他。

从onehost_system_power_ctrl进入,调用cpower_api:system_reset,单独启动一个任务,执行set_CurrentRestartType,在powerctrl_api中使用表驱动的方式,调用powerctrl_api[power on]的函数execute_poweron;

execute_poweron发送一个开机事件到控制状态机,在ctrl_state中判断自己的状态和期望的下一个状态,执行下一个操作,当前状态是NoAction,则进入Oning状态,执行fructrl:poweron();

最终调用power_button:push_button_short()操作硬件,执行上电操作,这里面会用到vpd组件中配置power_button和配置的Accessor信息,和pg_signal用到的Scanner信息,vpd需要配置正确,否则会无法开机;

按键开机流程

在开机按钮被按下时,在ButtonEvt_1中定义了GetPowerBtnEvt被触发,会调用到dealwith_pwr_button_evt,日志记录下power button event change to [1],会设置sys_reset_flag为true,BMC主动发命令导致系统复位时改为true;

在上电状态改变后,触发dealwith_power_gd_status,会打印PowerGDStatus changed to power on,后面开机状态会进入M1->M4等状态,整个过程fructl模块只是负责记录和修改一些状态,不负责其他动作;

vpd配置示例

如上面介绍的FruCtrl对象,上下电功能核心的对象,需要配置相应的属性,这些属性是在vpd模块中配置的,Scanner和Accessor对象需要根据实际情况进行修改,下面这些对象都是需要的:

json
"FruCtrl_1_0": {
    "CurrentRestartCauseId": 0
},

PGSignal对象,表示电电源信号

json
"PGSignal_1": {
    "PowerGDState": "<=/Scanner_PowerGood.Value",
    "@Default": {
        "PowerGDState": 255
    }
},

PowerButton对象,区分长按还是短按

json
"PowerButton_1": {
    "ShortPushButton": "#/Accessor_ShortPushButton.Value",
    "LongPushButton": "#/Accessor_LongPushButton.Value"
},

实现系统的重启,及重启前后的持久化动作;

json
"ACCycle_1": {
    "AC": "#/Accessor_AC.Value"
},

电源按钮感知,屏蔽电源按钮操作的功能

json
"ButtonEvt_1": {
    "PowerBtnLock": "#/Accessor_PowerBtnLock.Value",
    "GetPowerBtnEvt": "<=/Scanner_PowerBtnEvt.Value",
    "SetPowerBtnEvt": "#/Accessor_PowerBtnEvt.Value",
    "PowerBtnShield": "#/Accessor_PowerBtnShield.Value"
},

上电超时标志,上电锁

json
"PowerAction_1": {
    "PowerOnTimeoutFlag": "#/Accessor_PowerOnLock.Value"
},

ForceReset对象,当该对象正常分发时,才支持强制复位命令

json
"ForceReset_1": {
    "FruID": 0,
    "ForceRst": "#/Accessor_ForceRst.Value",
    "IsValid": true
},

SysReset对象,复位信号对象,上报os重启事件时需要该对象

json
"SysReset_1": {
    "GetSysRstDetected": "<=/Scanner_SysRstDetected.Value",
    "SetSysRstDetected": "#/Accessor_SysRstDetected.Value"
},

清除告警锁存信号,历史故障记录,当前故障状态

json
"RecordFault_1": {
    "IssueRecoredAcc": "#/Accessor_IssueRecoredAcc.Value",
    "LatchRecoredAcc": "#/Accessor_LatchRecoredAcc.Value"
},

NMI中断(预中断)

json
"Nmi_1": {
    "NmiInt": "#/Accessor_NmiInt.Value"
},

高温下电检测

json
"ThermTrip_1": {
    "GetThermTrip": "<=/Scanner_Cpu1ThermalTripAccessor.Value",
    "SetThermTrip": "#/Accessor_Cpu1ClearThermalTripAccessor.Value"
},

常见问题

1: 模块加载失败 多数是 FruCtrl,PGSignal, PowerButton, ThermTrip, RecordFault没有配置正确,可能是没有配置,也可能是配置重复了;

2: 发了上电命令,但是没有上电成功。 日志中搜索Notify cpld to send short button signal through hwproxy Accessor.,这个打印代表已经向硬件送了短按中断。如果还未上电请找硬件定位。 请用该命令查询ipmcget -t main -d poweronlock,是否发生上电超时事件。如果回显为locked,则说明发生上电超时事件。

3: 发了下电命令,但是没有下电成功。 下电可以通过短按信号普通下电,也可以通过长按信号强制下电。在日志中可搜索Notify cpld to send short button signal through hwproxy Accessor.,或Notify cpld to send long button signal through hwproxy Accessor.。如果未下电,同样找硬件定位。

4: 下电同样也会出现失败的情况 1、如果配置了安全下电超时时间,则系统在配置时间内未下电会执行强制下电。 2、如果未配置,默认下电超时时间为10min,超时则重新上电。 下电失败日志关键字Power off timeout

5: 如何知道上下电命令是否来自bmc还是os 查看对应时间点日志中,是否经过了powerapi函数,只要是通过bmc发送的上下点命令最终必定经过bmc。

参考文档