由于event_def.json版本较高,导致自定义事件没有被触发

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

关于 event_def.json 版本控制与自定义事件触发问题的分析与建议

根据您提供的背景信息和相关上下文,以下是对该问题的全面分析与解答。

问题描述

在 openUBMC 25.09 版本中,用户按照社区文档配置了自定义事件(Custom Event),并通过 setprop 模拟事件触发,但发现事件未能正常上报。经排查,原因为环境中存在高版本的 event_def.json 文件,导致 /data/opt/bmc/conf/ 路径下的备份配置未被更新,系统加载的是旧版本或不匹配的事件定义,从而造成自定义事件无法注册和触发。

目前临时解决方案为:

  • 手动将 /opt/bmc/conf/event_def.json 拷贝至 /data/opt/bmc/conf/
  • 重启 openUBMC 服务

否则,即使主路径文件已更新,系统仍可能因版本比对机制而拒绝更新备份文件。


核心原因分析

1. event_def.json 的作用机制

event_def.json 是 openUBMC 系统中 事件管理系统的核心配置文件,位于 /opt/bmc/conf/event_def.json,其主要功能包括:

  • 定义所有支持的系统事件码(EventCode)
  • 提供事件的元数据:如 EventKeyId、严重等级、告警描述、处理建议等
  • 作为事件注册时的校验依据 —— 若某事件在 event_def.json 中无定义,则 Event 管理模块会拒绝注册该事件,并打印 [error_msg: no definition]

:white_check_mark: 参考文档:事件定制 | openUBMC

2. 双路径配置机制与版本控制

openUBMC 采用了“运行时配置” + “持久化备份”的双路径设计:

路径 用途 是否易失
/opt/bmc/conf/event_def.json 编译打包时内置的静态配置文件 是(升级覆盖)
/data/opt/bmc/conf/event_def.json 运行时使用的实际配置文件,支持动态更新 否(持久存储)

系统启动时会进行版本比对:

  • 如果 /data/.../event_def.json 的版本号 高于等于 /opt/... 的版本,则使用 /data/... 的文件
  • 否则,用 /opt/... 文件覆盖 /data/...

这就解释了为何即使您修改了 /opt/bmc/conf/event_def.json,若 /data/opt/bmc/conf/event_def.json 版本更高,新配置也不会生效 —— 系统选择了高版本文件作为权威来源

:pushpin: 相关日志证据:

unknown_service ERROR: main.lua(121): load event def file, and will use empty config, because ./opt/bmc/apps/event/lualib/event_common.lua:1003: decode: json object decode failed

此错误表明 event_def.json 加载失败,可能是版本不一致、格式错误或文件损坏。


为什么自定义事件未被触发?

结合知识库内容和实际案例,可能的原因如下:

原因 说明 排查方式
:white_check_mark: event_def.json 版本未更新 如您所述,高版本备份文件未被覆盖,导致新事件未被识别 检查两个路径下文件版本号是否一致
:red_circle: event_def.json 格式非法 JSON 语法错误、编码问题、字符截断等导致 json.decode 失败 使用 jsonlint 验证文件合法性
:red_circle: eventDefList.txt 未包含新增 EventKeyId eventDefList.txt 是事件筛选清单,用于从基础库中提取启用事件 确认是否添加了 BMC.VoltHigherNoneCritical 等新事件
:red_circle: 未更新 version 字段 修改 event_def.json 后未更新版本号,构建系统认为无变更 构建前需手动递增版本号(如 1.0.0 → 1.0.1
:red_circle: 组件未正确引用 Component 对象 Event 中 Component 字段必须指向有效的 D-Bus 路径对象 检查是否注册了对应的 Component_PCIeCard 等对象

:white_check_mark: 成功案例参考(文档 Chunk 3):

“重新查看事件定制文档...发现是要更新event_def.json的版本号,更新后可以触发了”

当前机制的问题点

您提出的质疑非常合理,以下是现有机制存在的主要问题:

问题 描述
:cross_mark: 调试体验差 开发者修改配置后需手动拷贝、重启,且易忽略版本比较逻辑
:cross_mark: 预期行为不符 用户期望“以 /opt/bmc/conf/ 为准”,但系统选择“以 /data/ 高版本为准”
:cross_mark: 缺乏提示机制 即使版本不一致,系统也无明确告警,仅静默加载旧文件
:cross_mark: 不利于快速迭代 在调试阶段频繁修改事件定义时效率低下

官方是否计划优化?

目前尚无明确官方公告表示将更改此行为,但从 openUBMC 社区的演进趋势来看,已有若干改进方向值得关注:

:white_check_mark: 改进方向一:构建系统自动版本递增

未来构建流程中可通过脚本自动检测 event_def.json 内容变更,并自动递增其 version 字段,避免人为遗漏。

示例(来自搜索结果 1):

“新 VPD 构建后,产品仓(如 Kunpeng 仓)也需同时 build,才能保证生效新版本”

:white_check_mark: 改进方向二:增加启动日志提示

当前仅在加载失败时报错,未来可增加如下日志以提升可维护性:

[INFO] Using event_def.json from /data/... due to higher version (1.2.0 > 1.1.0)
[WARNING] Custom events in /opt/bmc/conf/ may not take effect unless version is incremented

:white_check_mark: 改进方向三:提供强制刷新接口

建议增加 CLI 或 Redfish API 接口用于强制刷新运行时配置,例如:

bmcctl event reload --force

或通过 Redfish 提交任务:

POST /redfish/v1/UpdateService
{
  "ImageURI": "/event_def.json",
  "ForceUpdate": true
}

建议与最佳实践

为规避此类问题,建议采取以下措施:

:white_check_mark: 1. 始终递增 event_def.json 版本号

{
  "Version": "1.0.1",  // 每次修改后递增
  "Events": [ ... ]
}

:white_check_mark: 2. 确保 eventDefList.txt 包含新事件

在项目路径下维护正确的事件白名单:

# vendor/eventDefList.txt
BMC.VoltLowerNoneCritical
BMC.VoltHigherNoneCritical

:white_check_mark: 3. 构建后验证生成文件

检查编译产物中是否正确生成新的 event_def.json

find build -name event_def.json -exec cat {} \;

:white_check_mark: 4. 调试时强制同步文件

自动化脚本示例:

#!/bin/bash
cp /opt/bmc/conf/event_def.json /data/opt/bmc/conf/
systemctl restart openubmc-event.service

:white_check_mark: 5. 增加校验钩子(hook)

在升级脚本中加入校验逻辑:

if [[ "$(jq -r .Version /opt/bmc/conf/event_def.json)" > "$(jq -r .Version /data/...)" ]]; then
  cp /opt/bmc/conf/event_def.json /data/...
fi

结论

是的,您对机制的理解是正确的:现行逻辑确实可能导致调试困难,且不符合开发者的直觉预期。

虽然目前 openUBMC 的设计是出于生产环境稳定性的考虑(防止低版本配置覆盖高版本),但在开发与测试场景下,它带来了显著的调试障碍。

我们建议:

  1. 短期:严格遵循“每次修改递增版本号 + 强制拷贝”流程;
  2. 中期:推动社区引入 --force-reload 接口或构建时自动版本管理;
  3. 长期:优化配置合并策略,区分“开发模式”与“生产模式”的加载行为。

该问题已在多个开发者反馈中出现(如 Chunk 1, 3, 8, 10),未来有望在 openUBMC 后续版本中得到改进。

相关链接:

  1. 【问题求助】拔电源线/风扇未产生冗余及输出告警
  2. 伙伴想在自己的机器上验证openUBMC25.03的功能,应该怎么测啊,没有对应特性的用例
  3. OS下用reboot命令和BMC的页面点重启BMC,系统事件提示的有歧义
  4. 自定义事件触发问题
  5. 事件定制 | 文档中心 | openUBMC