get_sub_objects报init.lua:758: invalid interface

在network_adapter.lua里面新增加了一个定制查询,发现查询报错:

通过添加调试,发现这个接口报错

这种报错是对interface有什么要求哇?因为这边看这个是已经上树了的

且通过 GetSubObjects和GetSubPaths都能够查询到:

基础社区版本是: 25.12 LTS SP1

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

问题 原因 解决方案
mdb.get_sub_objectsinvalid interface 接口虽在 D-Bus 上存在,但未被 libmc4lua 识别为“合法自定义接口” :white_check_mark:service.json 中声明接口并重新构建
GetSubObjects 命令行可用,Lua 不可用 D-Bus 层与 mdb 模块校验机制不同 :white_check_mark: 使用 GetManagedObjects 或手动 get_object 临时绕过
接口未规范注册 缺少流程管理 :white_check_mark: 提交 Interface SIG 评审,走标准化流程
点击此处查看详细分析解答

get_sub_objects 报错 invalid interface 问题分析与解决

根据您提供的信息,您的代码在调用 mdb.get_sub_objects 时出现错误:

init.lua:758: invalid interface:bmc.CTCC.CTCCDPUCard

尽管通过 D-Bus 工具(如 buctl)可以查询到该接口和路径,但在 Lua 层面调用 mdb.get_sub_objects 时仍然报错。以下是对此问题的全面分析和解决方案。


:magnifying_glass_tilted_left: 问题现象总结

项目 现象
错误日志 init.lua:758: invalid interface:bmc.CTCC.CTCCDPUCard
出错位置 network_adapter.luamdb.get_sub_objects(...) 调用
接口与路径 接口为 bmc.CTCC.CTCCDPUCard,路径为 /bmc/CTCC/CTCCDPUCard
验证手段 buctl call GetSubObjects / GetSubPaths 可成功返回结果
基础版本 25.12 LTS SP1

:puzzle_piece: 为什么 D-Bus 能查到,Lua 却报错?

关键在于:D-Bus 接口可见 ≠ mdb 模块识别该接口为“有效自定义接口”

:white_check_mark: D-Bus 层面:接口确实存在

您使用的命令:

buctl --user call bmc.kepler.maca /bmc/kepler/MdbService bmc.kepler.Mdb GetSubObjects

成功返回了带有接口 bmc.CTCC.CTCCDPUCard 的对象路径,说明:

  • 该接口已在 D-Bus 上注册
  • 对象树中已“上树”
  • 服务 bmc.kepler.maca(即 MDB Service)已感知该路径和接口

:backhand_index_pointing_right: 结论:D-Bus 通信无问题


:cross_mark: Lua 层面:mdb.get_sub_objects 检查更严格

根据知识库中关于 libmc4luainit.lua 的描述,mdb.get_sub_objects 是由 libmc4lua 提供的 Lua 封装函数,其行为受以下因素影响:

libmc4lua 是一个集成 Lua 与 C/BMC 系统的核心库,负责对象管理、接口验证、生命周期控制等。

关键机制:接口必须在 service.json 或配置中声明为“自定义资源接口”

  • mdb.get_sub_objects 不仅检查 D-Bus 对象是否存在,还会校验该接口是否被注册为“已知的有效自定义接口”。
  • 如果接口未在系统配置中注册或未被 libmc4lua 加载识别,即使路径存在,也会报 invalid interface

:light_bulb: 知识库佐证:

文档 ID 1 明确指出:get_sub_paths 方法只能获取 带自定义接口的资源树子路径,对于没有自定义接口的路径无法查询。
解决方案是使用 GetManagedObjects 而非 get_sub_paths —— 表明框架对“是否为自定义接口”有严格区分。


:magnifying_glass_tilted_right: 深层原因分析

结合知识库内容和实际行为,根本原因如下:

:cross_mark: 接口 bmc.CTCC.CTCCDPUCard 未被正确声明为“自定义资源接口”

  1. 虽已上树(通过其他方式注册),但未通过 libmc4lua标准接口注册流程
  2. init.lua 在处理对象注册时,会对接口合法性进行校验(位于 init.lua:758
  3. mdb.get_sub_objects 内部调用引发校验失败 → 抛出异常:invalid interface

:pushpin: 相关实体:

  • init.lua 是系统初始化入口,管理服务启动、接口注册、路径校验
  • object_manage.lua 协调对象生命周期,可能拦截此类错误
  • libmc4lua 是底层支撑库,负责接口与对象映射

:white_check_mark: 解决方案

要使 mdb.get_sub_objects 成功调用,必须确保该接口被系统 正式识别为“合法的自定义资源接口”。以下是推荐操作步骤:


:white_check_mark: 方案一:将接口注册为“自定义资源接口”(推荐)

步骤 1:确认 service.json 是否声明该接口

检查项目中 service.json(或对应配置文件)是否包含:

{
  "interfaces": {
    "bmc.CTCC.CTCCDPUCard": {
      "properties": {
        "BIOSVersion": { "type": "s", "access": "read" },
        "BMCVersion": { "type": "s", "access": "read" },
        "CPLDVersion": { "type": "s", "access": "read" }
      }
    }
  }
}

若无,请补充声明该接口

步骤 2:确认该接口被组件加载

  • 确保提供该接口的组件(例如 CTCCDPUCard 驱动或插件)已正确集成到构建系统中
  • 检查 CMakeLists.txt 是否依赖 libmc4lua 并注册了该接口

类似 Hello_openUBMC 组件需在 service.lua 中声明接口(参考 KG 中 Hello_openUBMC 描述)


:white_check_mark: 方案二:使用 GetManagedObjects 替代 get_sub_objects

若接口无法立即注册为“自定义资源接口”,可改用 D-Bus 标准接口绕过限制。

示例代码(参考 Doc ID 1):

local function get_ctcc_dpu_card_via_dbus(bus)
    local service = "bmc.kepler.maca"
    local path = "/bmc/CTCC/CTCCDPUCard"
    local interface = "org.freedesktop.DBus.ObjectManager"

    local ok, result = pcall(bus.get_managed_objects, service, path)
    if not ok or not result then
        log:error("Failed to call GetManagedObjects")
        return nil
    end

    for object_path, interfaces in pairs(result) do
        if interfaces["bmc.CTCC.CTCCDPUCard"] then
            local card_obj = mdb.get_object(bus, object_path, "bmc.CTCC.CTCCDPUCard")
            if card_obj then
                return card_obj
            end
        end
    end
    return nil
end

:white_check_mark: 优点:不依赖接口是否为“自定义资源接口”
:warning: 缺点:需要手动解析对象,不如 get_sub_objects 简洁


:white_check_mark: 方案三:手动调用 get_object 遍历路径(兜底方案)

如果您已知唯一实例路径:

local function get_ctcc_dpu_card_hardcoded(bus)
    local fixed_path = "/bmc/CTCC/CTCCDPUCard/CTCCDPUCard_1_0101010105"
    local ok, obj = pcall(mdb.get_object, bus, fixed_path, "bmc.CTCC.CTCCDPUCard")
    if ok and obj then
        return obj
    else
        log:error("Failed to get object at %s", fixed_path)
        return nil
    end
end

:white_check_mark: 适用于单卡、固定部署场景
:warning: 不具备扩展性,不推荐长期使用


:books: 附加建议

1. 检查 libmc4lua 版本兼容性

由于您使用的是 25.12 LTS SP1,请确认 libmc4lua 版本是否匹配:

知识库显示多个版本(如 1.100.82, 1.110.26),若版本不匹配可能导致接口识别异常。

建议:

conan search libmc4lua --remote=all

确保构建环境使用正确版本。


2. 添加调试日志确认接口加载顺序

init.lua 或组件初始化阶段加入日志,确认:

  • 该接口是否在 mdb.register_interface(...) 时被加载
  • 是否在 object_manage.lua 中被成功注册

3. 参考标准流程申报接口变更

根据知识库文档 ID 3《interface SIG 接口变更流程》:

bmc.CTCC.CTCCDPUCard 是新增接口,应通过社区流程进行评审和注册:

  1. 在 “Interface SIG” 板块提交议题
  2. 说明接口用途、属性、方法
  3. 获得审批后发布变更声明
  4. 更新 service.json 并提交代码

规范化后可避免后续集成问题


:white_check_mark: 总结

问题 原因 解决方案
mdb.get_sub_objectsinvalid interface 接口虽在 D-Bus 上存在,但未被 libmc4lua 识别为“合法自定义接口” :white_check_mark:service.json 中声明接口并重新构建
GetSubObjects 命令行可用,Lua 不可用 D-Bus 层与 mdb 模块校验机制不同 :white_check_mark: 使用 GetManagedObjects 或手动 get_object 临时绕过
接口未规范注册 缺少流程管理 :white_check_mark: 提交 Interface SIG 评审,走标准化流程

:pushpin: 推荐最终做法

  1. 短期:改用 GetManagedObjects 实现功能,保证业务可用
  2. 长期:将 bmc.CTCC.CTCCDPUCard 正式注册为标准接口,提交 SIG 评审
  3. 验证:确认 libmc4lua 版本与平台配套,避免兼容性问题

如能提供 service.json 内容或组件注册逻辑,可进一步精确定位问题。