新建组件调用资源接口函数后,服务无法启动

我们想实现将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生成,仅供参考:
四、总结操作步骤

  1. 修改 service.json:设置 type: application,并指定正确的 deployConfig。
  2. 修改所属进程的 launch_control.json:在 components 列表中添加组件名。
  3. 确认健康检查接口正常,如有依赖其他组件则在 systemd 配置中定义依赖关系。
  4. 重新编译并部署组件,重启 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),请确认构建时已正确开启,否则可能未打包进系统。

四、总结操作步骤

  1. 修改 service.json:设置 type: application,并指定正确的 deployConfig。
  2. 修改所属进程的 launch_control.json:在 components 列表中添加组件名。
  3. 确认健康检查接口正常,如有依赖其他组件则在 systemd 配置中定义依赖关系。
  4. 重新编译并部署组件,重启 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

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中内容如下:

目的是在新增南向组件中调用这两个服务函数,实现数据上树,北向组件中获取该数据进行数据显示,这样操作有什么问题吗?

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)

改动源码如下:

改动部分源码.zip (76.4 KB)

这个是我板卡上电后,服务没有启动,之后通过telnet手动执行服务启动后一件收集的日志:

TSTH001_null_19700101-0002.tar.gz (5.6 MB)

麻烦看一下能看出什么问题吗?我新建组件的名称为appIpmbTarget

最终在config.cfg文件中也添加了appIpmbTarget组件名称,服务能正常启动了