// 如果之后OpenBMC架构有改,这边不会更新
目录
OpenBMC 和 D-Bus 的关系
systemd/sd-bus
sdbusplus & sdbus++
The Object Mapper
Methods
GetObject : 查找实现特定object path的service及其interface。
GetSubTree: 在指定的subtree中查找实现某个interface的object、service和interface。
GetSubTreePaths: 这与 GetSubTree 相同,但只返回object path
GetAncestors: 查找实现特定interface的object的所有祖先。
Associations
简单纪录一下我对openbmc dbus 相关repository 的理解,OpenBMC 和 D-Bus 有关的 repository 大概有以下几个
在OpenBMC - Wikipedia中有一段描
OpenBMC uses D-Bus as an inter-process communication (IPC).
(OpenBMC 使用 D-Bus 作为进程间通信 (IPC))
下面的图是我简单画的openBMC架构,在user space 中是由很多process (daemon)所组成的
例如sensor monitor daemon会去定期读取sensor value,使用者可以透过 redfish 来获取读值,那redfish daemon 要去哪里获取读值呢? OpenBMC 给的答案是 "D-Bus"
只要所有资料都放到D-Bus上,这样这些 daemon 就能共享资料了,那dbus 的协议和操作方法可以看官方建议的 The new sd-bus API of systemd (0pointer.net)这篇文章
操作D-Bus可以先认识几个名词
Service - A daemon attached to the dbus and providing objects. (附加到 dbus 并提供对象的守护进程。)
root@romulus:~# busctl
xyz.openbmc_project.State.BMC
Object Paths – A tree, like a file system, of paths to objects.(对象路径的树,如文件系统)
root@romulus:~# busctl tree xyz.openbmc_project.State.BMC
└─/xyz
└─/xyz/openbmc_project
└─/xyz/openbmc_project/state
└─/xyz/openbmc_project/state/bmc0
Interface – The 'class' of an object. Objects support multiple inheritance.(对象的“ class ”。 对象支持多重继承) (也有人称作a set of method and signal)
root@romulus:~# busctl introspect xyz.openbmc_project.State.BMC /xyz/openbmc_project/state/bmc0
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
xyz.openbmc_project.State.BMC interface - - -
.CurrentBMCState property s "xyz.openbmc_project.State.BMC.BMCState… emits-change writable
.LastRebootTime property t 1619401752000 emits-change writable
.RequestedBMCTransition property s "xyz.openbmc_project.State.BMC.Transiti… emits-change writable
例如PSUSensor 注册了一个Service "xyz.openbmc_project.PSUSensor"
产生一个object "/xyz/openbmc_project/sensors/power/PSU_Output_Voltage"
并且assign的其中一个interface是 "xyz.openbmc_project.Sensor.Value" 这样他应该会继承四个property (phosphor-dbus-interfaces/Value.interface.yaml at master · openbmc/phosphor-dbus-interfaces · GitHub),并且把读到的PSU_Output_Voltage放到 "Value" 中
可以透过指令get-property SERVICE OBJECT INTERFACE PROPERTY...来获得PSU_Output_Voltage的value
~# busctl get-property xyz.openbmc_project.PSUSensor //service
/xyz/openbmc_project/sensors/power/PSU_Output_Voltage //object
xyz.openbmc_project.Sensor.Value //interface
Value //property
是的,所以IPMI 和 redfish只要到指定路径就可以拿到想要的 sensor value,或是系统资料
systemd/sd-bus.h at main · systemd/systemd · GitHub
sd-bus 是最小的 D-Bus IPC C library,和systemd 一起released
sdbusplus/README.md at master · openbmc/sdbusplus · GitHub
sdbusplus 是用于与 D-Bus 交互的 C++ library (libsdbusplus),构建在 systemd 的 sd-bus library之上,这样C++可以直接呼叫API,更方便好用
另外sdbus++是一个生成 C++ 绑定的工具,以简化基于 D-Bus 的应用程序的开发,搭配phosphor-dbus-interfaces GitHub - openbmc/phosphor-dbus-interfaces: YAML descriptors of standard dbus interfaces 使用
GitHub - openbmc/phosphor-objmgr: Phosphor Object Manager
这个很像BMC内部小型的database,主要两个功能是
以下内容我简单翻译一下官方介绍 docs/object-mapper.md at master · openbmc/docs · GitHub
前面有提到OpenBMC是由很多process所组成的,我们可以任意替换成自己开发的 psusensor daemon 或是 biosconfig daemon,但这样redfish 怎么知道她想要的值是哪些services所提供的?
因此object mapper会监测dbus上的动作,例如新增/删除 interface、object,或是 service rename等行为,redfish 可以透过 object mapper 查找想要的资讯,例如
例如底下范例就是查找有"xyz.openbmc_project.Sensor.Threshold.Warning"这个interface的object、service和interface
以上这些method都是提供查找相对应的service和interface或是object path,但如果需要读值,还是要透过dbus api去读取,也是带入"service, object path, interface, property"
关联,用一个指针指向相关联的物件,例如
创建一个关联很简单,只要在object pathA中加入"xyz.openbmc_project.Association.Definitions"这个interface,并且新增一个tuple,[forward, reverse, object path]
这样就能在object mapper 中产生一个Association
再来个例子,大概是这样的操作,所以我们就能知道每块板子上有哪些sensor
先这样,之后有机会再补