V2升级openUBMC后,固件无法升级

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

固件升级问题分析与解决方案

根据您的描述,您在将 V2 版本升级至 openUBMC 25.09 后,遇到了两个核心问题:

  1. rootfs_user 中的脚本修改未生效;
  2. 无法成功升级后续固件版本(如 25.09.1.28),即使 Web 界面显示“升级成功”,版本仍停留在 25.09.01.09。

以下基于您提供的上下文信息、知识图谱及技术文档,进行详细分析并提出解决方案。


一、为什么对 rootfs_user 的更改没有生效?

:magnifying_glass_tilted_left: 原因分析

根据知识库中关于 组件构建流程镜像生成机制 的信息:

  • rootfs_user 是一个 Conan 组件,在构建过程中与其他组件(如 webui, key_mgmt 等)合并生成最终的 rootfs_openUBMC.hpm 镜像包。
  • 构建命令 bingo build 会整合所有组件,并最终输出位于 manifest/output/ 目录下的 rootfs_openUBMC.hpm
  • 您所修改的文件路径:dist/user_conf/rootfs/etc/rc.d/rc.start/firstboot.sh,应属于 rootfs_user 组件的定制内容,其生效依赖于:
    • 是否正确地执行了完整的构建流程;
    • 是否将修改纳入了最终的镜像生成过程。

:white_check_mark: 关键证据支持:

【search result #6】构建制品定制化方案 指出:

  • 组件镜像合并顺序为:先各组件独立构建 → post_imagepost_rootfs → 生成完整 rootfs 镜像。
  • 若文件权限或内容需调整,应在 post_rootfs 阶段通过定制脚本处理。

如果您的修改只是在本地临时修改源码,但没有:

  • 提交到正确的 Git 分支;
  • 清理缓存重新构建;
  • build 过程跳过了 rootfs_user 的重新打包;

那么最终生成的 .hpm 包内并未包含您修改后的 firstboot.sh 脚本 —— 导致更改“看似存在”但实际上未被烧录。

此外:

  • /tmp/cert_import.log 不存在,说明 ipmcset -t certificate ... 命令根本没有执行;
  • 这进一步证明 firstboot.sh 没有运行或根本不存在于系统中

:white_check_mark: 解决建议:确保修改真正“入固件”

请按以下步骤操作以确保 rootfs_user 修改生效:

  1. 确认修改位置正确

    build/product/BMC/openUBMC/rootfs/etc/rc.d/rc.start/firstboot.sh
    

    确保您在此路径下修改的是参与构建的源文件,而非已部署系统的运行文件。

  2. 清理构建缓存

    bingo clean           # 清理临时文件
    rm -rf output/*       # 清空输出目录
    
  3. 重新构建完整固件包

    bingo build           # 确保 rootfs_user 被重新编译打包
    
  4. 验证输出包是否含修改
    可解压 rootfs_openUBMC.hpm(需工具如 hpmtool),检查其中是否包含您修改后的 firstboot.sh 文件。

  5. 可选:添加构建后验证脚本
    post_rootfs 阶段添加脚本验证文件是否存在、内容是否正确,防止构建“看似成功实则遗漏”。


二、为什么无法升级固件?重启后版本不变

:magnifying_glass_tilted_left: 问题现象总结

  • Web 界面提示“升级成功”;
  • BMC 重启、甚至冷启动(ipmitool mc reset cold);
  • 主备分区版本仍为 25.09.01.09,无法切换到新版本(如 25.09.1.28);

这表明:

固件虽然成功上传和写入,但“激活”或“生效”阶段失败


:pushpin: 可能原因分析(结合知识图谱与日志模式)

原因 1:升级后未正确注册到 firmware_mgmt 资源树

根据 【search result #2】升级常见问题指南#Q3

  • BIOS 或其他固件升级完成后,需确认是否已在 firmware_mgmt 中注册。
  • 检查资源树是否有新版本固件的信息条目。
  • 若没有,则说明 firmware_mgmt 未识别新版本,导致“假升级”。
# 登录 BMC 命令行,检查 firmware_mgmt 日志
cat /var/log/app.log | grep -i "upgrade\|firmware"

查找如下关键字:

  • "Upgrade completed"
  • "Validate signature successfully"
  • "Register component"
  • "status: COMPLETED"

若看到 CLEAR → PROCESSING → CLEAR 或直接失败,说明流程异常终止。


原因 2:签名验证失败 / 安全启动限制

知识库中多处提到:

  • 固件必须经过签名,否则会报“无效的升级包”;
  • 特别是在从自编译包升级时,易出现此类问题;
  • iBMC 在迁移到 openUBMC 时,需保证签名链一致。

您提到:

“出包固件后,V2 可以刷当前更新的固件”,说明 25.09.01.09 本身是可以被接受的 —— 但后续升级失败,可能是 25.09.1.28 未正确签名

:small_blue_diamond: 建议:

  • 使用社区提供的签工具(如 Bingo 的 signing module)对 .hpm 包签名;
  • 检查是否包含 Signature_Verify_CBB_Library 依赖项;
  • 查看日志中是否有:
    verify signature failed
    invalid upgrade package
    

原因 3:版本号未变更,系统认为已是最新版本

【search result #2】Q1 明确指出:

“版本号没变化请直接咨询子固件组件,固件管理不修改版本号内容。”

openUBMC 的 firmware_mgmt 模块 仅展示版本号,不主动更新它
如果您的新包(25.09.1.28)其内部版本标识仍为 25.09.01.09,系统将判定“无需升级”。

:small_blue_diamond: 解决方法:

  • 确保新固件包的版本号已通过 service.jsonversion.xml 正确设置;
  • 构建前检查版本字段是否递增;
  • 可手动查询当前版本:
    ipmcget -d v
    

原因 4:主备分区未正确倒换 / 升级策略错误

某些 BMC 系统采用 A/B 分区机制(主/备),升级时写入备用分区,重启后切换。

您当前“主备分区都是 25.09.01.09”,表明:

  • 要么升级操作写入的是同一个分区(未使用备用区);
  • 要么生效机制未触发分区切换;
  • 或升级被设计为“仅增量更新”,但检测逻辑错误。

:small_blue_diamond: 推荐检查:

  • 是否支持 主备分区倒换 功能;
  • 是否在升级完成后执行了“激活”操作;
  • 或尝试强制指定升级目标分区。

原因 5:系统文件损坏导致写入失败

从知识库 Firmware_Upgrade_Failure 描述可知:

“升级失败是因写入 flash 内存失败,mtd_api.write 方法阻塞”。

如果系统 MTD(Memory Technology Device)设备异常,可能导致:

  • 固件写入一半失败;
  • 重启后恢复旧版本;
  • 日志中出现超时或 I/O 错误。

三、解决方案与操作建议

:white_check_mark: 1. 验证当前构建流程完整性

步骤 操作
确认 firstboot.sh 修改位于 build/product/BMC/openUBMC/... 源路径
执行 bingo clean && bingo build 完全重建
解压输出的 .hpm 文件,检查 firstboot.sh 是否包含修改
确保 .hpm 包由社区签名工具签名

:white_check_mark: 2. 确保新固件版本号正确且唯一

  • 修改 service.jsonCHANGELOG.md 中的版本字段;
  • 例如升级为 25.09.1.28,确保构建时此值嵌入镜像元数据;
  • 查询方式:
    ipmcget -d v
    # 或查看 /etc/version 文件
    

:white_check_mark: 3. 检查 firmware_mgmt 是否正常处理升级

tail -f /var/log/app.log | grep -i firmware

关注日志中是否存在:

Upgrade (xxx.hpm) started
Validate signature successfully
[ERROR] ... failed to write ...
Upgrade completed
Register to resource tree

若发现错误,请根据具体报错定位组件(如 bmc_upgrade, mtd_api)。


:white_check_mark: 4. 尝试命令行升级方式(绕过 Web 前端 Bug)

Web 界面有时存在“假成功”提示。建议使用命令行升级验证:

# 将 .hpm 文件上传至 /tmp
scp TS02F-F50-S920X20-openUBMC-25.09.1.28.hpm root@bmc:/tmp/

# 登录 BMC 使用 ipmitool 或本地升级命令
ipmcset -t fwupdate -d upgrade -v /tmp/TS02F-F50-S920X20-openUBMC-25.09.1.28.hpm

观察返回码和日志输出。


:white_check_mark: 5. 确保升级前后清除旧状态

# 清除当前升级状态(避免残留)
ipmcset -t fwupdate -d clear

# 查看当前状态
ipmcget -t fwupdate -d status

避免处于 UPGRADINGERROR 状态导致新升级被拒绝。


:white_check_mark: 6. 检查证书导入脚本是否可执行

即使 firstboot.sh 被写入,也需保证:

  • 权限为可执行(chmod +x);
  • 所需目录 /opt/bmc/conf/ 存在;
  • ipmcset certificate import 命令语法正确;
  • SSL.p12 文件格式合法。

建议添加日志输出调试:

echo "$(date): 开始执行 firstboot.sh" >> /tmp/debug.log
echo "$(date): 复制证书..." >> /tmp/debug.log
cp /opt/bmc/conf/SSL.p12 /tmp/SSL.p12 && echo "复制成功" >> /tmp/debug.log || echo "复制失败" >> /tmp/debug.log
echo "$(date): 导入证书..." >> /tmp/debug.log
ipmcset -t certificate -d import -v /tmp/SSL.p12 1 Admin@aa eon456 >> /tmp/cert_import.log 2>&1
echo "$(date): 导入完成" >> /tmp/debug.log

然后查看 /tmp/debug.log 判断哪一步失败。


四、总结与建议

问题 原因 解决方案
rootfs_user 修改不生效 构建流程未重新打包或路径错误 清理缓存 + 重新构建 + 验证 .hpm 内容
无法升级到新版本 签名失败、版本号未变、firmware_mgmt 注册失败、分区未切换 检查日志、签名包、版本号、使用 CLI 升级
重启后版本不变 升级未真正写入或未激活 强制清除状态,尝试命令行升级
缺少 log 文件 脚本未运行 添加调试日志,确认 firstboot.sh 是否被执行

:wrench: 推荐操作流程

  1. 重新构建带修改的新固件包25.09.1.29),确保:
    • 包含 firstboot.sh 修改;
    • 已签名;
    • 版本号高于当前。
  2. 通过命令行升级
    ipmcset -t fwupdate -d clear
    ipmcset -t fwupdate -d upgrade -v /tmp/new_pkg.hpm
    
  3. 观察 /var/log/app.log 输出,确认是否完成 COMPLETED 状态。
  4. 重启后检查版本
    ipmcget -d v
    cat /etc/version
    
  5. 检查 /tmp/debug.log/tmp/cert_import.log 是否生成。

如仍失败,请提供 app.log升级时间段的日志片段,以便进一步定位 bmc_upgradefirmware_mgmt 的具体错误码。

相关链接:

  1. web上无法更新BIOS、BMC等固件包
  2. 我按照“从零开始,玩转openUBMC”搭建环境没有hpm_signer工具,怎么制作和生成过度包?
  3. 升级到openUBMC后,CPU侧无法检测到对应的BMC的存在
  4. OpenUBMC2506 BMC固件升级失败
  5. 固件升级机制及常见问题 | 文档中心 | openUBMC