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 将其声明为 application,description 为 framework main component,deployConfig 为 framework.service。它负责收集活动微组件、检查启动/健康/在线状态、维护 MDB 资源树索引,并代理 BMC 强制复位、平滑复位、组件热复位、复位锁、看门狗、日志系统自愈、配置备份和一键收集等系统级能力。
对外注册的 D-Bus 服务名为 bmc.kepler.maca。Release 主对象为:
/bmc/kepler/MacaService
/bmc/kepler/MdbService
/bmc/kepler/Managers/${ManagerId}/PackageDebug 构建还可能创建 /bmc/kepler/Debug/LogMock 与 /bmc/kepler/Debug/Performance。
源码同时保留独立 maca.service 单元(工作目录 /opt/bmc/apps/maca,ExecStart 为 Skynet + config.cfg)。目标产品究竟采用 framework 内嵌部署还是独立 systemd 单元,以对应 Manifest 和镜像为准。
组件不提供 IPMI 命令(MDS 中无 ipmi.json)。mds/service.json 的 required 为空。构建依赖 libmc4lua、persistence;测试依赖含 mdb_interface、hwproxy 等。
1.2 解决什么问题
- 统一管理微组件生命周期:发现常驻组件,识别启动失败、健康异常和连续掉线,并按策略重启子系统或复位 BMC。
- 提供一致的系统复位入口:把强制复位、平滑复位、组件热复位、最小系统启动、复位原因和复位锁收敛到
bmc.kepler.SystemControl。 - 提供资源树公共查询能力:维护 D-Bus 服务、对象、接口、类和命名对象的索引,供
mdbctl、mc.mdb.mdb_service和业务组件查询。 - 保护系统可服务性:持续喂硬件看门狗,监控 rsyslog,并在日志文件缺失或服务异常时自愈。
- 支持定制与诊断:持久化 Package 定制属性,提供运行态监控开关、模拟日志和 Debug 采样周期配置。
1.3 核心功能
- 活动组件列表和共享内存 Match 规则管理。
- 启动状态两轮检查、子系统重启和 BMC 自愈复位。
- 健康状态周期检查和组件即时/累计异常重启。
- 组件连续掉线与总掉线次数检查。
- MDB 资源树查询、接口所有者查询、命名对象查询和属性值匹配。
- 强制复位、平滑复位、热复位、复位原因记录和分级复位锁。
- 看门狗喂狗、rsyslog 阻塞检测和日志文件自愈。
- Package 定制信息持久化、配置备份、一键收集
mdb_info.log。
1.4 关键术语表
| 术语 | 解释 |
|---|---|
| maca | micro & agile component architecture;微组件管理核心组件。 |
| 微组件 | 通过统一 MicroComponent 接口参与启动、健康、复位和调试管理的业务单元。 |
| MDB | Management DataBase;maca 维护的资源树索引,不等同于持久化数据库。 |
| 启动检查 | 读取组件 MicroComponent.Status,判断是否完成初始化。 |
| 健康检查 | 周期调用组件健康回调,处理 NORMAL、ABNORMAL、NEED_RESTART_NOW。 |
| 在线检查 | 统计组件掉线事件;时间窗或总次数达阈值时触发自愈。 |
| GracefulReset | 平滑 BMC 复位;依次经历 prepare、process、action。 |
| WarmReset | 组件热复位;调用组件 Reset 接口,不执行 systemctl reboot。 |
| ForceReset | 强制 BMC 复位;停止喂狗后执行系统重启。 |
| ResetLockStatus | 复位锁当前最高级别:Unlocked、WarmResetLocked、GracefulResetLocked、ForceResetLocked。 |
| Context | D-Bus 方法首参数 a{ss},携带 Requestor、调用者、权限等上下文。 |
| PoweroffPer / ResetPer | Package 用掉电持久化;部分运行态表用复位持久化。 |
1.5 外部交互边界图
| 对象路径 | 接口 | 主要能力 | 权限 |
|---|---|---|---|
/bmc/kepler/MacaService | bmc.kepler.MCAdmin | 组件列表、共享内存 Match 规则 | GetComponentList: ReadOnly;Add/RemoveMatch: BasicSetting |
/bmc/kepler/MacaService | bmc.kepler.SystemControl | 复位、复位原因、复位锁 | BasicSetting |
/bmc/kepler/MacaService | bmc.kepler.Dft | 模拟日志风暴 | BasicSetting |
/bmc/kepler/MacaService | bmc.kepler.Release.MonitorControl | 启停 starting/running/online 检查 | DiagnoseMgmt |
/bmc/kepler/MdbService | bmc.kepler.Mdb | 资源树查询 | ReadOnly |
/bmc/kepler/Managers/${ManagerId}/Package | bmc.kepler.Managers.Package | Customer / Version / Provider | 读 ReadOnly;写 BasicSetting |
/bmc/kepler/Debug/LogMock | bmc.kepler.Debug.LogMock | 自定义错误日志注入 | Debug 构建 |
/bmc/kepler/Debug/Performance | bmc.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>。
busctl --user tree bmc.kepler.macaLua 业务优先使用 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
参数说明
| 方法 | 入参 | 出参 | 说明 |
|---|---|---|---|
GetComponentList | a{ss} | as | 返回当前活动微组件名称列表 |
AddMatch | a{ss}s(Context + MatchString) | 无 | 在共享内存中添加订阅规则 |
RemoveMatch | a{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 和共享内存压力。
调试示例
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
参数说明
属性参数说明
| 属性 | 类型 | 读写 | 说明 |
|---|---|---|---|
ResetLockStatus | s | 只读 | 当前最高复位锁级别 |
ResetCause | y | 只读(业务应通过 WithCause 方法更新) | BMC 上一次复位的原因标识码;无记录时为 255 |
ResetLockStatus 取值:Unlocked、WarmResetLocked、GracefulResetLocked、ForceResetLocked。优先级由低到高;高级别被锁定时,低级别复位一并禁止。
方法参数说明
| 方法 | 入参 | 出参 | 说明 |
|---|---|---|---|
ForceReset | a{ss}y | 无 | 强制复位 BMC |
GracefulReset | a{ss}y | i | 平滑复位 BMC |
WarmReset | a{ss} | 无 | 组件热复位,不执行 systemctl reboot |
ForceResetWithCause | a{ss}yy | 无 | 先持久化 ResetCause,再强制复位 |
GracefulResetWithCause | a{ss}yy | i | 先持久化 ResetCause,再平滑复位 |
SetResetLockStatus | a{ss}ssus | 无 | 设置或解除复位锁 |
| 参数名 | 方向 | 类型 | 描述 | 取值范围 |
|---|---|---|---|---|
| ResetType | 输入 | U8 | 重启类型 | 0 下次从正常系统启动;1 下次从最小系统启动 |
| ResetCause | 输入 | U8 | 重启原因 | 0~255,须遵循平台原因码表 |
| ResetMode | 输入 | String | 锁定层级 | WarmReset、GracefulReset、ForceReset |
| OperationType | 输入 | String | 动作 | Lock、Unlock |
| TimeoutSeconds | 输入 | U32 | Lock 自动超时 | Lock 时 10~300 秒;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 后连接会中断 |
0 | GracefulReset 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 重启后不会按源码表自动恢复。
调试示例
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。请先确认目标、串口和恢复方案,并在提示后输入确认字符串。
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 0CAUSE='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
参数说明
| 方法 | 入参 | 出参 | 说明 |
|---|---|---|---|
MockLogStorm | a{ss}u | 无 | 模拟日志风暴 |
| 参数名 | 方向 | 类型 | 描述 | 取值范围 |
|---|---|---|---|---|
| Count | 输入 | U32 | 风暴日志次数 | 实现仅在 Count>0 时输出;模型未设上限 |
返回值与异常
无返回值表示注入完成或 Count<=0 时无动作。短时间输出过多可能被框架日志风暴抑制。
应用场景
验证日志限流、一键收集和 rsyslog。
限制条件
调用方必须自行限制 Count;建议从 5~20 条开始。不要在生产环境大规模注入。
调试示例
busctl --user call bmc.kepler.maca /bmc/kepler/MacaService \
bmc.kepler.Dft MockLogStorm a{ss}u 1 Requestor docs-maca 52.4 bmc.kepler.Release.MonitorControl
功能说明
在运行态启用或禁用启动检查、健康检查或在线检查。该接口不会修改 mc_control.json。
路径:/bmc/kepler/MacaService
参数说明
| 方法 | 入参 | 出参 | 说明 |
|---|---|---|---|
SetMonitorStatus | a{ss}sb | i | 开启或关闭指定检查机制 |
| 参数名 | 方向 | 类型 | 描述 | 取值范围 |
|---|---|---|---|---|
| Type | 输入 | String | 检查机制类型 | starting、running、online |
| Enabled | 输入 | Boolean | 是否启用 | true / false |
返回值与异常
| 返回值 | 含义 | 触发条件 | 处理建议 |
|---|---|---|---|
0 | 开关操作成功 | Type 合法且底层接受 | 测试结束后恢复 |
-1 | 操作失败 | 空 Context、Type 非字符串/不支持,或 Enabled 类型错误 | 修正参数并确认 DiagnoseMgmt 权限 |
应用场景
故障注入、升级验证、定位检查机制是否导致组件重启或 BMC 自愈。
限制条件
只影响当前运行期,不持久化。关闭监控会降低自愈能力,测试结束必须恢复。
调试示例
busctl --user call bmc.kepler.maca /bmc/kepler/MacaService \
bmc.kepler.Release.MonitorControl SetMonitorStatus a{ss}sb \
1 Requestor docs-maca starting true$ mdbctl
% attach maca
% setmonitorstatus starting false
02.5 bmc.kepler.Mdb
功能说明
MDB 资源树查询。共享内存没有结果时,部分查询会回退到本地 ObjectMgr。Lua 封装见 mc.mdb.mdb_service。
路径:/bmc/kepler/MdbService
权限:ReadOnly。D-Bus 签名以 libmc4lua 生成代码 mdb.bmc.kepler.Mdb 为准(方法首参均为 Context)。
参数说明
| 方法 | 签名(不含 Context) | 入参 | 出参 | 说明 |
|---|---|---|---|---|
GetObject | sas → a{sas} | Path、Interfaces | Object | 按路径查找 service 与 Interface 映射 |
GetSubObjects | sias → a{sa{sas}} | Path、Depth、Interfaces | SubObjects | 按路径、深度、接口查找子对象 |
GetSubPaths | sias → as | Path、Depth、Interfaces | SubPaths | 查找满足条件的子路径 |
GetParentObjects | sas → a{sa{sas}} | Path、Interfaces | ParentObjects | 查找祖先 Path |
GetServiceName | s → s | Sender | ServiceName | 根据 D-Bus 发送方查服务名 |
GetServiceNames | → as | 无 | ServiceNames | 列出所有已索引服务 |
GetPath | ssb → ss | Interface、Filter、IgnoreCase | Path、Service | 按接口属性 JSON 过滤,返回字典序第一个路径 |
GetInterfaceOwners | s → a(ss) | Interface | InterfaceOwners | Sender 与 Path |
IsValidPath | sb → b | Path、IgnoreCase | Result | 路径是否有效 |
GetSubPathsPaging | siasii → as | Path、Depth、Interfaces、Skip、Top | Paths | 分页查找子路径 |
GetClasses | s → as | Service | ClassNames | 服务下的类名 |
GetObjectList | s → a(sa(ss)) | ClassName | ObjectList | 按类名查对象名、服务和路径 |
GetObjectOwner | s → a(ss) | ObjectName | ObjectOwners | 按对象名查服务和路径 |
GetMatchedObjects | ss → a(ssas) | ObjectName、InterfacePattern | MatchedObjects | 按服务名与接口模式查找 |
GetTracedObject | → as | 无 | TracedObjects | 查询被追踪对象路径 |
| 参数名 | 类型 | 描述 | 取值范围 |
|---|---|---|---|
| Path | String | 资源树对象路径 | 合法 D-Bus 路径 |
| Interfaces | String[] | 接口过滤 | 空数组表示不过滤 |
| Depth | S32 | 查找深度 | 由 MDB 库解释 |
| Sender | String | D-Bus 发送方 | 唯一连接名 |
| Filter | String | 属性名/值 JSON 对象 | 非法 JSON 时 GetPath 记 GetPath: invalid filter |
| IgnoreCase | Boolean | 是否忽略属性值/路径大小写 | true / false |
| Skip / Top | S32 | 分页偏移与条数 | Skip 为负等效 0;Top 为负表示 Skip 之后全部 |
| ObjectName(GetMatchedObjects) | String | 接口字段名为 ObjectName | 方法描述与 mdb_service.get_matched_objects 按服务名传入 |
| InterfacePattern | String | 接口模式字符串 | 建议先用完整接口名 |
GetSubPaths 只返回带自定义接口的路径;中间目录节点可能在 busctl tree 可见但查询为空,此时应对父对象调用 org.freedesktop.DBus.ObjectManager.GetManagedObjects。
GetTracedObject 已由 libmc4lua 生成代码注册(出参 TracedObjects)。当前工作区 mdb_interface 的 Mdb.json 未列出该方法;调用前请 introspect 确认目标镜像。
maca 1.130.6 仓内文档还记载 GetPropertyMatchedObjects(a{ss}ssvb → a(sssv),按接口/属性/Variant 匹配,排除 ay 与数组签名)。当前工作区 mdb_interface 与 libmc4lua 生成代码均未收录,本文不把它当作已核实的稳定 API。
返回值与异常
| 返回值 | 含义 | 触发条件 | 处理建议 |
|---|---|---|---|
| 对应结构/数组 | 查询成功 | 对象已上树且过滤匹配 | 业务侧用 mdb_service 解包 |
空字典/空数组/"" "" | 无匹配 | 路径不存在、过滤过严、初始化未完成 | 先 IsValidPath / GetServiceNames |
GetPath: invalid filter | Filter 不是 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 封装会缓存)。
调试示例
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 falselocal 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
参数说明
| 属性 | 类型 | 读写 | 默认值 | 说明 |
|---|---|---|---|---|
Customer | s | 可读写 | "" | 定制发货的客户名称 |
Version | s | 可读写 | "" | 客户定制套餐版本 |
Provider | s | 可读写 | "" | 定制版本提供商 |
读权限 ReadOnly,写权限 BasicSetting。写入 Version 且存在调用 Context 时会记录操作日志 Set customized version successfully。
返回值与异常
读取成功返回字符串。写入失败时检查权限、maca.db 和 operation/framework 日志。
应用场景
读取或更新 BMC 包定制信息。
限制条件
- 不要把 maca 组件自身版本写入
Version。 - 源码未定义长度或枚举约束(Customer 枚举限制已移除);业务格式由产品定制规范定义。
- 频繁写入应考虑闪存寿命。修改前记录原值,测试后恢复。
调试示例
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 Provider2.7 Debug 接口
功能说明
仅 Debug 构建、且相关模块可加载时出现。community 模式下当前实现即使加载 Debug 服务也不创建 LogMock 对象。
路径:
/bmc/kepler/Debug/LogMock—bmc.kepler.Debug.LogMock.MockLog/bmc/kepler/Debug/Performance—bmc.kepler.Debug.Performance.PerformanceSamplingIntervalMinutes
参数说明
| 方法/属性 | 签名 | 说明 |
|---|---|---|
MockLog | a{ss}usb → void | Count 1~1000,Text 长度 1~1024,RepeatText 为是否重复同一文本 |
PerformanceSamplingIntervalMinutes | 属性 q | 性能数据采集周期,单位分钟;默认 1440,最小值 1 |
RepeatText=true 时重复输出完全相同文本;false 时追加 (seq=n)。
返回值与异常
UnknownObject 表示对象不存在(Release、community 裁剪或模块未加载)。Count/Text 越界由模型校验拒绝。
应用场景
Debug 镜像验证重复日志合并、风暴抑制和性能采样周期。
限制条件
日志内容不得包含口令、密钥或个人数据。不要一次使用 Count 上限。
调试示例
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 PerformanceSamplingIntervalMinutes3. 组件扩展案例
3.1 扩展能力概述
maca 的主要扩展点不在于向 maca 仓直接添加业务代码,而在于让其他组件通过统一元数据和回调接入生命周期管理:
- 在
service.json声明type: application和deployConfig。 - 注册 MicroComponent 健康检查回调。
- 实现平滑复位 / 热复位回调。
- 通过
mc_control.json调整监控阈值和 process 超时。 - 配置 MDB 白名单 / 黑名单。
- 使用
mc.mdb.mdb_service查询资源树。
3.2 扩展点说明
| 扩展点 | 位置 | 触发时机 |
|---|---|---|
| 组件元数据 | 业务仓 mds/service.json | maca 收集活动组件 |
| 健康检查 | mc.mdb.micro_component.on_health_check | 周期 running 检查 |
| 平滑复位 | mc.mdb.micro_component.reboot 的 on_prepare / on_process / on_action / on_cancel | GracefulReset |
| 热复位 | mc.mdb.micro_component.reset | WarmReset |
| 运行参数 | /opt/bmc/conf/mc_control.json | maca 启动读取 |
| MDB 信任列表 | 环境变量 MDB_WHITE_LIST / MDB_BLACK_LIST | 服务名进入 MDB 前 |
| Dump / 备份 | MicroComponent Debug / config_manage | 一键收集、配置备份 |
3.3 二次开发指导
步骤一:声明组件元数据
{
"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。
步骤二:注册健康检查
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 |
步骤三:实现平滑复位回调
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_check、running_monitor.health_check / offline_check、graceful_reset_config.process.timeout_seconds(120~600)。环境变量还可覆盖 MC_CONTROL_PATH、MDB_WHITE_LIST、MDB_BLACK_LIST、CONTINUOUS_OFFLINE_TIMES、MAX_RESTART_LIMIT 等。
MDB 默认 MDB_WHITE_LIST="^i?bmc"。黑名单按完整名称精确匹配并优先拒绝;白名单按 Lua pattern 匹配。
验证方法
GetComponentList确认组件在活动列表。- 查看
/var/log/framework.log中 startup/health 日志。 - 故障注入后确认只重启预期
deployConfig。 - 修改白名单后用
GetServiceNames核对索引范围。
注意事项
- 健康回调需快速返回;maca RPC 超时为 30 秒,但业务不应把该上限当作正常耗时。
StartupCheck failed只是 maca 观察到的结果,根因可能在上游依赖。- 保持接口名、错误消息 ID 向后兼容;不得在日志中输出密钥或口令。
4. 日志说明
4.1 一键日志收集
maca 通过 MicroComponent Debug 的 on_dump 输出:
| 文件路径 | 内容说明 |
|---|---|
<收集目录>/mdb_info.log | ShmLockManager.dump_state() 及 total_locks、total_unlocks、total_timeouts、total_deadlocks、active_read_locks、active_write_locks、lock_contentions |
| 宿主进程日志 | /var/log/framework.log、/var/log/app.log 等,由 syslog 路由决定 |
配置备份回调会把 maca.db 复制到调用方指定目录,属于配置备份链路,不要与一键日志文件混为一谈。
4.2 关键日志信息
| 日志片段 | 日志级别 | 含义解读 | 建议处理动作 |
|---|---|---|---|
maca is initializing | NOTICE | 主初始化开始 | 后续应看到对象创建和检查任务 |
start maca failed, err: | ERROR | 主服务构造失败 | 检查依赖库、数据库、MDS 生成代码 |
[<component>]StartupCheck failed | ERROR | 组件未完成启动 | 查 systemd 与该组件上游,不一定是 maca bug |
start to restart abnormal components | NOTICE | 第一轮启动失败后重启异常子系统 | 对照 deployConfig |
Force Reset begin / GracefulReset begin / WarmReset begin | NOTICE | 对应复位开始 | 结合 operation.log 与阶段日志 |
<component> rebooting ... prepare failed | NOTICE | 组件拒绝 prepare | maca cancel 并拒绝平滑复位 |
process ... timeout, components: | NOTICE | process 超时 | 当前实现会跳过并继续 |
action fail, skip it | ERROR | action 明确失败 | 当前实现仍继续复位 |
Force reset is locked 等 | WARN/NOTICE | 对应复位被锁定 | 读 ResetLockStatus |
clear watchdog failed: | ERROR | 喂狗失败 | 检查 libsoc_adapter WDT |
the debug log is missing and rsyslog is restarted successfully | WARN | 日志文件缺失后已恢复 | 检查 rsyslog 与文件系统 |
GetPath: invalid filter | INFO | Filter 非法 | 修正 JSON |
start to dump process | NOTICE | 一键收集回调执行 | 检查收集目录中的 mdb_info.log |
临时提升调试级别:
busctl --user call bmc.kepler.maca /bmc/kepler/maca/MicroComponent \
bmc.kepler.MicroComponent.Debug SetDlogLevel a{ss}sy 0 debug 1MicroComponent 实际路径以目标镜像 introspect 为准。完成后恢复 notice。
5. 问题定界指南
5.1 典型问题定界
| 问题描述 | 是否为本组件问题 | 判断依据 | 关键证据收集方法 |
|---|---|---|---|
StartupCheck failed,目标服务 dependency failed | 通常不是 | maca 只是发现未到 InitCompleted | systemctl status、依赖树、目标组件日志 |
GetComponentList 缺少刚上线组件 | 可能是异步窗口 | 需要服务名与 MicroComponent 对象就绪 | busctl --user list、等待后重试 |
| MDB 查不到对象,但直接 busctl 能访问 | 可能是信任列表 | 服务未进入 MDB | GetServiceNames、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.4 | GracefulReset 的 0 需继续看阶段日志 |
-1(SetMonitorStatus) | 失败 | Context/Type/Enabled 非法 | 修正参数 |
-1(GracefulReset) | 已有流程进行 | 并发调用 | 稍后重试 |
PropertyValueError(Requestor) | Requestor 非法 | Add/RemoveMatch Context | 传字符串 Requestor |
OperationNotAllowed | 操作不允许 | 复位锁或已有热复位 | 读锁状态 |
ResetOperationNotAllowed | 平滑复位不允许 | 锁或 Prepare 失败 | 查失败组件 |
ValueOutOfRange(ResetLockStatus) | 锁参数非法 | Timeout 或 OperationType | 10~300 秒,Lock/Unlock |
InternalError | 最小系统标志失败 | recovery_mode_flag | 检查 /data/trust |
ServiceUnknown / UnknownObject | 服务或路径不存在 | 未启动、Debug 裁剪、路径错误 | busctl tree/introspect |
5.3 最小化复现与证据收集
- 记录服务名、对象路径、接口、方法、Context、返回值和 ResetLockStatus。
- 收集
framework.log、app.log、operation.log、running.log与mdb_info.log。 systemctl status framework.service maca.service,并用busctl --user tree/introspect/call交叉验证。- 无自定义接口的路径改用
GetManagedObjects。 - 保存固件版本、maca 版本、是否最小系统、
mc_control.json和相关环境变量。
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} 05.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 及以后。