当前位置: 首页 > news >正文

保姆级教程:手把手教你用entity-manager和dbus-sensors配置OpenBMC温度传感器

OpenBMC温度传感器配置实战:从设备树到DBus接口全解析

当你第一次拿到一块服务器主板,面对密密麻麻的I2C设备和传感器芯片时,如何让OpenBMC正确识别并监控这些硬件?本文将带你深入OpenBMC传感器配置的核心流程,通过一个完整的TMP75温度传感器案例,掌握从硬件识别到数据可视化的全链路配置技巧。

1. 环境准备与硬件识别

在开始配置前,我们需要确认几个关键信息:传感器芯片的I2C总线编号、设备地址以及对应的内核驱动状态。以常见的TMP75温度传感器为例,假设它连接在I2C-3总线,地址为0x4d。

首先通过i2cdetect工具扫描总线:

i2cdetect -y 3

预期输出应显示0x4d位置有设备响应:

0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- UU -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- UU -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

提示:如果设备未显示,请检查硬件连接和电源状态。部分传感器需要特定条件才会响应I2C探测。

确认驱动加载情况:

ls /sys/class/hwmon/

查找包含"tmp75"字样的hwmon目录,记录其编号(如hwmon2)。进入该目录查看温度读数:

cat /sys/class/hwmon/hwmon2/temp1_input

正常应返回以毫度为单位的温度值(如25000表示25°C)。

2. 编写entity-manager配置文件

创建JSON配置文件/usr/share/entity-manager/configurations/tmp75.json,以下是一个完整示例:

{ "Exposes": [ { "Address": "0x4d", "Bus": "3", "Name": "CPU_Temp", "PollInterval": 5000, "Thresholds": [ { "Direction": "greater than", "Name": "upper_critical", "Value": 85 }, { "Direction": "greater than", "Name": "upper_warning", "Value": 70 } ], "Type": "Temp" } ], "Name": "tmp75_sensor", "Probe": "xyz.openbmc_project.FruDevice({'BOARD_PRODUCT_NAME': '.*'})", "Type": "Temp" }

关键参数说明:

  • Bus/I2C地址:必须与硬件实际连接一致
  • PollInterval:采样间隔(毫秒),太短会增加系统负载
  • Thresholds:设置告警阈值,触发BMC事件日志
  • Probe条件:匹配FRU信息,确保只在特定主板上启用

注意:JSON文件必须符合严格语法规范,建议使用jq工具验证:

jq empty tmp75.json || echo "Invalid JSON"

3. 打包部署配置文件

在Yocto构建系统中,需要通过bbappend文件将配置文件打包进镜像。创建meta-custom/recipes-phosphor/configuration/entity-manager_%.bbappend

FILESEXTRAPATHS:prepend := "${THISDIR}/files:" SRC_URI += " \ file://tmp75.json \ " do_install:append() { install -d ${D}${config_dir} install -m 0644 ${WORKDIR}/tmp75.json ${D}${config_dir}/ }

配置完成后重新构建并刷写镜像:

bitbake obmc-phosphor-image

4. 验证与调试

系统启动后,按顺序检查各环节:

1. 确认entity-manager加载配置

journalctl -u entity-manager -f

正常应看到类似日志:

Matched probe for tmp75_sensor Creating interface xyz.openbmc_project.Sensor.Value

2. 检查DBus接口生成

busctl tree xyz.openbmc_project.EntityManager

应能看到包含/xyz/openbmc_project/sensors/temperature/CPU_Temp的路径。

3. 验证传感器读数

dbus-send --system --print-reply \ --dest=xyz.openbmc_project.Sensor \ /xyz/openbmc_project/sensors/temperature/CPU_Temp \ org.freedesktop.DBus.Properties.Get \ string:xyz.openbmc_project.Sensor.Value string:Value

返回应包含当前温度值(如variant double 42.5)。

常见问题排查表:

现象可能原因解决方案
DBus接口未生成Probe条件不匹配检查FRU信息或放宽匹配条件
读数显示NaNhwmon路径不匹配确认Bus/Address与sysfs一致
阈值告警不触发单位不一致确保配置使用摄氏度,hwmon输出为毫度

5. 高级配置技巧

多传感器批量配置:当主板有多个相同型号传感器时,可以使用模板化配置:

{ "Templates": [ { "Name": "TMP75_Template", "Exposes": [ { "Type": "Temp", "PollInterval": 5000, "Thresholds": [ { "Direction": "greater than", "Name": "upper_critical", "Value": 85 } ] } ] } ], "Configurations": [ { "Name": "CPU_Temp", "Address": "0x4d", "Bus": "3", "Probe": "...", "Apply": "TMP75_Template" }, { "Name": "DIMM_Temp", "Address": "0x4e", "Bus": "3", "Probe": "...", "Apply": "TMP75_Template" } ] }

动态阈值调整:通过DBus接口实时修改阈值:

dbus-send --system --print-reply \ --dest=xyz.openbmc_project.Sensor \ /xyz/openbmc_project/sensors/temperature/CPU_Temp \ org.freedesktop.DBus.Properties.Set \ string:xyz.openbmc_project.Sensor.Threshold.Critical string:WarningHigh \ variant:double:75.0

性能优化建议

  • 对非关键传感器适当延长PollInterval
  • 相关传感器分组到同一JSON文件减少IO开销
  • 使用EntityManager的缓存机制减少DBus流量

在实际项目中,我曾遇到过一个隐蔽问题:当传感器位于I2C多路复用器后面时,需要额外配置Probe条件确保多路器已初始化。这类硬件依赖问题往往需要结合具体板卡设计进行分析。

http://www.jsqmd.com/news/612712/

相关文章:

  • 同一个需求,我先出技术方案,再让AI出方案——差距让我沉默了偬
  • 2026.4.9 - 呓语
  • react-native-fetch-blob高级功能指南:多部分上传与进度监控
  • TMSpeech:你的Windows本地实时语音转文字神器,CPU占用不到5%!
  • 编写程序实现智能工地粉尘检测,超标提示“开启喷淋降尘”。
  • Navicat 驾驭 SQL Server:从连接配置到高效运维实战
  • FanControl终极配置指南:5步打造完美Windows风扇控制系统
  • JitPack.io故障排除大全:从构建失败到依赖冲突的完美解决方案
  • 如何自定义TALL预设:扩展你的Laravel前端能力
  • RDK X5上跑出276fps!手把手教你用Cython封装海康工业相机SDK到Python
  • Z-Image-Turbo镜像实战指南:Xinference多模型管理+Gradio多Tab界面配置
  • .NET 诊断技巧 | 日志框架原理、手写日志框架学习赶
  • rag文本切块chunk
  • 基于STC89C52单片机的智能车控制系统设计
  • AI开发-python-langchain框架(--自定义Tool )夹
  • Nature | 珊瑚微生物组:未知基因组与生物合成多样性的宝库
  • 终极指南:如何快速掌握 Tooltipster 提示框插件的完整教程
  • 数据库结构文档化解决方案:多格式导出与可视化预览
  • YOLO 系列:手把手教你用 YOLOv8 训练无人机视角小目标检测数据集
  • BilibiliDown终极指南:3分钟掌握B站视频音频批量下载
  • Alibaba DASD-4B Thinking 对话工具 ComfyUI 工作流概念解析与自定义节点设计思路
  • 联想拯救者工具箱:释放游戏本性能的终极免费解决方案
  • Face3D.ai Pro效果实测:不同肤色人种在UV纹理色彩保真度上的表现对比
  • 【2025】嵌入式软考中级部分试题
  • zq—算法基础:时空复杂度()孔
  • 设计数据转换全攻略:从JSON结构化到工作流优化的实践指南
  • 【Java 25虚拟线程实战白皮书】:20年架构师亲测的高并发吞吐提升47%关键路径与避坑指南
  • RuView:利用WiFi信号进行非接触式人体姿态估计
  • foss_photo_libraries移动端功能详解:从自动上传到多平台支持的终极指南
  • DeepSeek-OCR-2效果惊艳:精准识别段落、标题、表格,完美还原排版