openUBMC版本号自定义不生效

问题描述:

定制openUBMC版本号发现不生效

步骤:

1、按新增产品文档在manifest.yml中添加show_version字段:

base字段:
base:

version: “26.04.24.14”
show_version: “1.002.0000001.0.260428”

tosupporte字段:

tosupporte:
default:
package_name: “openUBMC/openUBMC-DH_${version}.zip”
build_type: release
show_version: “1.002.0000001.0.260428”
files:

打包许可证书,由维护者更新

  • file: ${product}/License.md
  • file: ${board_path}/version.xml
  • file: “${output_path}/rootfs_${board_name}.hpm”
    dst: openUBMC-DH_${version}.hpm

编译命令:

bmcgo publish -bt=release --stage stable -b openUBMC

编译成功,升级该固件后BMC主页显示BMC版本还是26.04.24.14,请问一下应该在哪里定制并使其生效?

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

:white_check_mark: 总结:使版本定制生效的关键步骤

  1. 明确目标:修改的是运行时显示的版本号,不是包名。
  2. 定位源头:版本号来自 /etc/version.json 中的 openUBMCVersion
  3. 修改源文件:在构建过程中确保生成正确的 version.json
  4. 验证输出包:解压 HPM 检查是否已更新。
  5. 升级后验证:使用 ipmcget -d --versioncat /etc/version.json 确认生效。
点击此处查看详细分析解答

openUBMC版本号定制不生效问题分析与解决方案

根据您提供的问题描述,您尝试通过 manifest.yml 文件中的 show_version 字段来自定义 openUBMC 的显示版本号(即“1.002.0000001.0.260428”),但在升级固件后,Web界面仍显示为默认的 BMC Firmware Version: 26.04.24.14,说明版本号定制未生效。以下从机制分析和解决建议两个方面进行详细说明。


:magnifying_glass_tilted_left: 一、问题原因分析

1. show_version 字段的作用范围

在 openUBMC 构建系统中,manifest.yml 中的 show_version 通常用于:

  • 定义输出包的命名格式(如 HPM、ZIP 文件名)
  • 作为构建过程中的元数据标识

show_version 并不会自动注入到 BMC 运行时的版本信息中。BMC 主页上显示的“BMC版本”来源于运行时组件读取的版本字符串,通常来自以下位置之一:

  • /etc/version.json
  • version.xml
  • 固件内部硬编码字段
  • bmc.kepler.Systems.Sms.Sms.Version 等 D-Bus 接口暴露的属性

因此,仅修改 manifest.ymlshow_version 不会影响最终界面显示的版本号。


2. 关键文件:version.json 是版本来源的核心

根据知识库信息,version.json 是 openUBMC 构建系统中用于存储和同步版本信息的关键配置文件,路径通常为:

build/rootfs/etc/version.json

该文件内容示例:

{
  "openUBMCVersion": "26.04.24.14",
  "BMCSDKVersion": "5.10.0.0"
}

:white_check_mark: 结论

BMC Web界面显示的版本号实际上是从 version.json 中读取的 openUBMCVersion 字段决定的,而非 manifest.ymlshow_version


3. version.xml 的作用有限

尽管您在 files 中包含了 ${board_path}/version.xml,但除非 BMC 的版本管理组件明确从该文件读取版本号(目前多数情况下不直接使用),否则它不会影响运行时版本。


4. 构建系统与运行时的分离

即使打包命令执行成功(bmcgo publish ...),如果构建流程没有将 show_version 正确写入 version.json,那么新版本号就不会出现在最终镜像中。这属于 “构建逻辑未联动” 的问题。


:white_check_mark: 二、解决方案:如何正确实现版本号定制并生效

要使自定义版本号(如 1.002.0000001.0.260428)在 BMC 界面正确显示,需完成以下步骤:


:white_check_mark: 步骤 1:确保 version.json 被正确生成或覆盖

方案 A(推荐):在构建脚本中动态写入 version.json

在构建流程中(如 build.sh 或定制化脚本),添加逻辑以覆盖默认的 version.json

cat > ${BUILD_ROOT}/rootfs/etc/version.json << EOF
{
  "openUBMCVersion": "1.002.0000001.0.260428",
  "BMCSDKVersion": "5.10.0.0"
}
EOF

:pushpin: 注意:必须确保此操作发生在镜像打包前,且路径与实际构建路径一致。


方案 B:将客户版 version.json 放入定制仓的 dataset 目录

在您的产品定制仓库中:

customization_repo/
├── dataset/
│   └── version.json  ← 自定义版本文件
└── build/
    └── customization.py

然后在 customization.py 中确保该文件被复制到目标路径 /etc/version.json


:white_check_mark: 步骤 2:验证最终镜像中是否包含正确版本

解压生成的 .hpm 或挂载 rootfs.img,检查文件:

/etc/version.json

确认其内容已更新为:

"openUBMCVersion": "1.002.0000001.0.260428"

:white_check_mark: 步骤 3:通过接口或命令验证运行时版本

升级固件并重启 BMC 后,可通过以下方式验证版本是否更新:

方法 1:使用命令行查看版本

ipmcget -d --version

或查看文件:

cat /etc/version.json

方法 2:通过 D-Bus 查看版本接口

busctl get-property bmc.kepler.Systems.Sms.Sms Version

:light_bulb: 如果此值仍为旧版本,则说明 version.json 未被正确加载或组件未适配读取逻辑。


:white_check_mark: 步骤 4:(可选)检查是否有北向接口缓存或前端硬编码

某些 Web UI 前端可能缓存了版本号或从固定路径读取。需确认前端是否是从以下 Redfish 接口获取版本:

GET /redfish/v1/Managers/bmc

响应中应包含:

"FirmwareVersion": "1.002.0000001.0.260428"

如果不是,请检查 bmc.kepler.Managers.Manager.FirmwareVersion 属性是否绑定到了正确的源。


:hammer_and_wrench: 三、补充建议与最佳实践

建议项 说明
避免手动修改 manifest.ymlshow_version 作为唯一手段 它仅影响包名和日志标识,不控制运行时行为
将版本定制逻辑集中到 dataset/version.json 或构建脚本中 保证版本来源唯一、可控
在版本号变更后清空构建缓存 使用 bmcgo clean 防止旧文件残留
参考社区文档《多层级定制配置指南》 特别是客户/产品层级的配置合并机制

:link: 参考资料:multi_level_customization_configuration_guide.md


:red_question_mark: 四、常见误区澄清

误区 正确认知
修改 manifest.ymlshow_version 能改变运行时版本 :cross_mark: 仅影响包命名
version.xml 控制 BMC 显示版本 :warning: 一般不会被直接读取,除非特别配置
重新打包 ZIP/HMP 就能更新版本 :cross_mark: 若源文件未变,内容不变

:white_check_mark: 总结:使版本定制生效的关键步骤

  1. 明确目标:修改的是运行时显示的版本号,不是包名。
  2. 定位源头:版本号来自 /etc/version.json 中的 openUBMCVersion
  3. 修改源文件:在构建过程中确保生成正确的 version.json
  4. 验证输出包:解压 HPM 检查是否已更新。
  5. 升级后验证:使用 ipmcget -d --versioncat /etc/version.json 确认生效。

:white_check_mark: 最终建议操作指令示例

# 在构建脚本中添加
echo '{
  "openUBMCVersion": "1.002.0000001.0.260428",
  "BMCSDKVersion": "5.10.0.0"
}' > $OUTPUT_PATH/rootfs/etc/version.json

# 构建
bmcgo publish -bt=release --stage stable -b openUBMC

执行上述操作后,升级固件即可看到正确版本号。