Dbus 基础
DBus(Desktop Bus)是一种面向 Linux/Unix 系统的进程间通信(IPC)机制,其核心设计理念是通过标准化的消息总线架构实现异构系统组件间的交互。
DBus 属于中心化通信架构,其在处理高吞吐量数据传输及满足硬实时性要求方面存在固有局限。尽管如此,DBus 在特定应用场景中仍具有重要价值,具体体现在以下几个方面:
标准化硬件资源管理接口
在 openUBMC 中,我们通过 bmc.kepler 命名空间对传感器、固件等硬件资源进行统一抽象与管理,实现了硬件访问的规范化和接口化。
支持松耦合的 RPC 式服务调用
DBus 支持将复杂应用程序拆分为多个功能独立的轻量级组件,各组件仅需聚焦于自身功能实现,无需关注其他组件的内部细节。该机制显著提升了系统的模块化程度,便于组件的独立维护、替换与扩展,从而增强整体架构的可裁剪性,与 openUBMC 所倡导的开放特性高度契合。
基于资源树结构的通信机制
DBus 所提供的资源树型接口使组件功能及其依赖关系更加清晰明确,有利于实现系统层面的分层设计与模块化管理,为 openUBMC 系统的长期可维护性与架构演化提供了良好支撑。
资源协作接口介绍
在 D-Bus 协议的基础上,mdb_interface 定义了资源协作接口的模型集合。这些接口的具体描述工作,由 MDS 方式完成。
mdb_interface 中的资源定义总体上通过 json 格式进行描述,分为 path 和 intf 两部分。关于资源的具体资源属性说明如下表:
| 资源基础属性 | 资源属性说明 | 资源样例 |
|---|---|---|
| path | 用于唯一标识资源对象的路径,其层级结构类似于文件系统路径 | /bmc/kepler/Managers/1 说明:该路径标识了名为管理系统 1 这个资源对象 |
| interface | 每个资源对象是由若干个 interface 组成,每个 interface 可视为一个具体的类型实例,其概念可类比于面向对象编程中的“类”。 | bmc.kepler.Managers.Time 说明:此接口定义了管理系统中与时间相关的功能 |
| property | 资源对象具体 interface 下的属性,其概念可类比于面向对象编程中的类属性。 | DateTime 说明:此属性隶属于时间接口,表示系统的当前日期与时间 |
| method | 资源对象具体 interface 下的方法,其概念可类比于面向对象编程中的类方法 | SetDateTime 说明:此方法隶属于时间接口,用于设置系统的日期与时间 |
| signal | 资源对象具体 interface 下的信号,可供其他组件订阅与监听 | FruAdded 说明:当新的 FRU 设备添加完成后,此信号会被触发,并携带该 FRU 的 ID 与名称信息 |
busctl 命令
busctl 是一款用于监控与管理 D-Bus 总线的命令行工具。通过该工具,用户可以列举 D-Bus 总线上的对象、接口及方法,并实时监视总线上的消息传递与事件触发情况。
D-Bus 按作用范围分为两种类型:
- 用户总线(User Bus):为每个用户会话独立运行的 D-Bus 实例,负责该会话内应用程序之间的进程间通信。
- 系统总线(System Bus):系统级别的 D-Bus 实例,作用于整个操作系统,用于在系统级别的进程之间进行通信,例如硬件管理(如插入USB设备通知)、系统服务(如网络管理、打印机服务)或需要特权访问的核心进程。
常用命令
- 列出dbus用户总线上的所有服务:
busctl --user list- 列出dbus用户总线上服务的对象树:
busctl --user tree [service]- 列出dbus用户总线上指定对象的指定接口的所有方法:
busctl --user introspect <service> <object> [interface]- 监视dbus用户总线上的消息传递:
busctl --user monitor [service] [object]- 查看dbus用户总线上指定对象的属性
busctl --user get-property <service> <object> <interface> <property>- 设置dbus用户总线上指定对象的属性
busctl --user set-property <service> <object> <interface> <property> <SIGNATURE> <ARGUMENT>- dbus 用户总线进行方法调用:
busctl --user call <service> <object> <interface> <method> <SIGNATURE> <ARGUMENT>应用示例
若通过 Telnet 连接至目标环境 IP,需在执行source /etc/profile命令后,方可正常使用busctl命令;而若通过 SSH 连接,则无需执行该配置加载命令,即可直接执行busctl命令。
mdbctl 命令
除 D-Bus 原生工具之外,openUBMC 还提供了一套成熟的对象查询工具mdbctl。该命令主要基于 MDS 对象维度进行操作,适用于系统调试与对象状态查询,并限定仅具备调试诊断权限的用户方可执行。
需特别说明的是,mdbctl 属于调试工具,其 setprop 与 call 命令在执行时会绕过业务逻辑,直接对属性或方法进行操作,原则上不提供持久化支持,所设置的属性值在系统重启后将不会保留。
mdbctl 调试资源协作对象的常用命令
以下为使用mdbctl工具调试资源协作对象的常规操作流程:
- 连接环境与启动工具
通过 SSH 登录至目标环境,在命令行中执行mdbctl命令,即可进入交互式命令行界面。 - 查看帮助信息
在交互界面中执行help命令,可查看所有支持的内置调试命令。 - 选择目标组件
使用lsmc命令查看当前已启动的组件。随后通过attach <组件名>命令选定需操作的组件,该命令支持多次执行以同时选定多个组件。 - 查看类与对象
- 使用
lsclass <组件名>命令可列举当前所有的类,或指定模块的类。 - 使用
lsobj <类名>命令可列举指定类下的所有对象。
- 使用
- 属性相关操作
- 使用
lsprop <object name> [interface name]命令可列举指定对象的所有属性或指定对象下指定接口的所有属性。 - 使用
getprop <object name> <interface name> <property name>可获取指定对象的特定属性值 - 使用
setprop <operation type> <object name> <interface name> <property name> [parameter list]可设置指定对象的属性值,其中operation type参数可选set/unset/modify。
- 使用
- 方法相关操作
- 使用
lsmethod <object name> [interface name]命令,可列举指定对象支持的所有方法。 - 使用
call <object name> <interface name> <method name> [parameter list]命令,可调用指定对象的特定方法。
- 使用