答案内容由AI生成,仅供参考:
华为800W电源无VIN_PG信号下的AC掉电判定策略分析
问题概述
在使用华为PAC800D12-B1电源适配openUBMC系统时,出现OS正常下电后自动触发“通电开机策略”(Power-On Restore Policy)的问题。该问题的根本原因是:
- 电源未提供
VIN_PG或AC_PRESENT信号:仅提供SMBAlert用于异常告警。 - VIN_PG信号被固定拉低:在所有板卡设计中,此信号恒为低电平。
- CPLD依赖PSU综合判断逻辑:将PSOK与VIN_PG共同作为AC状态输入依据。
- 正常关机时误触发AC掉电逻辑:
- CPLD主动关闭12V → PSU的PSOK拉低;
- 由于VIN_PG始终为低 → CPLD误判为AC断电 → 向BMC的GPIO64发送AC掉电信号;
- BMC据此触发AC掉电相关策略 → 执行“通电开机策略”,导致系统在不应上电时自动重启。
当前设计与问题根源对比
| 条件 | 支持VIN_PG信号的电源 | 当前华为800W电源 |
|---|---|---|
| VIN_PG / AC_PRESENT信号 | ||
| 可区分真实市电中断 vs 正常下电 | ||
| CPLD判断依据 | VIN_PG + PSOK + PWR_OK等 | 缺少关键VIN_PG输入 |
| BMC接收到的AC状态 | 准确反映真实AC状态 | 被动跟随PSU输出变化,易误判 |
结论:当前设计导致BMC无法区分真实的外部AC断电和由BMC/CPLD控制的正常关机动作,从而误执行掉电恢复策略。
推荐解决方案
推荐方案一:修改CPLD逻辑以正确生成AC信号
核心思路:
在CPLD内部引入上下文感知逻辑,区分主动关机与被动掉电,避免因PSU输出变化而误报AC异常。
实现建议:
-- 伪代码示例
IF bmc_power_off_command_detected THEN
-- 主动关机模式:忽略PSOK/VIN_PG状态变化
ac_present_signal <= TRUE; -- 告知BMC AC仍在
ELSE
-- 被动状态监测:仅当外部供电异常时才触发AC断电
ac_present_signal <= (VIN_PG OR AC_PRESENT); -- 若存在其他信号
END IF;
实现方式:
- 在CPLD中增加一个“关机指令锁存位”,当接收到BMC下发的关机命令时置位。
- 在该锁存位有效期间,屏蔽VIN_PG和PSOK对AC状态的影响。
- 需确保该锁存位在下一次真实上电时清除。
优势:
- 最符合规范的设计;
- 能准确传递真实电源状态;
- 对openUBMC无需修改原有策略逻辑;
风险:
- 需要修改并重新烧录CPLD固件;
- 需验证不同场景下的行为一致性(如强制断电、异常重启等)。
推荐方案二:BMC侧优化判断逻辑 — 增加上下文感知
核心思路:
BMC不应仅依赖GPIO64的AC信号做决策,而应结合系统当前状态进行综合判断。
实现建议(基于openUBMC/fructrl):
-- 在 fructrl 的电源状态管理逻辑中加入判断
function dealwith_ac_lost()
if self.previous_power_state == "manual_off" then
-- 表示是用户或系统主动关机
log:info("Ignore AC lost: system was manually powered off")
return
end
-- 否则视为真实掉电,执行通电开机策略
execute_power_on_restore_policy()
end
如何获取previous_power_state?
- 利用
bmc.kepler.Systems.FruCtrl的PowerCtrl接口中的RestartCause字段:ChassisControlCommand→ 人为/命令关机;PowerCycle→ 主动循环;Unknown或无记录 → 可能是异常掉电;
配置建议:
- 使用openUBMC的
SetPowerOnStrategyExceptions接口设置例外策略:
busctl call bmc.kepler.Systems.FruCtrl /bmc/kepler/Systems/FruCtrl \
bmc.kepler.Systems.FruCtrl.SetPowerOnStrategyExceptions \
a{ss}sssy \
"ManualShutdown" "No" "Once" 5
含义:下一次因手动关机后的重启,不执行“通电开机策略”。
优势:
- 不依赖硬件改动;
- 可通过软件配置快速迭代;
- 与openUBMC现有机制兼容良好。
风险:
- 若CPLD频繁误报AC断电,仍可能影响其他监控逻辑(如日志、告警)。
推荐方案三:引入SMBA_ALERT信号进行辅助判断
利用已有信号资源:
- 华为电源虽无VIN_PG,但提供了**CRPS_ALERT_N(SMBAlert)**信号。
- 此信号通常为“低电平有效”,表示电源存在故障(过压、欠压、过温等)。
判断逻辑优化建议:
| 信号状态 | 含义 | 是否应触发AC恢复策略 |
|---|---|---|
| PSOK=0, PWR_OK=0, ALERT=1(无效) | 主动关机 | |
| PSOK=0, PWR_OK=0, ALERT=0(有效) | 电源异常掉电 |
说明:
ALERT=0表示电源检测到异常条件 → 更接近真实AC问题。
实现建议:
在CPLD或BMC中增加判断:
AC_LOST <= NOT (PSOK AND PWR_OK) AND NOT ALERT; -- 只有在告警有效时才认定为真实掉电
若BMC忽视AC信号的影响分析
| 影响项 | 后果分析 |
|---|---|
| 通电开机策略失效 | 如配置为“保持上电”或“保持断电”策略时,将无法执行,违背用户预期。 |
| 电源状态记录错误 | SEL日志中“Power Down/Up by AC Loss”事件将缺失或错误。 |
| 供电异常诊断能力下降 | 无法区分AC闪断与正常关机,影响运维排查。 |
| 高可用系统风险增加 | 在双机热备、集群环境中,可能导致误判节点宕机,引发不必要的主备切换。 |
| UPS联动逻辑失效 | 若依赖AC信号控制UPS或电池切换,则无法正常工作。 |
结论:直接忽视AC信号不可取,但可以优化对其解释方式,加入上下文判断。
社区建议与最佳实践(openUBMC视角)
openUBMC推荐做法总结:
| 功能点 | 推荐做法 |
|---|---|
| AC状态判定 | 不应仅依赖单一GPIO信号,需结合RestartCause和历史状态 |
| 通电开机策略 | 提供灵活性,支持通过SetPowerOnStrategyExceptions配置例外 |
| 上下电配置 | 确保ACCycle_1, PGSignal_1, PowerButton_1对象正确配置(来自CSR文档) |
| 异常行为调试 | 查看fructrl日志是否经过powerapi函数 → 判断命令来源 |
配置建议(CSR/VPD层面):
确保以下对象正确定义:
"ACCycle_1": {
"AC": "#/Accessor_AC.Value"
},
"PGSignal_1": {
"PowerGDState": "<=/Scanner_PowerGd.Value"
}
Accessor_AC应反映经过逻辑处理后的“真实AC状态”。
最终建议
| 方案 | 推荐等级 | 说明 |
|---|---|---|
| 修改CPLD逻辑,智能生成AC信号 | 根本性解决,推荐长期采用 | |
BMC侧结合RestartCause优化策略判断 |
快速见效,推荐短期过渡使用 | |
| 结合SMBA_ALERT辅助判断 | 利用现有资源提升判断准确性 | |
| 完全忽略AC信号 | 导致系统失去关键诊断能力 |
附加建议
-
日志调试建议:
- 检查
/var/log/bmc/fructrl.log中是否有execute_poweron被意外调用; - 使用
busctl introspect bmc.kepler.Systems.FruCtrl查看当前策略配置。
- 检查
-
测试用例建议:
- 场景1:远程命令关机 → 应不触发恢复上电;
- 场景2:拔掉电源线再插回 → 应触发通电开机;
- 场景3:强制长按关机 → 视为异常掉电,应触发恢复策略。
-
社区协作建议:
- 可向openUBMC提交Issue,推动增加对“无VIN_PG电源”的适配指南;
- 建议完善
ACCycle类的文档,明确其对AC信号的依赖与容错机制。
总结:该问题是典型“硬件信号缺失导致软件误判”的案例。最稳妥的解决路径是软硬协同优化——CPLD改进信号生成逻辑 + BMC增强上下文判断能力,从而实现对AC状态的精准感知。
相关链接: