欢迎光临
我们一直在努力

OpenBMC:entity-manager 设备建模机制

OpenBMC:entity-manager 设备建模机制

1. 前言

在 OpenBMC 中,硬件设备通常不是直接由上层服务以固定代码的方式描述,而是通过配置文件完成设备建模。

entity-manager 就是 OpenBMC 中负责设备配置和运行时建模的重要组件。它通过 JSON 配置文件描述主板、处理器、内存、电源、风扇、温度传感器以及电压传感器等硬件资源,并将匹配到的设备信息发布到 D-Bus。

整体关系如下:

平台硬件
↓
设备树、I2C、GPIO、FRU 等底层信息
↓
entity-manager JSON 配置
↓
entity-manager 运行时对象
↓
dbus-sensors、风扇控制、功耗管理等服务
↓
D-Bus、Redfish、IPMI、WebUI

entity-manager 本身通常不负责周期性读取温度、电压或风扇转速,它更侧重于:

  • 描述平台硬件
  • 判断硬件是否存在
  • 创建运行时配置对象
  • 发布设备属性和关联关系
  • 为其他 OpenBMC 服务提供统一的设备模型

2. entity-manager 的主要作用

2.1 描述平台硬件

不同服务器平台的硬件组成不同,例如:

  • I2C 总线数量不同
  • 温度传感器型号不同
  • 电源模块数量不同
  • 风扇数量和命名方式不同
  • CPU、内存和主板结构不同
  • 传感器阈值不同

如果将这些内容全部写入 C++ 代码,平台变化时需要重新修改和编译程序。

entity-manager 将平台差异放入 JSON 配置文件中,使硬件描述和业务代码分离。

2.2 进行硬件匹配

一个系统镜像可能支持多个硬件版本。entity-manager 启动后,会根据配置中的 Probe 条件判断当前设备是否存在。

例如:

当前设备是某型号主板
当前 I2C 总线上存在指定芯片
当前 FRU 信息符合指定条件

只有满足条件的配置才会被加载。

2.3 创建 D-Bus 配置对象

配置匹配成功后,entity-manager 会在 D-Bus 上发布对应的设备信息。

其他服务可以通过这些对象了解:

  • 当前平台有哪些设备
  • 每个设备的名称是什么
  • 设备属于哪个硬件部件
  • 传感器使用哪个总线和地址
  • 传感器有哪些阈值
  • 风扇控制需要使用哪些参数

2.4 支持动态设备模型

设备模型不是全部硬编码在系统启动流程中,而是由配置和运行时探测结果共同决定。

当设备被发现、移除或配置发生变化时,相关 D-Bus 对象也可以随之变化。这种方式适合支持:

  • 可插拔电源模块
  • 多种主板型号
  • 不同数量的风扇
  • 可选传感器
  • 不同硬件版本

3. entity-manager 的整体架构

entity-manager 的工作流程可以分为几个阶段:

读取 JSON 配置
↓
解析 Probe 条件
↓
匹配当前硬件
↓
创建 Entity 对象
↓
创建 Exposes 配置对象
↓
发布设备属性和关联关系
↓
通知其他 D-Bus 服务

其中:

  • Entity 表示一个较大的硬件实体,例如主板、电源或处理器。
  • Exposes 表示该实体对外提供的具体功能,例如温度传感器、电压传感器或风扇。
  • Probe 用于判断当前配置是否适用于当前硬件。

4. Entity 与 Exposes

4.1 Entity

Entity 通常表示一个硬件设备或硬件区域,例如:

Main Board
CPU Board
Power Supply
Fan Board
Chassis

一个简单的 Entity 配置如下:

{
"Name": "Main Board",
"Type": "Board",
"Probe": "TRUE",
"Exposes": []
}

其中:

字段作用
Name 实体名称
Type 实体类型
Probe 设备匹配条件
Exposes 该实体提供的硬件功能

4.2 Exposes

Exposes 用于描述 Entity 对外提供的具体功能。

例如主板上有一个温度传感器:

{
"Name": "Main Board",
"Type": "Board",
"Probe": "TRUE",
"Exposes": [
{
"Name": "Board Temp",
"Type": "TMP75",
"Bus": 3,
"Address": 72
}
]
}

这里表示:

实体:Main Board
功能:Board Temp
设备类型:TMP75
I2C 总线:3
I2C 地址:0x48

因为 JSON 中的十进制 72 等于十六进制 0x48。

一个 Entity 可以包含多个 Exposes:

{
"Name": "Main Board",
"Type": "Board",
"Probe": "TRUE",
"Exposes": [
{
"Name": "Board Temp",
"Type": "TMP75",
"Bus": 3,
"Address": 72
},
{
"Name": "12V Input",
"Type": "ADM1272",
"Bus": 4,
"Address": 64
},
{
"Name": "Fan0",
"Type": "Fan",
"Bus": 5,
"Address": 32
}
]
}

这表示一个主板实体同时包含:

  • 一个温度传感器
  • 一个电压或功率监控设备
  • 一个风扇设备

5. Probe 硬件匹配机制

Probe 是 entity-manager 配置中的重要部分,用于确认硬件是否存在。

5.1 固定匹配

最简单的方式是:

"Probe": "TRUE"

这表示配置始终有效,适用于平台硬件固定、无需额外探测的场景。

5.2 I2C 设备匹配

可以根据 I2C 总线和地址匹配设备:

{
"Name": "Board Sensor",
"Type": "Board",
"Probe": "xyz.openbmc_project.FruDevice({'BOARD_PRODUCT_NAME': 'ExampleBoard'})",
"Exposes": [
{
"Name": "Board Temp",
"Type": "TMP75",
"Bus": 3,
"Address": 72
}
]
}

具体 Probe 语法会随 OpenBMC 版本和平台配置方式有所差异,实际使用时需要与当前分支中的 entity-manager 解析规则保持一致。

5.3 FRU 信息匹配

很多平台会通过 FRU 信息区分硬件版本,例如:

BOARD_PRODUCT_NAME
BOARD_PART_NUMBER
PRODUCT_PRODUCT_NAME
PRODUCT_SERIAL_NUMBER

配置可以根据 FRU 属性进行匹配:

主板产品名称为 Board-A
电源型号为 PSU-1200
硬件版本为 Rev2

这样,同一个镜像就可以根据当前硬件自动选择不同配置。

5.4 组合匹配

复杂平台可能同时使用多个条件:

主板型号匹配
并且指定 I2C 设备存在
并且 FRU 版本正确

组合条件可以避免错误加载其他平台的传感器和设备配置。


6. 传感器建模

entity-manager 可以描述温度、电压、电流、功率和风扇转速等设备。

6.1 温度传感器

{
"Name": "CPU0 Temp",
"Type": "TMP75",
"Bus": 3,
"Address": 72
}

传感器服务根据该配置找到对应的硬件设备,然后创建 D-Bus 对象:

/xyz/openbmc_project/sensors/temperature/CPU0_Temp

6.2 电压传感器

{
"Name": "P12V",
"Type": "Voltage",
"Bus": 4,
"Address": 64,
"Channel": 0
}

对应的 D-Bus 路径可能为:

/xyz/openbmc_project/sensors/voltage/P12V

6.3 风扇传感器

{
"Name": "Fan0",
"Type": "Fan",
"Bus": 5,
"Address": 32,
"SensorNumber": 0
}

风扇相关数据可能包括:

  • 当前转速
  • 目标转速
  • PWM 占空比
  • 风扇存在状态
  • 风扇故障状态

6.4 电源设备

电源模块通常不只提供一个传感器,而是同时提供:

  • 输入电压
  • 输出电压
  • 输入电流
  • 输出电流
  • 输入功率
  • 输出功率
  • 温度
  • 风扇转速
  • 电源在位状态

因此,电源设备的建模通常比普通温度传感器复杂。


7. 阈值配置

传感器通常需要设置 Warning 和 Critical 阈值。

一个温度传感器配置示例如下:

{
"Name": "CPU0 Temp",
"Type": "TMP75",
"Bus": 3,
"Address": 72,
"Thresholds": [
{
"Direction": "greater than",
"Name": "upper warning",
"Severity": 0,
"Value": 70
},
{
"Direction": "greater than",
"Name": "upper critical",
"Severity": 1,
"Value": 85
}
]
}

配置含义如下:

字段含义
Direction 阈值触发方向
Name 阈值名称
Severity 告警级别
Value 阈值数值

当温度超过 70℃ 时,可以产生 Warning 告警;超过 85℃ 时,可以产生 Critical 告警。

阈值配置最终会映射到 D-Bus 接口,例如:

xyz.openbmc_project.Sensor.Threshold.Warning
xyz.openbmc_project.Sensor.Threshold.Critical

上层服务可以根据这些接口判断设备是否处于告警状态。


8. entity-manager 与 dbus-sensors 的关系

两者职责不同。

组件主要职责
entity-manager 描述硬件、匹配硬件、发布配置
dbus-sensors 读取数据、创建 Sensor 对象、更新数值
bmcweb 将 D-Bus 数据转换为 Redfish
phosphor-pid-control 根据传感器数据执行风扇控制
IPMI 服务 将传感器映射为 IPMI Sensor

数据流可以表示为:

JSON 配置
↓
entity-manager
↓
D-Bus Entity / Configuration 对象
↓
dbus-sensors 读取配置
↓
访问 hwmon、I2C、PMBus 等接口
↓
创建 Sensor.Value 对象
↓
bmcweb、IPMI、风扇控制读取

因此,entity-manager 本身通常不会直接执行以下操作:

  • 周期性读取 temp1_input
  • 读取风扇转速
  • 计算 PID 控制输出
  • 提供 Redfish HTTP 接口
  • 生成完整的 Web 页面

这些工作由其他服务完成。


9. entity-manager 与 D-Bus

entity-manager 启动后,会在 D-Bus 上提供设备模型。

在 D-Bus 中,设备配置对象通常位于类似路径:

/xyz/openbmc_project/inventory/system/board/Main_Board

或者:

/xyz/openbmc_project/configurations/Main_Board

具体路径取决于 OpenBMC 版本和平台实现。

可以通过以下命令查看 entity-manager 服务:

busctl list | grep -i entity

查看 D-Bus 对象树:

busctl tree xyz.openbmc_project.EntityManager

其他服务通常通过 ObjectMapper 查询对象,而不是直接假设某个固定服务名:

ObjectMapper
↓
根据对象路径查询提供者
↓
获得服务名称和接口列表

这种机制让上层服务不需要硬编码底层服务名称,提高了平台适配能力。


10. 设备关联关系

设备建模不仅要描述设备本身,还需要建立设备之间的关系。

例如:

温度传感器 → CPU0
风扇 → 风扇区域
电源传感器 → PSU0
主板 → Chassis

OpenBMC 通过 Association 接口表示这些关系。

示意结构如下:

/xyz/openbmc_project/sensors/temperature/CPU0_Temp
│
└── related_to
│
▼
/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu0

关联关系会影响:

  • Redfish 资源组织
  • 传感器在 WebUI 中的归属
  • 日志中故障设备的定位
  • 风扇区域和温度传感器的绑定
  • 电源模块状态展示

如果传感器数值能够正常读取,但 Redfish 中没有出现在预期的设备下,通常与设备关联关系有关。


11. 从 Entity 到 Redfish

用户访问 Redfish 接口时,bmcweb 不会直接读取 entity-manager 的 JSON 文件,而是通过 D-Bus 查询已经创建的对象。

完整流程如下:

entity-manager JSON
↓
创建 Entity 配置对象
↓
dbus-sensors 创建 Sensor 对象
↓
ObjectMapper 提供对象查询
↓
bmcweb 查询 Sensor.Value
↓
转换为 Redfish 属性

例如:

D-Bus:
/xyz/openbmc_project/sensors/temperature/CPU0_Temp
Value = 52.0
Unit = xyz.openbmc_project.Sensor.Value.Unit.DegreesC

Redfish:
Reading = 52.0
ReadingUnits = "Cel"

因此,Redfish 数据的来源通常可以追溯到 D-Bus Sensor 对象,而 D-Bus Sensor 对象又可以追溯到 entity-manager 的硬件建模配置。


12. 配置文件与 Yocto 集成

平台配置通常位于对应的 OpenBMC layer 中,例如:

meta-xxx/recipes-phosphor/configuration/
meta-xxx/recipes-phosphor/entity-manager/

配置文件需要通过 BitBake 配方安装到目标镜像中。

一个简化的配方片段如下:

SRC_URI += "file://config.json"

do_install:append() {
install -d ${D}${datadir}/entity-manager/configurations
install -m 0644 ${WORKDIR}/config.json \\
${D}${datadir}/entity-manager/configurations/
}

实际路径会根据 OpenBMC 分支和配方实现有所不同。

除了 JSON 文件,还需要确认:

  • entity-manager 已加入镜像
  • 对应的 dbus-sensors 服务已加入镜像
  • 相关 Linux 内核驱动已启用
  • 设备树包含硬件节点
  • systemd 服务能够在启动时运行
  • 配置文件没有被其他 layer 覆盖

13. entity-manager 的设计特点

13.1 配置与代码分离

硬件差异主要通过配置文件表达,减少了平台定制时的代码修改。

13.2 支持多平台复用

同一套传感器服务可以处理多个平台,只需要提供不同的硬件配置。

13.3 便于动态建模

硬件是否存在由运行时探测结果决定,适合电源模块、风扇和扩展设备等场景。

13.4 依赖统一 D-Bus 接口

底层硬件类型不同,但上层可以通过统一的 D-Bus Sensor 接口访问。

13.5 适合复杂硬件关系

通过 Entity、Exposes 和 Association,可以表达主板、CPU、电源、风扇和传感器之间的层次关系。


14. 添加一个传感器的整体流程

以新增一个 I2C 温度传感器为例,整体过程如下:

1. 确认硬件连接
↓
2. 添加设备树节点
↓
3. 启用 Linux 内核驱动
↓
4. 确认 hwmon 节点生成
↓
5. 编写 entity-manager JSON
↓
6. 配置传感器名称和阈值
↓
7. 配置 Entity 与 Inventory 关系
↓
8. 启用对应 dbus-sensors 服务
↓
9. 创建 D-Bus Sensor 对象
↓
10. 由 bmcweb 和其他服务使用

这一流程体现了 OpenBMC 的分层设计:

内核负责访问硬件
entity-manager 负责描述硬件
dbus-sensors 负责发布数据
上层服务负责使用数据


15. 总结

entity-manager 是 OpenBMC 设备建模体系中的核心组件之一。它不直接替代 Linux 驱动,也不负责提供 Web 接口,而是通过 JSON 配置文件把平台硬件描述为统一的运行时对象。

其核心结构可以概括为:

Entity
├── Name
├── Type
├── Probe
└── Exposes
├── Sensor
├── Threshold
├── Bus
├── Address
└── Association

在完整的 OpenBMC 架构中:

  • Linux 内核负责提供底层硬件访问能力。
  • entity-manager 负责识别和描述平台设备。
  • dbus-sensors 负责读取数据并创建标准 Sensor 对象。
  • D-Bus 负责在各组件之间传递设备信息。
  • bmcweb、IPMI、风扇控制和日志服务负责使用这些数据。

掌握 entity-manager 的配置结构和运行机制,是理解 OpenBMC 传感器、风扇、电源和 Redfish 设备管理的基础。

赞(0)
未经允许不得转载:171主机测评 » OpenBMC:entity-manager 设备建模机制
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址