maca

版本信息

项目内容
组件版本1.130.9
首发版本openUBMC 26.09
文档作者openUBMC 社区
最后更新2026-09-15
许可证Mulan PSL v2

1. 组件概述

1.1 组件简介

maca(micro & agile component architecture)是 openUBMC 微组件运行框架中的核心管理组件。mds/service.json 将其声明为 applicationdescriptionframework main componentdeployConfigframework.service。它负责收集活动微组件、检查启动/健康/在线状态、维护 MDB 资源树索引,并代理 BMC 强制复位、平滑复位、组件热复位、复位锁、看门狗、日志系统自愈、配置备份和一键收集等系统级能力。

对外注册的 D-Bus 服务名为 bmc.kepler.maca。Release 主对象为:

text
/bmc/kepler/MacaService
/bmc/kepler/MdbService
/bmc/kepler/Managers/${ManagerId}/Package

Debug 构建还可能创建 /bmc/kepler/Debug/LogMock/bmc/kepler/Debug/Performance

源码同时保留独立 maca.service 单元(工作目录 /opt/bmc/apps/macaExecStart 为 Skynet + config.cfg)。目标产品究竟采用 framework 内嵌部署还是独立 systemd 单元,以对应 Manifest 和镜像为准。

组件不提供 IPMI 命令(MDS 中无 ipmi.json)。mds/service.jsonrequired 为空。构建依赖 libmc4luapersistence;测试依赖含 mdb_interfacehwproxy 等。

1.2 解决什么问题

  • 统一管理微组件生命周期:发现常驻组件,识别启动失败、健康异常和连续掉线,并按策略重启子系统或复位 BMC。
  • 提供一致的系统复位入口:把强制复位、平滑复位、组件热复位、最小系统启动、复位原因和复位锁收敛到 bmc.kepler.SystemControl
  • 提供资源树公共查询能力:维护 D-Bus 服务、对象、接口、类和命名对象的索引,供 mdbctlmc.mdb.mdb_service 和业务组件查询。
  • 保护系统可服务性:持续喂硬件看门狗,监控 rsyslog,并在日志文件缺失或服务异常时自愈。
  • 支持定制与诊断:持久化 Package 定制属性,提供运行态监控开关、模拟日志和 Debug 采样周期配置。

1.3 核心功能

  • 活动组件列表和共享内存 Match 规则管理。
  • 启动状态两轮检查、子系统重启和 BMC 自愈复位。
  • 健康状态周期检查和组件即时/累计异常重启。
  • 组件连续掉线与总掉线次数检查。
  • MDB 资源树查询、接口所有者查询、命名对象查询和属性值匹配。
  • 强制复位、平滑复位、热复位、复位原因记录和分级复位锁。
  • 看门狗喂狗、rsyslog 阻塞检测和日志文件自愈。
  • Package 定制信息持久化、配置备份、一键收集 mdb_info.log

1.4 关键术语表

术语解释
macamicro & agile component architecture;微组件管理核心组件。
微组件通过统一 MicroComponent 接口参与启动、健康、复位和调试管理的业务单元。
MDBManagement DataBase;maca 维护的资源树索引,不等同于持久化数据库。
启动检查读取组件 MicroComponent.Status,判断是否完成初始化。
健康检查周期调用组件健康回调,处理 NORMALABNORMALNEED_RESTART_NOW
在线检查统计组件掉线事件;时间窗或总次数达阈值时触发自愈。
GracefulReset平滑 BMC 复位;依次经历 prepare、process、action。
WarmReset组件热复位;调用组件 Reset 接口,不执行 systemctl reboot
ForceReset强制 BMC 复位;停止喂狗后执行系统重启。
ResetLockStatus复位锁当前最高级别:UnlockedWarmResetLockedGracefulResetLockedForceResetLocked
ContextD-Bus 方法首参数 a{ss},携带 Requestor、调用者、权限等上下文。
PoweroffPer / ResetPerPackage 用掉电持久化;部分运行态表用复位持久化。

1.5 外部交互边界图

对象路径接口主要能力权限
/bmc/kepler/MacaServicebmc.kepler.MCAdmin组件列表、共享内存 Match 规则GetComponentList: ReadOnly;Add/RemoveMatch: BasicSetting
/bmc/kepler/MacaServicebmc.kepler.SystemControl复位、复位原因、复位锁BasicSetting
/bmc/kepler/MacaServicebmc.kepler.Dft模拟日志风暴BasicSetting
/bmc/kepler/MacaServicebmc.kepler.Release.MonitorControl启停 starting/running/online 检查DiagnoseMgmt
/bmc/kepler/MdbServicebmc.kepler.Mdb资源树查询ReadOnly
/bmc/kepler/Managers/${ManagerId}/Packagebmc.kepler.Managers.PackageCustomer / Version / Provider读 ReadOnly;写 BasicSetting
/bmc/kepler/Debug/LogMockbmc.kepler.Debug.LogMock自定义错误日志注入Debug 构建
/bmc/kepler/Debug/Performancebmc.kepler.Debug.Performance性能采样间隔读 ReadOnly;写 BasicSetting
路径用途
/opt/bmc/apps/maca组件安装目录
/opt/bmc/conf/mc_control.json启动、健康、在线及平滑复位超时配置;可由 MC_CONTROL_PATH 覆盖
/data/trust/recovery_mode_flag最小系统启动标志;ResetType=1 时写入
/data/trust/persistence.local/maca.db本地持久化数据库默认位置
/var/log/framework.log / /var/log/app.log框架与应用日志
/var/log/operation.log / /var/log/running.log操作日志与运行事件

2. API 使用说明与示例

对外发布的 API 为资源协作接口,服务名 bmc.kepler.maca。路径中的 ManagerId 默认为 1。均可通过 busctl / mdbctl 调试。方法首参 a{ss} 为框架调用上下文;只读调试可传空字典 0。需要 Requestor 的接口应传 1 Requestor <name>

bash
busctl --user tree bmc.kepler.maca

Lua 业务优先使用 mc.mdb.mdb_service 访问 bmc.kepler.Mdb,不要长期绑定复杂 D-Bus 返回结构。

组件作为微组件还会由 libmc4lua 注册标准 bmc.kepler.MicroComponent* 接口,细节见 libmc4lua,本文不重复。仓库无 mds/ipmi.json,不提供 IPMI 命令。

2.1 bmc.kepler.MCAdmin

功能说明

查询活动微组件列表,并在共享内存中添加/删除 D-Bus Match 规则。

路径/bmc/kepler/MacaService

参数说明

方法入参出参说明
GetComponentLista{ss}as返回当前活动微组件名称列表
AddMatcha{ss}s(Context + MatchString)在共享内存中添加订阅规则
RemoveMatcha{ss}s(Context + MatchString)删除先前由同一 Requestor 添加的规则
参数名方向类型描述取值范围
Context输入a{ss}调用上下文只读调用可为空;Add/RemoveMatch 必须含字符串 Requestor
MatchString输入String标准 D-Bus Match 规则文本必须能由 dbus match_rule 解析

返回值与异常

返回值/异常含义触发条件处理建议
as活动组件名称数组GetComponentList 成功按集合处理,不依赖顺序;至少包含 maca
无返回值Add/RemoveMatch 成功或幂等规则已存在/不存在也按成功处理无需处理
PropertyValueError(Requestor)Requestor 缺失或类型错误Context 未携带字符串 Requestor补充 1 Requestor <name>

应用场景

确认组件是否已被 maca 识别;C/C++ 组件由 maca 统一维护共享内存信号订阅。

限制条件

  • 列表表示 maca 当前视图,不等同于组件业务完全就绪。
  • RemoveMatch 需要与 AddMatch 完全相同的 Requestor 和 MatchString。
  • 规则过宽会增加 D-Bus 和共享内存压力。

调试示例

bash
busctl --user call bmc.kepler.maca /bmc/kepler/MacaService \
    bmc.kepler.MCAdmin GetComponentList a{ss} 0

MATCH="type='signal',interface='org.freedesktop.DBus.Properties',member='PropertiesChanged'"
busctl --user call bmc.kepler.maca /bmc/kepler/MacaService \
    bmc.kepler.MCAdmin AddMatch a{ss}s 1 Requestor docs-maca "$MATCH"
busctl --user call bmc.kepler.maca /bmc/kepler/MacaService \
    bmc.kepler.MCAdmin RemoveMatch a{ss}s 1 Requestor docs-maca "$MATCH"

2.2 bmc.kepler.SystemControl

功能说明

BMC 强制/平滑复位、组件热复位、复位原因与分级复位锁。

路径/bmc/kepler/MacaService

参数说明

属性参数说明
属性类型读写说明
ResetLockStatuss只读当前最高复位锁级别
ResetCausey只读(业务应通过 WithCause 方法更新)BMC 上一次复位的原因标识码;无记录时为 255

ResetLockStatus 取值:UnlockedWarmResetLockedGracefulResetLockedForceResetLocked。优先级由低到高;高级别被锁定时,低级别复位一并禁止。

方法参数说明
方法入参出参说明
ForceReseta{ss}y强制复位 BMC
GracefulReseta{ss}yi平滑复位 BMC
WarmReseta{ss}组件热复位,不执行 systemctl reboot
ForceResetWithCausea{ss}yy先持久化 ResetCause,再强制复位
GracefulResetWithCausea{ss}yyi先持久化 ResetCause,再平滑复位
SetResetLockStatusa{ss}ssus设置或解除复位锁
参数名方向类型描述取值范围
ResetType输入U8重启类型0 下次从正常系统启动;1 下次从最小系统启动
ResetCause输入U8重启原因0255,须遵循平台原因码表
ResetMode输入String锁定层级WarmResetGracefulResetForceReset
OperationType输入String动作LockUnlock
TimeoutSeconds输入U32Lock 自动超时Lock 时 10300 秒;Unlock 仍需传入但实现不使用
LockCause输入Enum/String锁定原因The current status does not support the reset operation(Default);BIOS POST stage does not support the reset operation(BiosDuringPost)

返回值与异常

返回值/异常含义触发条件处理建议
无返回值Force/Warm/SetLock 已接受未被对应级别锁定ForceReset 后连接会中断
0GracefulReset prepare 阶段接受prepare 成功或没有参与组件不代表 process/action 均无失败
-1已有另一个平滑复位在进行is_graceful_resetting 已为 true等待当前流程结束
OperationNotAllowed操作不允许Force/Warm 锁生效或已有热复位读取 ResetLockStatus
ResetOperationNotAllowed平滑复位不允许Graceful/Force 锁或某组件 Prepare 明确失败查锁原因和失败组件日志
ValueOutOfRange(ResetLockStatus)复位锁参数非法Timeout 不在 10~300 或 OperationType 非法修正参数
InternalError最小系统标志写入失败ResetType=1 且无法创建 recovery_mode_flag检查 /data/trust 权限与存储

平滑复位阶段:Prepare → Process → Action。Prepare 明确失败时执行 Cancel 并终止;process/action 明确失败或超时在当前实现中记录后继续。prepare 超时 10 秒,process 默认 120 秒(可配置 120~600 秒),action 超时 60 秒。action 在接口返回成功约 3 秒后开始。

应用场景

升级或维护前平滑复位;异常场景强制复位;BIOS POST 等阶段加复位锁;复位后读取 ResetCause 追溯来源。

限制条件

  • 复位类接口风险高,仅在隔离测试机、具备串口和固件恢复手段时执行。
  • ForceReset 不等待业务落盘。
  • WarmReset 是组件级热复位,不等同于 BMC 重启;任意复位锁级别均会阻止热复位。
  • WithCause 方法可能在锁检查之前写入 ResetCause。
  • 锁是进程内运行态,maca/framework 重启后不会按源码表自动恢复。

调试示例

bash
busctl --user get-property bmc.kepler.maca /bmc/kepler/MacaService \
    bmc.kepler.SystemControl ResetLockStatus
busctl --user get-property bmc.kepler.maca /bmc/kepler/MacaService \
    bmc.kepler.SystemControl ResetCause

以下复位命令会中断 BMC。请先确认目标、串口和恢复方案,并在提示后输入确认字符串。

bash
read -r -p '输入 RESET-MACA 才执行强制复位: ' confirm
[ "$confirm" = 'RESET-MACA' ] || exit 1
busctl --user call bmc.kepler.maca /bmc/kepler/MacaService \
    bmc.kepler.SystemControl ForceReset a{ss}y 1 Requestor docs-maca 0
bash
CAUSE='The current status does not support the reset operation'
busctl --user call bmc.kepler.maca /bmc/kepler/MacaService \
    bmc.kepler.SystemControl SetResetLockStatus a{ss}ssus \
    1 Requestor docs-maca WarmReset Lock 60 "$CAUSE"
busctl --user call bmc.kepler.maca /bmc/kepler/MacaService \
    bmc.kepler.SystemControl SetResetLockStatus a{ss}ssus \
    1 Requestor docs-maca WarmReset Unlock 10 "$CAUSE"

2.3 bmc.kepler.Dft

功能说明

按 Count 连续写入 MOCK LOG STORM=<序号> 的错误日志,用于验证日志风暴抑制与收集链路。

路径/bmc/kepler/MacaService

参数说明

方法入参出参说明
MockLogStorma{ss}u模拟日志风暴
参数名方向类型描述取值范围
Count输入U32风暴日志次数实现仅在 Count>0 时输出;模型未设上限

返回值与异常

无返回值表示注入完成或 Count<=0 时无动作。短时间输出过多可能被框架日志风暴抑制。

应用场景

验证日志限流、一键收集和 rsyslog。

限制条件

调用方必须自行限制 Count;建议从 5~20 条开始。不要在生产环境大规模注入。

调试示例

bash
busctl --user call bmc.kepler.maca /bmc/kepler/MacaService \
    bmc.kepler.Dft MockLogStorm a{ss}u 1 Requestor docs-maca 5

2.4 bmc.kepler.Release.MonitorControl

功能说明

在运行态启用或禁用启动检查、健康检查或在线检查。该接口不会修改 mc_control.json

路径/bmc/kepler/MacaService

参数说明

方法入参出参说明
SetMonitorStatusa{ss}sbi开启或关闭指定检查机制
参数名方向类型描述取值范围
Type输入String检查机制类型startingrunningonline
Enabled输入Boolean是否启用true / false

返回值与异常

返回值含义触发条件处理建议
0开关操作成功Type 合法且底层接受测试结束后恢复
-1操作失败空 Context、Type 非字符串/不支持,或 Enabled 类型错误修正参数并确认 DiagnoseMgmt 权限

应用场景

故障注入、升级验证、定位检查机制是否导致组件重启或 BMC 自愈。

限制条件

只影响当前运行期,不持久化。关闭监控会降低自愈能力,测试结束必须恢复。

调试示例

bash
busctl --user call bmc.kepler.maca /bmc/kepler/MacaService \
    bmc.kepler.Release.MonitorControl SetMonitorStatus a{ss}sb \
    1 Requestor docs-maca starting true
console
$ mdbctl
% attach maca
% setmonitorstatus starting false
0

2.5 bmc.kepler.Mdb

功能说明

MDB 资源树查询。共享内存没有结果时,部分查询会回退到本地 ObjectMgr。Lua 封装见 mc.mdb.mdb_service

路径/bmc/kepler/MdbService

权限:ReadOnly。D-Bus 签名以 libmc4lua 生成代码 mdb.bmc.kepler.Mdb 为准(方法首参均为 Context)。

参数说明

方法签名(不含 Context)入参出参说明
GetObjectsas → a{sas}Path、InterfacesObject按路径查找 service 与 Interface 映射
GetSubObjectssias → a{sa{sas}}Path、Depth、InterfacesSubObjects按路径、深度、接口查找子对象
GetSubPathssias → asPath、Depth、InterfacesSubPaths查找满足条件的子路径
GetParentObjectssas → a{sa{sas}}Path、InterfacesParentObjects查找祖先 Path
GetServiceNames → sSenderServiceName根据 D-Bus 发送方查服务名
GetServiceNames→ asServiceNames列出所有已索引服务
GetPathssb → ssInterface、Filter、IgnoreCasePath、Service按接口属性 JSON 过滤,返回字典序第一个路径
GetInterfaceOwnerss → a(ss)InterfaceInterfaceOwnersSender 与 Path
IsValidPathsb → bPath、IgnoreCaseResult路径是否有效
GetSubPathsPagingsiasii → asPath、Depth、Interfaces、Skip、TopPaths分页查找子路径
GetClassess → asServiceClassNames服务下的类名
GetObjectLists → a(sa(ss))ClassNameObjectList按类名查对象名、服务和路径
GetObjectOwners → a(ss)ObjectNameObjectOwners按对象名查服务和路径
GetMatchedObjectsss → a(ssas)ObjectName、InterfacePatternMatchedObjects按服务名与接口模式查找
GetTracedObject→ asTracedObjects查询被追踪对象路径
参数名类型描述取值范围
PathString资源树对象路径合法 D-Bus 路径
InterfacesString[]接口过滤空数组表示不过滤
DepthS32查找深度由 MDB 库解释
SenderStringD-Bus 发送方唯一连接名
FilterString属性名/值 JSON 对象非法 JSON 时 GetPath 记 GetPath: invalid filter
IgnoreCaseBoolean是否忽略属性值/路径大小写true / false
Skip / TopS32分页偏移与条数Skip 为负等效 0;Top 为负表示 Skip 之后全部
ObjectName(GetMatchedObjects)String接口字段名为 ObjectName方法描述与 mdb_service.get_matched_objects 按服务名传入
InterfacePatternString接口模式字符串建议先用完整接口名

GetSubPaths 只返回带自定义接口的路径;中间目录节点可能在 busctl tree 可见但查询为空,此时应对父对象调用 org.freedesktop.DBus.ObjectManager.GetManagedObjects

GetTracedObject 已由 libmc4lua 生成代码注册(出参 TracedObjects)。当前工作区 mdb_interfaceMdb.json 未列出该方法;调用前请 introspect 确认目标镜像。

maca 1.130.6 仓内文档还记载 GetPropertyMatchedObjectsa{ss}ssvb → a(sssv),按接口/属性/Variant 匹配,排除 ay 与数组签名)。当前工作区 mdb_interface 与 libmc4lua 生成代码均未收录,本文不把它当作已核实的稳定 API。

返回值与异常

返回值含义触发条件处理建议
对应结构/数组查询成功对象已上树且过滤匹配业务侧用 mdb_service 解包
空字典/空数组/"" ""无匹配路径不存在、过滤过严、初始化未完成IsValidPath / GetServiceNames
GetPath: invalid filterFilter 不是 JSON object字符串无法解码为对象{} 开始构造
org.freedesktop.DBus.Error.ServiceUnknown服务不存在maca 未启动systemctl status framework.service

应用场景

按路径/接口枚举对象、分页取子路径、根据类名或对象名反查 Path、配置导入导出时 GetServiceNames

限制条件

  • 查询视图异步维护,服务刚上线时可能短暂为空。
  • 只有 well-known name 才进入 MDB;受 MDB_WHITE_LIST / MDB_BLACK_LIST 约束。
  • 根路径深层查询开销较大,避免高频轮询。
  • GetPath 的 Filter 序列化时最好保证键顺序稳定(Lua 封装会缓存)。

调试示例

bash
busctl --user call bmc.kepler.maca /bmc/kepler/MdbService \
    bmc.kepler.Mdb GetServiceNames a{ss} 0

busctl --user call bmc.kepler.maca /bmc/kepler/MdbService \
    bmc.kepler.Mdb GetObject a{ss}sas 0 /bmc/kepler/MacaService 1 bmc.kepler.SystemControl

busctl --user call bmc.kepler.maca /bmc/kepler/MdbService \
    bmc.kepler.Mdb GetSubPaths a{ss}sias 0 /bmc/kepler 1 0

busctl --user call bmc.kepler.maca /bmc/kepler/MdbService \
    bmc.kepler.Mdb IsValidPath a{ss}sb 0 /bmc/kepler/MacaService false
lua
local mdb_service = require 'mc.mdb.mdb_service'
local rsp = mdb_service.get_service_names(bus)
local obj = mdb_service.get_object(bus, '/bmc/kepler/MacaService', 'bmc.kepler.SystemControl')

2.6 bmc.kepler.Managers.Package

功能说明

读取或设置 BMC 包定制信息。属性保存到本地 PoweroffPer 数据库(t_package)。

路径/bmc/kepler/Managers/${ManagerId}/Package

参数说明

属性类型读写默认值说明
Customers可读写""定制发货的客户名称
Versions可读写""客户定制套餐版本
Providers可读写""定制版本提供商

读权限 ReadOnly,写权限 BasicSetting。写入 Version 且存在调用 Context 时会记录操作日志 Set customized version successfully

返回值与异常

读取成功返回字符串。写入失败时检查权限、maca.db 和 operation/framework 日志。

应用场景

读取或更新 BMC 包定制信息。

限制条件

  • 不要把 maca 组件自身版本写入 Version
  • 源码未定义长度或枚举约束(Customer 枚举限制已移除);业务格式由产品定制规范定义。
  • 频繁写入应考虑闪存寿命。修改前记录原值,测试后恢复。

调试示例

bash
busctl --user get-property bmc.kepler.maca /bmc/kepler/Managers/1/Package \
    bmc.kepler.Managers.Package Customer
busctl --user get-property bmc.kepler.maca /bmc/kepler/Managers/1/Package \
    bmc.kepler.Managers.Package Version
busctl --user get-property bmc.kepler.maca /bmc/kepler/Managers/1/Package \
    bmc.kepler.Managers.Package Provider

2.7 Debug 接口

功能说明

仅 Debug 构建、且相关模块可加载时出现。community 模式下当前实现即使加载 Debug 服务也不创建 LogMock 对象。

路径

  • /bmc/kepler/Debug/LogMockbmc.kepler.Debug.LogMock.MockLog
  • /bmc/kepler/Debug/Performancebmc.kepler.Debug.Performance.PerformanceSamplingIntervalMinutes

参数说明

方法/属性签名说明
MockLoga{ss}usb → voidCount 11000,Text 长度 11024,RepeatText 为是否重复同一文本
PerformanceSamplingIntervalMinutes属性 q性能数据采集周期,单位分钟;默认 1440,最小值 1

RepeatText=true 时重复输出完全相同文本;false 时追加 (seq=n)

返回值与异常

UnknownObject 表示对象不存在(Release、community 裁剪或模块未加载)。Count/Text 越界由模型校验拒绝。

应用场景

Debug 镜像验证重复日志合并、风暴抑制和性能采样周期。

限制条件

日志内容不得包含口令、密钥或个人数据。不要一次使用 Count 上限。

调试示例

bash
busctl --user introspect bmc.kepler.maca /bmc/kepler/Debug/LogMock
busctl --user call bmc.kepler.maca /bmc/kepler/Debug/LogMock \
    bmc.kepler.Debug.LogMock MockLog a{ss}usb 1 Requestor docs-maca 3 'maca-doc-test' false

busctl --user get-property bmc.kepler.maca /bmc/kepler/Debug/Performance \
    bmc.kepler.Debug.Performance PerformanceSamplingIntervalMinutes

3. 组件扩展案例

3.1 扩展能力概述

maca 的主要扩展点不在于向 maca 仓直接添加业务代码,而在于让其他组件通过统一元数据和回调接入生命周期管理:

  1. service.json 声明 type: applicationdeployConfig
  2. 注册 MicroComponent 健康检查回调。
  3. 实现平滑复位 / 热复位回调。
  4. 通过 mc_control.json 调整监控阈值和 process 超时。
  5. 配置 MDB 白名单 / 黑名单。
  6. 使用 mc.mdb.mdb_service 查询资源树。

3.2 扩展点说明

扩展点位置触发时机
组件元数据业务仓 mds/service.jsonmaca 收集活动组件
健康检查mc.mdb.micro_component.on_health_check周期 running 检查
平滑复位mc.mdb.micro_component.rebooton_prepare / on_process / on_action / on_cancelGracefulReset
热复位mc.mdb.micro_component.resetWarmReset
运行参数/opt/bmc/conf/mc_control.jsonmaca 启动读取
MDB 信任列表环境变量 MDB_WHITE_LIST / MDB_BLACK_LIST服务名进入 MDB 前
Dump / 备份MicroComponent Debug / config_manage一键收集、配置备份

3.3 二次开发指导

步骤一:声明组件元数据

json
{
  "name": "demo_component",
  "type": "application",
  "deployConfig": "demo_subsystem.service",
  "version": "1.0.0",
  "author": "openUBMC",
  "license": "Mulan PSL v2",
  "description": "demo component",
  "dependencies": {},
  "required": []
}

type 不是 application 时不进入常驻检查范围。不要把业务组件错误映射到 framework.service

步骤二:注册健康检查

lua
local micro_component = require 'mc.mdb.micro_component'

micro_component.on_health_check(function(ctx)
    if fatal_condition() then
        return micro_component.HEALTH.NEED_RESTART_NOW
    end
    if transient_condition() then
        return micro_component.HEALTH.ABNORMAL
    end
    return micro_component.HEALTH.NORMAL
end)
返回值maca 行为
NORMAL(0)保持正常,不重启
ABNORMAL(-1)累计异常;默认连续 3 次后重启 deployConfig
NEED_RESTART_NOW(-2)立即重启 deployConfig

步骤三:实现平滑复位回调

lua
local reboot = require 'mc.mdb.micro_component.reboot'

reboot.on_prepare(function(ctx)
    return prepare_for_reboot() and 0 or -1
end)

reboot.on_process(function(ctx)
    return persist_state() and 0 or -1
end)

reboot.on_action(function(ctx)
    return close_resources() and 0 or -1
end)

reboot.on_cancel(function(ctx)
    rollback_prepare()
end)

Prepare 返回 -1 时调用方收到 ResetOperationNotAllowed,组件收到 Cancel。Process/Action 失败或超时仍可能继续 BMC 复位。回调必须幂等。

步骤四:运行参数

默认配置文件 /opt/bmc/conf/mc_control.json。可配置项包括 starting_monitor.startup_checkrunning_monitor.health_check / offline_checkgraceful_reset_config.process.timeout_seconds(120~600)。环境变量还可覆盖 MC_CONTROL_PATHMDB_WHITE_LISTMDB_BLACK_LISTCONTINUOUS_OFFLINE_TIMESMAX_RESTART_LIMIT 等。

MDB 默认 MDB_WHITE_LIST="^i?bmc"。黑名单按完整名称精确匹配并优先拒绝;白名单按 Lua pattern 匹配。

验证方法

  1. GetComponentList 确认组件在活动列表。
  2. 查看 /var/log/framework.log 中 startup/health 日志。
  3. 故障注入后确认只重启预期 deployConfig
  4. 修改白名单后用 GetServiceNames 核对索引范围。

注意事项

  • 健康回调需快速返回;maca RPC 超时为 30 秒,但业务不应把该上限当作正常耗时。
  • StartupCheck failed 只是 maca 观察到的结果,根因可能在上游依赖。
  • 保持接口名、错误消息 ID 向后兼容;不得在日志中输出密钥或口令。

4. 日志说明

4.1 一键日志收集

maca 通过 MicroComponent Debug 的 on_dump 输出:

文件路径内容说明
<收集目录>/mdb_info.logShmLockManager.dump_state()total_lockstotal_unlockstotal_timeoutstotal_deadlocksactive_read_locksactive_write_lockslock_contentions
宿主进程日志/var/log/framework.log/var/log/app.log 等,由 syslog 路由决定

配置备份回调会把 maca.db 复制到调用方指定目录,属于配置备份链路,不要与一键日志文件混为一谈。

4.2 关键日志信息

日志片段日志级别含义解读建议处理动作
maca is initializingNOTICE主初始化开始后续应看到对象创建和检查任务
start maca failed, err:ERROR主服务构造失败检查依赖库、数据库、MDS 生成代码
[<component>]StartupCheck failedERROR组件未完成启动查 systemd 与该组件上游,不一定是 maca bug
start to restart abnormal componentsNOTICE第一轮启动失败后重启异常子系统对照 deployConfig
Force Reset begin / GracefulReset begin / WarmReset beginNOTICE对应复位开始结合 operation.log 与阶段日志
<component> rebooting ... prepare failedNOTICE组件拒绝 preparemaca cancel 并拒绝平滑复位
process ... timeout, components:NOTICEprocess 超时当前实现会跳过并继续
action fail, skip itERRORaction 明确失败当前实现仍继续复位
Force reset is lockedWARN/NOTICE对应复位被锁定读 ResetLockStatus
clear watchdog failed:ERROR喂狗失败检查 libsoc_adapter WDT
the debug log is missing and rsyslog is restarted successfullyWARN日志文件缺失后已恢复检查 rsyslog 与文件系统
GetPath: invalid filterINFOFilter 非法修正 JSON
start to dump processNOTICE一键收集回调执行检查收集目录中的 mdb_info.log

临时提升调试级别:

bash
busctl --user call bmc.kepler.maca /bmc/kepler/maca/MicroComponent \
    bmc.kepler.MicroComponent.Debug SetDlogLevel a{ss}sy 0 debug 1

MicroComponent 实际路径以目标镜像 introspect 为准。完成后恢复 notice。


5. 问题定界指南

5.1 典型问题定界

问题描述是否为本组件问题判断依据关键证据收集方法
StartupCheck failed,目标服务 dependency failed通常不是maca 只是发现未到 InitCompletedsystemctl status、依赖树、目标组件日志
GetComponentList 缺少刚上线组件可能是异步窗口需要服务名与 MicroComponent 对象就绪busctl --user list、等待后重试
MDB 查不到对象,但直接 busctl 能访问可能是信任列表服务未进入 MDBGetServiceNames、MDB_WHITE_LIST/BLACK_LIST
MDB 与直接 D-Bus 都查不到通常不是目标对象本身未注册查目标组件启动日志
GetSubPaths 看不到已知子路径通常是用法限制该路径没有自定义接口对父路径 GetManagedObjects
平滑复位返回 ResetOperationNotAllowed不一定复位锁或 Prepare 失败ResetLockStatus、prepare failed 日志
平滑复位返回 0,组件未完成清理可能是容错语义process/action 失败仍继续分阶段日志
BMC 反复复位可能由自愈触发,根因常在其他组件启动检查第二轮失败或连续掉线ResetCause、abnormal 列表、coredump
setmonitorstatus 返回 -1可能是参数/权限Type 必须为 starting/running/online核对 Context 与 DiagnoseMgmt
maca.log 不存在不一定产品可能把 maca 跑在 framework 内deployConfig、framework.log
看门狗未启动可能是芯片适配wdt.new 失败时停用喂狗Failed to create WDT driver

5.2 错误码速查表

错误码/异常含义可能原因排查建议
0(SetMonitorStatus / GracefulReset)成功 / prepare 接受见 2.2、2.4GracefulReset 的 0 需继续看阶段日志
-1(SetMonitorStatus)失败Context/Type/Enabled 非法修正参数
-1(GracefulReset)已有流程进行并发调用稍后重试
PropertyValueError(Requestor)Requestor 非法Add/RemoveMatch Context传字符串 Requestor
OperationNotAllowed操作不允许复位锁或已有热复位读锁状态
ResetOperationNotAllowed平滑复位不允许锁或 Prepare 失败查失败组件
ValueOutOfRange(ResetLockStatus)锁参数非法Timeout 或 OperationType10~300 秒,Lock/Unlock
InternalError最小系统标志失败recovery_mode_flag检查 /data/trust
ServiceUnknown / UnknownObject服务或路径不存在未启动、Debug 裁剪、路径错误busctl tree/introspect

5.3 最小化复现与证据收集

  1. 记录服务名、对象路径、接口、方法、Context、返回值和 ResetLockStatus。
  2. 收集 framework.logapp.logoperation.logrunning.logmdb_info.log
  3. systemctl status framework.service maca.service,并用 busctl --user tree/introspect/call 交叉验证。
  4. 无自定义接口的路径改用 GetManagedObjects
  5. 保存固件版本、maca 版本、是否最小系统、mc_control.json 和相关环境变量。
bash
systemctl status framework.service maca.service --no-pager
busctl --user tree bmc.kepler.maca
busctl --user introspect bmc.kepler.maca /bmc/kepler/MacaService
busctl --user introspect bmc.kepler.maca /bmc/kepler/MdbService
busctl --user call bmc.kepler.maca /bmc/kepler/MacaService \
    bmc.kepler.MCAdmin GetComponentList a{ss} 0

5.4 调试方法

  • 复位与监控开关只在可恢复的测试 BMC 上操作;先记录原值,结束后恢复。
  • 不要同时测试启动失败、连续掉线和复位,避免多种自愈机制交叠。
  • 业务查询优先 require 'mc.mdb.mdb_service';直接 D-Bus 用于现场交叉验证。

6. 常见问题解答

Q1:为什么 StartupCheck failed 不一定是 maca 的缺陷?

  • 问题描述:启动检查报组件失败。
  • 一句话答案:maca 只是在规定窗口内没有观察到组件完成初始化。
  • 根因说明:目标组件可能因上游依赖、配置、硬件或 systemd dependency failed 没有启动。
  • 解决方案:先查目标 deployConfig 和依赖树,再查 maca 策略与阈值。
  • 规避方案:把 abnormal component 当作排查入口,不当作根因结论。
  • 适用版本:1.130.9。

Q2:GracefulReset 返回 0 是否表示所有组件都成功保存数据?

  • 问题描述:平滑复位返回成功,但有组件数据未落盘。
  • 一句话答案:不是。它主要表示 prepare 被接受并启动后续流程。
  • 根因说明:当前 process/action 失败或超时会记录后继续复位。
  • 解决方案:检查 prepare/process/action 各阶段组件日志和耗时。
  • 规避方案:关键组件应在 Prepare 前置校验,并实现可靠、幂等的 Process/Action。
  • 适用版本:1.100.8 及以后。

Q3:为什么 GetSubPaths 查不到 busctl tree 里能看到的路径?

  • 问题描述:tree 看得到路径,MDB 查询返回空。
  • 一句话答案:该方法只返回带自定义接口的路径。
  • 根因说明:中间目录节点可能没有业务接口。
  • 解决方案:对父对象调用 org.freedesktop.DBus.ObjectManager.GetManagedObjects
  • 规避方案:为该节点补充接口,或在业务侧改用 GetManagedObjects。
  • 适用版本:1.130.9。

Q4:MDB 查询不到对象,但组件 D-Bus 服务存在?

  • 问题描述:busctl list 有服务名,GetServiceNames / GetObject 没有对应对象。
  • 一句话答案:检查 MDB 白名单/黑名单以及服务是否为 well-known name。
  • 根因说明:默认 MDB_WHITE_LIST="^i?bmc";黑名单精确匹配优先拒绝;非 well-known name 不进入 MDB。
  • 解决方案:核对环境变量与服务名,用 GetServiceNames 确认索引范围。
  • 规避方案:变更信任列表后重启承载 maca 的实际子系统,不要只假设存在独立 maca.service
  • 适用版本:1.130.9。

Q5:AddMatch / RemoveMatch 报 Requestor 错误?

  • 问题描述:Match 规则接口失败。
  • 一句话答案:Context 必须携带字符串 Requestor,删除时须与添加时完全一致。
  • 根因说明:共享内存规则以 Requestor + MatchString 为幂等键。
  • 解决方案:使用 1 Requestor <稳定标识>,MatchString 逐字一致。
  • 规避方案:组件退出前主动 RemoveMatch,避免残留规则。
  • 适用版本:1.10.16 及以后。