我们想实现将ipmb上的数据通过网页进行显示的功能,信息传递以IPMI标准指令get device id/get device sdr/get sensor reading为主
北向接口webui组件新增了显示信息,通过更改webui和rackmount组件,在rackmount中生成仿真数据,能正常显示仿真值
南向接口中,新建组件,在组件中调用资源写作接口,通过将仿真数据赋值给资源写作接口属性进行数据上树,
我在mdb_interface组件中进行组件接口注册,并编译正常,按照设计,网页中能够显示仿真数据,但是实际没有任何显示,查看发现新建的组件服务没有启动,
之后只能手动输入systemctl start XX 才能启动服务,请问怎么才能使服务自启动?我还需要改哪些组件吗?
环境信息
操作系统:[如 Ubuntu 24.04]
软件版本:[如 OpenUBMC2506]
硬件配置:[如 CPU、内存等]
答案内容由AI生成,仅供参考:
四、总结操作步骤
修改 service.json:设置 type: application,并指定正确的 deployConfig。
修改所属进程的 launch_control.json:在 components 列表中添加组件名。
确认健康检查接口正常,如有依赖其他组件则在 systemd 配置中定义依赖关系。
重新编译并部署组件,重启 BMC 或相关进程,观察组件是否自动启动。
如需更详细的组件创建和启动配置示例,请参考文档:
《组件的创建和使用》
《组件启动配置》
《微组件管理介绍》
若完成上述修改后仍无法自启动,建议在组件入口处添加调试日志(如 print("component start")),并检查 framework.log 中的具体报错信息,以便进一步定位。
点击此处查看详细分析解答
根据您描述的问题,新建组件在调用资源接口后服务无法自启动,必须手动执行 systemctl start 才能启动,这通常是由于组件启动配置不完整 或未正确注册到系统启动流程 导致的。以下结合 openUBMC 的启动机制和故障排查经验,为您提供定位和解决方案。
一、openUBMC 服务启动原理
openUBMC 采用 Systemd + Skynet 架构完成服务拉起:
Systemd 负责启动系统服务进程,并管理其生命周期。
组件服务通过 service.json 中的 deployConfig 字段指定对应的 Systemd 配置文件(如 framework.service)。
组件还需要在对应进程的 launch_control.json 中注册,才能被 Skynet 子服务拉起机制识别。
参考文档《组件启动配置》中明确指出:
服务启动借助 Systemd 完成,整个流程中通过定义启动顺序和依赖项完成服务拉起。
您的组件无法自动启动,很可能是因为未满足上述任一注册条件 。
二、使服务自启动需要修改/检查的配置
1. 检查 service.json 中的 type 和 deployConfig 字段
根据《微组件管理介绍》:
type 字段必须为 application(常驻进程组件)。
deployConfig 字段必须指向拉起该组件的 Systemd 配置文件。
例如:如果您的组件归属于 bmc_core 进程,则 deployConfig 应为 framework.service 或对应进程的 service 文件名。
{
"type": "application",
"deployConfig": "framework.service" // 示例,需改为实际进程名
}
2. 在 launch_control.json 中注册组件
《组件无法启动排查》文档指出:
如果是属于某个进程下的组件,service.json 中 deployConfig 字段应填写对应进程的 service 文件名(如 framework.service),并在 launch_control.json 中对应进程的 components 字段中新增组件。
因此,您需要找到所属进程的 launch_control.json,在对应进程的 components 列表中加入您的组件名称,例如:
{
"components": [
"my_app",
"其他组件"
]
}
3. 确认组件健康检查方法已注册
组件启动后,系统会通过 bmc.kepler.MicroComponent 接口周期性地进行健康检查。若健康检查失败(如超时、未响应),Systemd 会尝试重启组件。请确保您的组件实现了健康检查回调(框架自带的微组件框架通常已提供,但如果自定义组件未正确挂载该接口,可能导致启动检查失败)。
4. 检查日志确认启动失败原因
查看 framework.log 或 maca 的日志,关注类似以下报错:
HealthCheck failed | StartupCheck failed | ServiceUnknown
这些通常表示组件未正确注册到 D-Bus 或启动配置缺失。
您也可以手动触发健康检查命令:
busctl --user call bmc.kepler.your_component /bmc/kepler/your_component/MicroComponent bmc.kepler.MicroComponent HealthCheck a{ss} 0
5. 确保组件入口文件(main.lua)被正确加载
组件启动入口由 config:set_start 定义,且入口日志应正常打印。若入口未执行,则配置解析失败,组件不会被拉起。
三、还需要修改哪些组件?
根据您的描述,您已经在 mdb_interface 组件中完成了接口注册,但服务未启动。除上述配置文件外,您还需要考虑:
注册到 MACA 监控列表 :系统启动时 maca 会监控所有组件(日志中可见 monitor component xxx added)。若您的组件未出现在监控列表中,说明未在 maca 的配置中声明。不过根据日志,maca 会在组件注册到 D-Bus 后自动添加,因此核心仍是组件能否被 Systemd 拉起 。
与 rackmount 等业务组件的依赖关系 :若您的组件依赖其他组件的资源接口,需在 service.json 中声明依赖(可通过 requirements 或 systemd 的 After 配置实现),确保启动顺序正确。
组件特性开关 :如果组件在构建时通过 options 控制是否启用(如 enable_firmware),请确认构建时已正确开启,否则可能未打包进系统。
四、总结操作步骤
修改 service.json:设置 type: application,并指定正确的 deployConfig。
修改所属进程的 launch_control.json:在 components 列表中添加组件名。
确认健康检查接口正常,如有依赖其他组件则在 systemd 配置中定义依赖关系。
重新编译并部署组件,重启 BMC 或相关进程,观察组件是否自动启动。
如需更详细的组件创建和启动配置示例,请参考文档:
《组件的创建和使用》
《组件启动配置》
《微组件管理介绍》
若完成上述修改后仍无法自启动,建议在组件入口处添加调试日志(如 print("component start")),并检查 framework.log 中的具体报错信息,以便进一步定位。
这个是手动启动以后的服务状态:
~ # systemctl status appIpmb --no-pager -l
● appIpmb.service - appIpmb service
Loaded: loaded (/etc/systemd/system/appIpmb.service; disabled; vendor preset: enabled)
Active: active (running) since Thu 1970-01-01 00:36:03 CGP; 9s ago
Main PID: 3544 (skynet)
Tasks: 10 (limit: 10413)
Memory: 14.1M
CGroup: /system.slice/appIpmb.service
└─ 3544 /opt/bmc/skynet/skynet /opt/bmc/apps/appIpmb/config.cfg
xp168
(Xp168)
2026 年9 月 5 日 10:53
4
AI机器人答复的比较准确了,重点是组件service.json两个字段和launch_control.json文件。如果还有其它问题,可以看app.log,framwork.log中和新组件相关的报错
查看framework.log,打印如下:
1970-01-01 00:01:29.724991 maca ERROR: init.lua(184): [appIpmb ]StartupCheck failed, error: org.freedesktop.DBus.Error.ServiceUnknown: The name bmc.kepler.appIpmb was not provided by any .service files, check count: 1
1970-01-01 00:01:44.800581 maca ERROR: init.lua(184): [appIpmb]StartupCheck failed, error: org.freedesktop.DBus.Error.ServiceUnknown: The name bmc.kepler.appIpmb was not provided by any .service files, check count: 2
1970-01-01 00:01:59.849213 maca ERROR: init.lua(184): [appIpmb]StartupCheck failed, error: org.freedesktop.DBus.Error.ServiceUnknown: The name bmc.kepler.appIpmb was not provided by any .service files, check count: 3
1970-01-01 00:02:14.896036 maca ERROR: init.lua(184): [appIpmb]StartupCheck failed, error: org.freedesktop.DBus.Error.ServiceUnknown: The name bmc.kepler.appIpmb was not provided by any .service files, check count: 4
1970-01-01 00:02:21.897538 hwproxy WARNING: init.lua(48): [bmc_time] update time failed over 5 times
这个bmc.kepler.appIpmb 服务函数是我在mdb_interface组件中新增的,具体做法是在mdb_interface/json/path/mdb/bmc/kepler/Systems/中新加IpmiDevices
IpmiSensor.json中内容如下:
IpmiDevice.json中内容如下:
目的是在新增南向组件中调用这两个服务函数,实现数据上树,北向组件中获取该数据进行数据显示,这样操作有什么问题吗?
xp168
(Xp168)
2026 年9 月 8 日 13:33
6
1.启动问题:确认 launch_control.json 中配置了 appIpmb ,以及 appIpmb 组件的 service.json 配置正确。确认启动后 framework.log 和 app.log 中是否存在 appIpmb 其它报错
2.资源协作定义看着没问题。
当前改动如下,我的组件名称为appIpmbTarget:
service.json下配置如下图:
launch_control.json下新增了组件信息:
但是上电后,服务还是没有启动,启动阶段app.log中没有显示appIpmbTarget中的信息,启动打印如下log:
app.zip (37.1 KB)
framework.log中打印appIpmbTarget相关内容如下
unknown_service NOTICE: base.lua(89): component[appIpmbTarget ] is detected in the environment
[:00000013] hardware: LAUNCH snlua appIpmbTarget /service/main
00:01:26.139195 maca ERROR: init.lua(184): [**appIpmbTarget]**StartupCheck failed, error: org.freedesktop.DBus.Error.ServiceUnknown: The name bmc.kepler.appIpmbTarget was not provided by any .service files, check count: 1
完整信息如下:
framework.zip (10.2 KB)
这个是我板卡上电后,服务没有启动,之后通过telnet手动执行服务启动后一件收集的日志:
TSTH001_null_19700101-0002.tar.gz (5.6 MB)
麻烦看一下能看出什么问题吗?我新建组件的名称为appIpmbTarget
最终在config.cfg文件中也添加了appIpmbTarget组件名称,服务能正常启动了