BMC重启后电源恢复到主用状态

// 此模板仅供参考,如果不适用可以修改

问题描述

[在这里详细描述您遇到的问题]

主备模式下重启BMC,备用电源电压拉高回主用,此时web上依旧显示备用,实际为负载均衡

环境信息

  • 操作系统:[如 Ubuntu 24.04]

  • 软件版本:[如 OpenUBMC2509] OpenUBMC2512 LTS

  • 硬件配置:[如 CPU、内存等] PDC2000S12-B1

重现步骤

920B环境,搭配两个PDC2000S12-B1电源,设置主备模式,重启BMC

期望结果

[您希望实现什么]

电源功率与重启前相接近

实际结果

[实际发生了什么,包含错误信息]

BMC重启后,备用电源表现出主用电源的特征

尝试过的解决方案

[列出您已经尝试过的解决方案及结果]

将主备获取逻辑修改为判断实际电压,将会显示两个主用

此时切换主备不生效

分析结论

[详细总结您对此问题的分析结论]

电源会在以下情况退出standby,BMC依旧依赖0xCE判断主备,且修改判断逻辑后无法手动设置主备更正

答案内容由AI生成,仅供参考:
总结与建议

问题环节 根本原因 建议措施
BMC 重启后备用电源电压拉高 通信中断导致电源自动退出冷备,进入标准冗余模式 在 BMC 重启后 延迟执行主备模式恢复,待电源通信稳定后再设置;或禁用自动恢复
Web 状态显示错误 BMC 依赖软件保存的配置(如 0xCE/0xD0 读取值),未检测电源实际输出状态 修改 get_work_mode(),先检查 STATUS_BYTE.OFF 位,再返回模式;或增加基于输出电压的判断作为辅助
手动切换主备不生效 设置时机不当(电源未就绪)、设置顺序错误、条件不满足(个别电源未通信) 在设置前验证电源状态(OFF 位=0,通信正常),并按照 0x01→0x02 的规范顺序下发命令
点击此处查看详细分析解答

问题分析

您描述的现象是:在 OpenUBMC 2512 LTS 环境下,使用两个 PDC2000S12‑B1 电源配置为主备模式,执行 BMC 重启 后出现以下异常:

  • 备用电源输出电压拉高,回到主用水平(实际已变为负载均衡模式);
  • Web 界面仍显示该电源为“备用”状态;
  • 若将主备判断逻辑修改为基于实际电压,则两个电源都显示“主用”,此时手动切换主备操作不生效。

以下根据知识库中的相关信息,对产生该问题的根本原因进行分析。


根本原因

1. BMC 重启导致电源通信中断,备用电源自动退出冷备模式

根据 CRPS 电源适配总结(搜索片段 3)的描述:

CRPS 电源使用 冷备模式(Cold Redundancy) 来实现主备供电,通过 PMBus 0xD0 寄存器设置:

  • 0x01 → 主电源(始终开启)
  • 0x02/0x03/0x04 → 备电源(输出电压降低,进入冷备状态)
  • 0x00 → 退出冷备(标准冗余模式)

部分型号电源必须多个同型号 CRPS 电源同时接入并全部上电,才能设置冷备模式,否则写入 0xD0=1 会失败。

BMC 重启过程中,BMC 与电源之间的 PMBus 通信会短暂中断。备用电源在检测到通信丢失或主电源心跳消失后,会根据硬件策略 自动退出冷备状态,将输出电压恢复正常,进入 标准冗余(负载均衡)模式(0xD0 = 0x00)。这就是为什么重启后备用电源的电压被拉高,实际工作模式变为负载均衡。

2. BMC 的状态显示仍然依赖软件保存的配置,未实时反映硬件实际模式

关于电源主备的问题(topic 2889)中明确指出:

问题原因:AC 上电后,模组并为上电,此时电源处于关机状态(STATUS_BYTE 寄存器的 OFF 位为 1),无电压输出。在此状态下,无法设置主备状态,工作模式处于 标准冗余态(00h)

问题:在电源处于关机状态时,get_work_mode() 如何返回一个“负载均衡”状态?代码目前只有“主用(Enabled)”和“备用(StandbySpare)”两种模式。

BMC 读取电源工作模式时,可能直接读取 0xD0 寄存器,但未先检测电源实际运行状态(如 STATUS_BYTE.OFF 位)。在 BMC 重启后的早期阶段,电源尚未完全准备好,BMC 依旧加载了 持久化配置中记录的上一次主备设置,因此 Web 显示为“备用”。而实际电源已经因通信中断退出了冷备,处于标准冗余模式,所以显示与实际不符。

3. 修改为电压判断后显示两个主用,且手动切换不生效

  • 基于电压判断时,两个电源都在正常输出(12 V),因此都被判断为“主用”,这符合实际硬件状态(负载均衡)。
  • 手动切换主备不生效,原因可能包括:
    • 设置条件不满足:CRPS 电源要求所有电源必须 全部上电且通信稳定 才能成功写入 0xD0 寄存器。BMC 重启后通信尚未完全恢复,或电源内部状态机仍处于过渡阶段,导致写入被拒绝。
    • 未先设置冷备使能:根据适配总结,必须先向 0xD0 写入 0x01(使能冷备模式),才能再写入 0x02 设置备用。如果 BMC 没有按正确顺序下发命令,设置会失败。
    • BMC 的 set_power_work_mode 逻辑可能缺少前置条件检查:知识库中建议在设置模式前应 验证电源的 STATUS_BYTE.OFF 位是否为 0(即电源已输出),否则不执行设置。当前代码可能未进行此类校验。

知识库中的相关建议

改进 get_work_mode() 的健壮性(来自 topic 2889 的回答)

应在读取 CONTROL_CMD (0xD0) 前,先读取 STATUS_BYTE 并检测 OFF 位:

function get_work_mode():
    status_byte = chip_read_byte(STATUS_BYTE)
    if (status_byte & OFF_BIT):  # 电源未开启
        return "POWER_OFF"
    work_mode = chip_read_byte(CONTROL_CMD)
    return (work_mode == 0x01) ? "ACTIVE_MODE" : "STANDBY_MODE"

这样可确保只在电源已激活的前提下返回有效模式,避免误判。

延迟模式设置直至电源就绪(来自 topic 2889 的回答)

建议 power_strategypower_mgmt 组件引入依赖检测机制,仅当所有 PSU 的 STATUS_BYTE.OFF 位为 0(已输出)后,再执行主备模式设置。可通过轮询或事件通知实现。

提供配置开关禁用自动切换(来自 topic 2889 的回答)

可新增一个配置项(如 AutoRestorePowerMode),允许用户选择是否在重启后自动恢复之前的主备模式。若关闭,则保持标准冗余模式(0x00),避免无效切换。

关于 CRPS 电源冷备设置的注意事项(来自搜索片段 3)

  • 必须确保 所有电源都已在位并正常上电,才能成功设置冷备模式。
  • 设置顺序:先写入 0x01(使能冷备),再写入 0x02/0x03/0x04(指定备用)。
  • 单电源时无法设置冷备,调试时需接入多个电源。

总结与建议

问题环节 根本原因 建议措施
BMC 重启后备用电源电压拉高 通信中断导致电源自动退出冷备,进入标准冗余模式 在 BMC 重启后 延迟执行主备模式恢复,待电源通信稳定后再设置;或禁用自动恢复
Web 状态显示错误 BMC 依赖软件保存的配置(如 0xCE/0xD0 读取值),未检测电源实际输出状态 修改 get_work_mode(),先检查 STATUS_BYTE.OFF 位,再返回模式;或增加基于输出电压的判断作为辅助
手动切换主备不生效 设置时机不当(电源未就绪)、设置顺序错误、条件不满足(个别电源未通信) 在设置前验证电源状态(OFF 位=0,通信正常),并按照 0x01→0x02 的规范顺序下发命令

这些优化可从根本上解决“显示状态与实际不符”及“设置不生效”的问题,提升电源管理功能的稳定性和用户体验。

web界面显示的主备/负载均衡不会根据手动修改电压后进行切换。联机帮助中有对应主备/负载均衡的切换条件

但是电源自己会跳变该怎么办,我们能把主备上报改对,但是power_strategy这里手动重新设置主备不生效感觉是个问题,直接给power_mgmt发命令可以生效(这里power_mgmt发完命令,power_strategy也能发了)

  1. 问题描述具体后提供对应日志;
  2. 当前联机帮助中存在说明如下:
  • 在系统功耗较小的情况下,主备供电模式更为节能。
  • 主备供电模式下,若系统功耗大于等于主用电源模块额定功率的75%时,会自动切换为负载均衡模式。
  • 开启主备供电功能,主用电源个数必须大于或等于备用电源个数。
  • 当前系统运行环境不支持主备模式时,会退出主备模式切换为负载均衡模式,电源界面中电源预期模式与电源实际模式可能存在不一致的情况。
  • 工作模式设置为主备供电模式时,当系统中存在多个有效电源模块且实时功率低于主用电源额定功率总和时,系统将自动切换电源模式以实现节能运行。

系统切换 电源模式,这个系统是BMC还是谁?如果不是BMC,对外体现的电压应该是多少

系统是BMC切换,我们不考虑电压关系

BMC切换了电源模式?但是我看0xCE命令字没有变,切换主备当前是通过0XCE来判断的