openBMC 的 D-Bus & Object Mapper

// 如果之后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 大概有以下几个

  • systemd/sd-bus
  • sdbusplus & sdbus++
  • the object mapper
  • phosphor-dbus-interfaces

OpenBMC 和 D-Bus 的关系

在OpenBMC - Wikipedia中有一段描

OpenBMC uses D-Bus as an inter-process communication (IPC).
(OpenBMC 使用 D-Bus 作为进程间通信 (IPC))

下面的图是我简单画的openBMC架构,在user space 中是由很多process (daemon)所组成的

openBMC 的 D-Bus & Object Mapper_第1张图片

例如sensor monitor daemon会去定期读取sensor value,使用者可以透过 redfish 来获取读值,那redfish daemon 要去哪里获取读值呢? OpenBMC 给的答案是 "D-Bus"

openBMC 的 D-Bus & Object Mapper_第2张图片

只要所有资料都放到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)

  • Property – Store values. Some can be written to (存储值。有些可以改写)
  • Method – Make method calls.(进行方法调用)
  • Signal – Inform other process about an event. (将事件通知其他进程)
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" 中

openBMC 的 D-Bus & Object Mapper_第3张图片

可以透过指令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

systemd/sd-bus.h at main · systemd/systemd · GitHub

sd-bus 是最小的 D-Bus IPC C library,和systemd 一起released

sdbusplus & sdbus++

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 使用

The Object Mapper

GitHub - openbmc/phosphor-objmgr: Phosphor Object Manager

这个很像BMC内部小型的database,主要两个功能是

  • Methods - 提供 D-Bus 发现相关功能。
  • Associations - 将两个不同的对象相互关联。

以下内容我简单翻译一下官方介绍 docs/object-mapper.md at master · openbmc/docs · GitHub

Methods 

前面有提到OpenBMC是由很多process所组成的,我们可以任意替换成自己开发的 psusensor daemon 或是 biosconfig daemon,但这样redfish 怎么知道她想要的值是哪些services所提供的?

因此object mapper会监测dbus上的动作,例如新增/删除 interface、object,或是 service rename等行为,redfish 可以透过 object mapper 查找想要的资讯,例如

GetObject : 查找实现特定object path的service及其interface。

openBMC 的 D-Bus & Object Mapper_第4张图片

GetSubTree: 在指定的subtree中查找实现某个interface的object、service和interface。

例如底下范例就是查找有"xyz.openbmc_project.Sensor.Threshold.Warning"这个interface的object、service和interface

openBMC 的 D-Bus & Object Mapper_第5张图片

GetSubTreePaths: 这与 GetSubTree 相同,但只返回object path 

openBMC 的 D-Bus & Object Mapper_第6张图片

GetAncestors: 查找实现特定interface的object的所有祖先。

openBMC 的 D-Bus & Object Mapper_第7张图片

以上这些method都是提供查找相对应的service和interface或是object path,但如果需要读值,还是要透过dbus api去读取,也是带入"service, object path, interface, property"

Associations 

关联,用一个指针指向相关联的物件,例如

  • 一条system event log, 可能是关于某个sensor的出了问题
  • 一个sensor ,可能是长在某一块板子上的

创建一个关联很简单,只要在object pathA中加入"xyz.openbmc_project.Association.Definitions"这个interface,并且新增一个tuple,[forward, reverse, object path]

这样就能在object mapper 中产生一个Association

openBMC 的 D-Bus & Object Mapper_第8张图片

再来个例子,大概是这样的操作,所以我们就能知道每块板子上有哪些sensor

openBMC 的 D-Bus & Object Mapper_第9张图片

先这样,之后有机会再补 

你可能感兴趣的:(BMC,Redfish,bmc,restful)