基于2509 openUBMC版本构建的BMC
发现在OS下电的情况,重启BMC,BMC启动完成后,thermal_mgmt组件中获取的电源状态都是ON,必现问题。
在社区发现一个相关问题的修改记录:
修复获取上下电状态概率性有误问题-thermal_mgmt-AtomGit | GitCode
请问service.json中的修改是必须的么?这个修改起什么作用。
我这样改了service.json后,bmcgo gen不通过:
基于2509 openUBMC版本构建的BMC
发现在OS下电的情况,重启BMC,BMC启动完成后,thermal_mgmt组件中获取的电源状态都是ON,必现问题。
在社区发现一个相关问题的修改记录:
修复获取上下电状态概率性有误问题-thermal_mgmt-AtomGit | GitCode
请问service.json中的修改是必须的么?这个修改起什么作用。
我这样改了service.json后,bmcgo gen不通过:
答案内容由AI生成,仅供参考:
thermal_mgmt组件电源状态获取失败问题分析与解决根据您提供的信息,您在基于 openUBMC 25.09 版本构建的 BMC 系统中,遇到 thermal_mgmt 组件在 OS 下电并重启 BMC 后,电源状态始终读取为 ON 的问题。这是一个已知问题,社区已有相关的修复尝试,但您尝试应用修改后遇到了 bmcgo gen 生成失败的情况。
下面将基于上下文信息进行详细分析和解答。
现象:
在服务器处于 OS 下电状态时,重启 BMC。BMC 启动完成后,thermal_mgmt 组件仍然认为电源状态为 ON,导致风扇控制策略错误(例如,应进入节能模式却仍在全速运行)。
触发条件:
影响:
热管理策略失效,可能导致:
thermal_mgmt 如何获取电源状态?thermal_mgmt 作为 BMC 中负责温度监控与风扇控制的核心服务,依赖系统事件和硬件信号来判断当前系统的电源状态。
在 OpenUBMC 架构中,电源状态通常由以下几个来源判断:
PWRGD(Power Good)、ACOK 等/bmc/kepler/PowerSupply/... 等 D-Bus 路径下的对象状态
关键点:当 BMC 重启时,如果 host_agent 没有运行或还未上报电源状态,而
thermal_mgmt又没有从底层硬件准确获取真实电源状态,则可能默认使用历史缓存或假定为 ON。
您提到的 Git 修改涉及 service.json 文件的变更:
"codeGenPolicy": {
- "version": "19"
+ "version": "20"
}
同时还提升了版本号:
- "version": "1.70.114"
+ "version": "1.70.115"
是的,"codeGenPolicy": {"version": "20"} 的修改是有功能意义的,理由如下:
codeGenPolicy.version 是 bmcgo gen 工具生成代码时所依据的代码生成策略版本。codeGenPolicy.version 升级到 20,意味着该组件使用了更新的模板和代码生成规则,很可能是为了解决对象初始化时机过早的问题。
举例:在 codeGenPolicy v20 中,可能引入了对
power state事件延迟订阅、或更精准的host power state监听机制,使其在 host_agent 尚未启动时不轻易假定电源状态。
因此,该修改并非随意版本提升,而是为了适配新的初始化逻辑。
bmcgo gen 不通过?bmcgo gen -r openubmc_dev 命令失败的根本原因很可能是:
ipmi.json或model.lua文件结构不符合codeGenPolicy.version=20所需的格式要求。
bmcgo gen 工具会根据 service.json 中的 codeGenPolicy.version 选择对应的解析器。ipmi.json、model.lua)仍为旧版结构,则会出现:
"entity": "bmcgo gen -r openubmc_dev",
"description": "生成基于 ipmi.json 的 IPMI 接口代码"
表明 bmcgo 的正常工作依赖 ipmi.json 的格式一致性。检查 ipmi.json 是否同步更新
确保您的本地仓库中 ipmi.json 支持 codeGenPolicy.version=20 所需的字段结构。
查看是否有配套的 model.lua 修改
上下文中提到 gen/class/model.lua 也被修改(+361 -21),说明生成模型发生了较大变动。必须一并合并这些变更。
确认是否需要重新生成 ORM 定义文件
有些版本的生成策略会要求重新调用脚本生成 json_types 目录下的定义文件。
使用一致的分支/标签构建
建议切换到修复该问题的完整分支(如 AtomGit/GitCode 上发布的 PR 分支),而不是手动拼接部分文件改动。
| 步骤 | 操作 | 说明 |
|---|---|---|
| 1 | 完整拉取修复补丁分支 | 避免手动修改导致不一致 |
| 2 | 确保 service.json, ipmi.json, model.lua, NodeLocation.lua 等文件版本同步 |
尤其关注 codeGenPolicy.version=20 需要的配套结构 |
| 3 | 执行 bmcgo gen -r openubmc_dev 之前,清理缓存 |
可尝试删除 gen/ 下相关中间文件 |
| 4 | 检查 thermal_mgmt 初始化日志 |
是否在 micro_component.lua 记录了 InitCompleted 状态,以及是否监听了正确的电源信号 |
| 5 | 验证电源状态更新机制 | 在 BMC 启动后,查看是否收到 host power state changed 事件 |
micro_component.lua 的作用micro_component.lua 是 Lua 脚本,用于跟踪微组件(如 thermal_mgmt)的生命周期状态。
它记录从 "Starting" 到 "InitCompleted" 的转变,并支持系统启动诊断。
如果 thermal_mgmt 在电源状态未确定前就完成初始化(进入 InitCompleted),就会固定一个错误的状态。
修复方法通常包括:
FruCtrl 或 host_agent 发出的电源状态变更信号host_agent 与 thermal_mgmt 的关系"host_agent" shares thermal state updates with "thermal_mgmt" to ensure coordinated system monitoring.
这意味着 thermal_mgmt 应该订阅来自 host_agent 的电源状态信号。如果未正确绑定,则会错过 OS 下电通知。
| 项目 | 说明 |
|---|---|
| 问题性质 | 已知 Bug:thermal_mgmt 在 BMC 重启后未能正确获取实际电源状态 |
| 根本原因 | 初始化过早,未等待 host_agent 上报真实状态或未监听底层硬件信号 |
| 社区修复有效性 | 修改 codeGenPolicy.version=20 是必要的,代表采用新生成策略支持正确初始化流程 |
bmcgo gen 失败原因 |
文件版本不匹配(如 ipmi.json 或 model.lua 未同步更新) |
是否必须修改 service.json |
codeGenPolicy.version 的升级是实现新初始化逻辑的前提 |
ipmi.json, model.lua, service.json, NodeLocation.lua)bmcgo gen -r openubmc_dev 前清除中间文件thermal_mgmt 日志中电源状态是否读取为 OFF
参考链接:
- https://discuss.openubmc.cn/t/topic/1698(社区讨论)
bmc.kepler.pcie_devicetimeout 可能干扰初始化,请排查服务依赖问题
如仍有 bmcgo gen 错误,请提供具体报错日志,以便进一步定位 schema 冲突位置。
相关链接:
请看一下问题描述 我们现在是必现,这两天复现了几十次,每次都复现成功了。
我看实际代码修改里并没有修改mds下的属性或者配置,是否可以认为gen对这个问题来说不是必要的?我只合入以下修改:
问题依然存在,还是必现。
还是说涉及闭源组件的修改,必须整体更新到2512版本才能修复。
请提供日志
经确认为历史问题,需进行以下策略修改:
在文件:src/lualib/basic_cooling/data_keeping/fructl_data_keeping.lua修改如下,新增对象添加完成回调函数
function fructl_data:action_after_obj_added(path, interface)
log:notice('‘) – 此处可用于日志记录,方便后续问题定位
self.power_state = self.objs\[path\]\[interface\]\[props.FRUCTL.POWER_STATE\]
end
原因:监听仅针对属性变化进行监听,当电源上下电状态未发生变化时,重启BMC后无法获取到真实值,需在对象添加完成的回调中进行对应属性的刷新