答案内容由AI生成,仅供参考:
总结
| 项目 |
内容 |
| 核心问题 |
新构建版本引入 Secure LiFW 和 tpqm 模块,导致关键服务(如 iam)启动失败,触发系统自动回退机制 |
| 根本原因 |
安全模块与当前硬件平台或配置不兼容,且分区挂载顺序异常加剧系统不稳定 |
| 解决方案 |
移除 tpcm/tpqm/LiFW 相关组件 → 修复分区挂载逻辑 → 检查 iam 服务状态 → 调试期间关闭回退机制 |
| 预防建议 |
在 CI 构建阶段增加“服务完整性检测”脚本,确保 bmc.kepler.iam 等核心服务可注册并启动 |
点击此处查看详细分析解答
openUBMC社区版本构建后上机重启回退问题分析与解决方案
根据您提供的问题描述、环境信息、日志对比及上下文数据,以下是对“使用社区最新manifest构建成功但上机验证时出现重启回退”问题的全面分析与解决方案。
问题概述
- 问题现象:使用社区最新
manifest 构建的 openUBMC 固件(debug/release)在实际设备(硬件型号1711)上部署后,系统反复重启并最终自动回退到旧版本。
- 软件版本:
openUBMC2603
- 硬件平台:
1711
- 关键线索:BMC串口日志中显示存在
Secure LiFW Start 启动项、tpqm 配置错误、分区挂载顺序异常等差异。
根本原因分析
结合日志对比与知识库内容,可归纳出以下核心问题点:
1. Secure LiFW 模块引入导致启动异常
相关证据:tpqm(可信平台模块管理服务)报错为 unknown deployConfig,说明配置文件缺失或格式不兼容。
2. 启动配置中 tpcm/tpqm 组件未正确适配
尽管您已尝试删除 tpcm 启动配置,但日志仍提示 tpqm 错误。这表明:
- 构建系统中仍然保留了与可信计算相关的二进制组件或依赖项。
deployConfig 加载失败,意味着这些组件尝试运行但因配置缺失而崩溃,进而影响 devmon 或核心服务(如 iam)启动。
高危风险:若 iam(身份访问管理)组件因依赖缺失无法启动,会触发 BMC 主控进程 bmc_core 主动自杀重启(见知识库文档 chunk #1)。
3. 分区挂载顺序异常引发系统状态混乱
| 项目 |
正常 |
异常 |
| 分区挂载顺序 |
mmcb1k0gp0 → gp1 → gp2 |
mmcb1k0gp2 → gp0 → gp1 |
这表明 UBI(Unsorted Block Images)布局或启动参数不一致,可能导致:
- 关键配置文件加载路径错误(如
/etc, /var/log, /data);
- 持久化数据读取异常,影响服务状态判断;
persistence 任务报错(A storm occurs in table t_fructrl_tb,见知识库);
- 进一步触发系统判定为“升级失败”,启动自动回退机制。
4. devmon 服务行为异常(反常成功)
| 项目 |
正常 |
异常 |
| devmon 状态 |
多次 FAILED |
启动成功 |
表面看似“改善”,但结合上下文反推:
devmon 是硬件设备监控守护进程。
- 在正常系统中,它应在所有依赖准备就绪后才成功启动;若提前成功,可能是因为跳过了某些校验步骤(例如因缺少
tpcm 驱动而绕过安全检查)。
- 此种“伪成功”会导致后续其他组件依赖缺失,最终整体系统不稳定。
5. 系统具备自动回退机制
从知识库中可确认以下机制存在:
自动回退触发条件包括:
- 升级后功能验证失败;
- 新版本运行异常(如内存泄漏、服务未启动);
- 兼容性测试不通过;
- 用户或系统手动触发回退。
如文档 #2 所述:“升级成功后BMC起不来,然后自动回退成原来5月份的版本。重启原因是bmc_core中的event组件存在内存泄漏”。
在本例中,即使构建和烧录成功,但由于关键组件(如 iam)无法稳定运行,系统通过健康检测机制判定升级失败,触发自动回退。
解决方案建议
方案一:移除可信模块相关配置与组件
1. 修改构建配置,禁用 tpcm/tpqm/LiFW
在 manifest.yml 或相应 layer 的 local.conf 中添加:
DISTRO_FEATURES_remove = " tpcm tpqm secure_lifw "
PACKAGE_EXCLUDE += "tpcm-daemon tpqm-utils lifw-loader"
2. 检查并清理启动脚本中的安全模块加载
检查以下文件是否含有自动启动脚本:
/etc/init.d/tpcm
/lib/systemd/system/tpqm.service
- 启动脚本中
source 或 exec 的 LiFW 相关注入逻辑
若存在且非必要,注释或删除。
方案二:校验并修复 UBI 分区映射与挂载逻辑
1. 确认 mtd 分区定义一致性
确保 dts 文件中定义的 flash 分区与实际烧录工具匹配:
partition@0 {
label = "gp0";
reg = <0x0 0x800000>;
};
...
2. 检查 fstab 或 ubootenv 中的默认启动分区
cat /etc/fstab
# 应明确设定 rootfs 从哪个 MTD 分区挂载
建议强制指定 root=mtd:gp0 或使用 label(如 root=ubi0:rootfs)。
方案三:启用调试模式,捕获 iam 实际启动失败原因
添加调试命令查看 iam 是否真的正常运行:
systemctl status bmc.kepler.iam
journalctl -u bmc.kepler.iam --no-pager
如果日志中出现:
The name bmc.kepler.iam was not provided by any .service files
参考知识库 chunk #1,这是典型的 DBUS 服务注册失败,通常是由于:
- 二进制文件缺失;
- 依赖库(如 OpenSSL TPM engine)加载失败;
- AppArmor/SELinux 限制;
- 配置文件权限错误。
解决方法:
find /usr/lib/systemd/system -name "*iam*"
ls -l /usr/bin/bmc-iam-daemon
ldd /usr/bin/bmc-iam-daemon | grep "not found"
方案四:临时关闭自动回退机制以定位问题
注意:仅用于调试,生产环境慎用!
临时禁用回退
ipmcset -d rollback disable
或通过 DBus 调用:
busctl call bmc.kepler.UpdateService /bmc/kepler/UpdateService bmc.kepler.UpdateService SetTimeoutPolicy u 0
如知识库 firmware_mgmt.md 所述,TimeoutPolicy=0 表示超时不采取复位动作。
验证步骤建议
| 步骤 |
操作 |
目的 |
| 1 |
使用修改后的配置重新构建镜像 |
排除可信模块干扰 |
| 2 |
刷机后通过串口观察是否仍有 Secure LiFW Start 输出 |
验证模块是否彻底移除 |
| 3 |
检查 dmesg 和 journalctl 输出 |
查看分区挂载是否恢复为 gp0 → gp1 → gp2 |
| 4 |
执行 systemctl list-units --state=failed |
检查是否有服务失败 |
| 5 |
查看 bmc_core 是否再次触发 KILL self |
判断升级是否通过健康检查 |
总结
| 项目 |
内容 |
| 核心问题 |
新构建版本引入 Secure LiFW 和 tpqm 模块,导致关键服务(如 iam)启动失败,触发系统自动回退机制 |
| 根本原因 |
安全模块与当前硬件平台或配置不兼容,且分区挂载顺序异常加剧系统不稳定 |
| 解决方案 |
移除 tpcm/tpqm/LiFW 相关组件 → 修复分区挂载逻辑 → 检查 iam 服务状态 → 调试期间关闭回退机制 |
| 预防建议 |
在 CI 构建阶段增加“服务完整性检测”脚本,确保 bmc.kepler.iam 等核心服务可注册并启动 |
参考资料
- [devmon特性设计说明书] — 自动回退机制说明
- [升级常见问题指南] — 提及“升级成功但回退”的案例(ID: #2)
firmware_mgmt 接口文档 — Rollback, TimeoutPolicy, UpgradeFinishSignal
openUBMC 社区讨论记录 — 昆仑太科_安阳阳 解决升级失败问题的经验
社区建议:若此问题普遍存在于 openUBMC2603 的社区包,请向社区提 issue,请求将 tpcm/tpqm 设为可选 feature,默认关闭。
如需进一步协助(例如分析完整的 .txt 日志文件),欢迎上传具体内容片段。