答案内容由AI生成,仅供参考:
总结
您遇到的问题是典型的 “升级成功但回滚” 现象,由构建包与运行环境不一致引发,触发了 BMC 的自动回滚机制。
根本原因在于:构建配置不当 → 关键服务缺失/启动失败 → 自动回滚 → 回到旧版本。
最佳实践建议:
- 使用官方 release manifest;
- 构建时加
-bt=release; - 升级前
clearcfg; - 查看串口日志定位真实错误;
- 必要时临时禁用回滚机制。
完成上述流程后,升级应能稳定生效。
如问题持续,请提供 完整串口日志 + HPM 包 SHA256 值 至 OpenUBMC 官方论坛,我们将进一步协助排查。
点击此处查看详细分析解答
openUBMC 25.12 LTS SP1 升级后自动回滚至旧版本问题分析与解决方案
根据您提供的详细信息,您的系统在执行 openUBMC 25.12 LTS SP1 版本升级时,虽然 Web 界面显示“升级成功”,但设备重启后自动回滚至之前的版本(如 openUBMC 0507 和 S920X20 0509)。以下基于 知识图谱(KG)、文档片段(DC) 以及 搜索结果 进行综合分析,并提供系统性解决方案。
问题本质
固件升级虽报告成功,但由于关键服务启动失败或校验异常,触发系统自动回滚机制,导致 BMC 切换回原分区的旧版本固件。
这种现象被称为 Version Backtrack(版本回退),是 Auto Rollback(自动回滚)机制 的典型表现。
根本原因分析
结合多源信息,可确定如下根本原因:
1. 关键服务未正常启动,触发启动检测失败
-
知识图谱证据:
Auto Rollback被Upgrade Failure触发。Automatic Rollback是当核心服务(如 Redfish、Web Backend)无法初始化时,系统行为。- 文档片段
#1明确指出日志中出现:
表明关键组件未注册到 D-Bus,被[redfish]StartupCheck failed [web_backend]StartupCheck failedmaca(启动监控模块)判定为异常。
-
结论:
- 新编译的镜像可能缺少关键服务描述文件(
.service文件),或其依赖未正确打包。 - 即使部分服务最终恢复,早期检查失败已触发回滚逻辑。
- 新编译的镜像可能缺少关键服务描述文件(
2. 构建配置不一致或签名/验证冲突导致运行时异常
-
知识图谱 & 搜索结果佐证:
- 搜索结果 #1 提到:“rootfs tmp verify fail, ret:-22” → rootfs 镜像尺寸与分区不匹配。
- 搜索结果 #4 显示签名校验失败(code 88200004)导致升级失败并禁止回退。
- DC2 日志显示:
mismatched command /bin/tar,execve: mismatched command,提示 安全策略拦截系统调用(如 SELinux、签名校验)。 - DC5 提到 release 包因
crc 校验失败回退。
-
结论:
- 若您使用的
manifest或 SDK 来源于非标准源,可能导致:- 文件系统大小与分区定义不符;
- 签名机制不兼容;
- 构建出的组件未经过完整 release 优化,残留 debug 行为。
- 若您使用的
3. 双分区验证失败,激活新分区失败
-
搜索结果 #1 分析精辟:
M3 固件层检测到
tmp region rootfs尺寸不匹配,导致 rootfs 校验失败(ret:-22),active 分区未更新。重启后主备分区均不可用,触发回滚机制。 -
知识图谱印证:
Upgrade Failure可发生于write bmc package to flash failed阶段。Quick Rollback Mechanism包含“文件恢复、配置还原、服务重启”流程。
4. 缓存与构建一致性问题
- 您尝试删除本地 Conan 仓并回退 manifest 修改仍无效。
- 知识库提示:
openubmc_25.12是 Conan SDK 仓库,若本地缓存污染或未强制清理,即使重新构建也可能复用旧组件。- 使用
bingo build -bt=release才能确保构建 release 版本(见 DC7)。
解决方案与建议步骤
推荐操作顺序(逐级排查)
| 步骤 | 操作内容 | 目的 |
|---|---|---|
| 1 | 清空所有本地缓存 | 防止使用旧组件 |
| 2 | 使用官方 clean manifest 构建 release 包 | 排除定制干扰 |
| 3 | 升级前执行 clearcfg(清根) | 避免旧配置影响新版本启动 |
| 4 | 临时禁用自动回滚机制 | 便于观察真实失败原因 |
| 5 | 升级并查看串口日志 | 定位具体服务/校验失败点 |
| 6 | 确认无误后重新启用自动回滚 | 恢复生产环境可靠性 |
具体执行方法
步骤 1:彻底清理本地构建环境
# 删除 conan 缓存
conan remove "*" -f
# 清理 bingo 构建产物
bingo clean --all
# 删除临时目录
rm -rf /tmp/openubmc_build /dev/shm/upgrade
关键点: 必须确保使用的是
br_release_openUBMC2512_20261231_LTS_SP1分支的纯净代码。
步骤 2:使用标准流程构建 Release 版本
# 构建 release 包(必须指定 -bt=release)
bingo build -b openUBMC -r openubmc_dev -bt release
# 打包 HPM 文件
bingo packethpm
注意: debug 构建可能带调试服务导致行为差异,版本发布必须用
-bt=release(见 DC7)。
步骤 3:升级前清根(clearcfg)
通过命令行或 BMC 工具清除当前配置:
# 登录 BMC 后执行
ipmcset -d clearcfg
目的: 解决因配置版本不兼容导致的服务启动失败,如
product_mgmt启动报错 “unknown object path error on the dbus”。
步骤 4:临时禁用自动回滚机制
通过串口或调试接口关闭自动回滚功能,避免升级后立即切换:
# 禁用快速回滚机制
echo "disable_quick_rollback" > /proc/bmc_upgrade/control
或通过内核参数
rollback_disabled=1临时关闭。
步骤 5:升级并观察串口日志(最关键步骤)
- 使用新构建的
.hpm包进行升级; - 观察串口输出(波特率通常为 115200);
- 重点关注以下信息:
[maca] StartupCheck failed for redfish [firmware_mgmt] verify signature error [FWUPD] rootfs tmp verify fail, ret:-22 [bmc_upgrade] decompress_img.lua: Failed to exec /bin/tar
建议: 录制完整串口日志,上传至论坛以供进一步分析。
步骤 6:检查 rootfs 分区与镜像大小是否匹配
- 获取新镜像的实际大小:
ls -l build/images/rootfs.img - 检查 MTD 分区表中
rootfs_a和rootfs_b的大小是否足够容纳该镜像。 - 若镜像大于分区 → 修改 DTS 或分区表,重新打包。
附加建议
| 建议项 | 说明 |
|---|---|
收集 app.log, framework.log, m3_log, kernel log 打包上传 |
|
确保包含 redfish, web_backend, dcmid 等服务 |
|
| 便于调试签名与启动过程 | |
| 方便他人验证包完整性 |
参考资料与链接
官方下载地址:https://www.openubmc.cn/zh/download(openUBMC 25.12 LTS SP1发布页)
SDK 仓库:https://conan.openubmc.cn/openubmc_25.12
文档中心:https://discuss.openubmc.cn
相似案例参考:
总结
您遇到的问题是典型的 “升级成功但回滚” 现象,由构建包与运行环境不一致引发,触发了 BMC 的自动回滚机制。
根本原因在于:构建配置不当 → 关键服务缺失/启动失败 → 自动回滚 → 回到旧版本。
最佳实践建议:
- 使用官方 release manifest;
- 构建时加
-bt=release; - 升级前
clearcfg; - 查看串口日志定位真实错误;
- 必要时临时禁用回滚机制。
完成上述流程后,升级应能稳定生效。
如问题持续,请提供 完整串口日志 + HPM 包 SHA256 值 至 OpenUBMC 官方论坛,我们将进一步协助排查。