devmon组件加载异常

答案内容由AI生成,仅供参考:

解决方案

:white_check_mark: 方法一:检查并创建 systemd 服务软链接(推荐)

参考 OpenUBMC 社区已有案例 #3321 的解决方案:

“直接拉取同步 PR_235 分支即可自动加载,帖子中操作失败是因为 /root/workspace/manifest/build/product/BMC/openUBMC/rootfs/etc/systemd/system/multi-user.target.wants/ 下直接新建 devmon.service,但实际这里新增的应该是 /root/workspace/manifest/build/product/BMC/openUBMC/rootfs/etc/systemd/system/devmon.service软链接。”

操作步骤如下:

# 1. 确认 devmon.service 是否存在
ls /etc/systemd/system/devmon.service

# 2. 若不存在,请确认源文件是否存在(通常由 Conan 或构建流程生成)
find /opt -name "devmon.service" 2>/dev/null
# 示例路径可能为:/opt/bmc/devmon/devmon.service

# 3. 如果找到源文件,则创建软链接到 multi-user.target.wants
sudo ln -s /opt/bmc/devmon/devmon.service /etc/systemd/system/multi-user.target.wants/devmon.service

# 4. 重新加载 systemd 配置并尝试启动服务
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl start devmon.service

# 5. 检查服务状态
systemctl status devmon.service

:warning: 注意:路径可能因构建方式不同而异,请结合 openUBMC 构建输出确定准确路径。


:white_check_mark: 方法二:验证是否已将 devmon 添加到 manifest 构建配置

确保 devmon 已正确集成到产品构建系统中。检查以下文件:

  1. manifest/build/subsys/rc/hardware.yml 或其他 yml 文件

    - conan: "devmon/1.2.23@openUBMC.release/stable"
    
  2. manifest/build/product/BMC/openUBMC/manifest.yml

    dependencies:
      - devmon/1.2.23@openUBMC.release/stable
    

若未添加,请补充后使用 bingo build 重新构建固件。


:white_check_mark: 方法三:确认 devmon 服务是否被 Conan 包管理器正确安装

运行以下命令检查 devmon 是否被 Conan 正常部署:

# 查询 Conan 是否安装了 devmon 包
conan list "devmon*" -r=openubmc_dev

# 查看安装路径
conan info devmon/1.2.23@openUBMC.release/stable --paths

确保相关二进制文件和服务描述文件已部署到目标路径。

点击此处查看详细分析解答

devmon 组件加载异常问题分析与解决方案

问题概述

devmon 组件在系统启动过程中未能正常加载,导致多个系统组件(如 chassisfirmware_mgmtpower_mgmt 等)无法获取其提供的设备监控服务。核心错误日志为:

fetch devmon objects failed, err=org.freedesktop.DBus.Error.ServiceUnknown: The name bmc.kepler.devmon was not provided by any .service files

该错误表明 D-Bus 系统无法找到 bmc.kepler.devmon 服务的 .service 配置文件,因此无法启动该服务。


根本原因分析

根据上下文信息和类似问题的社区讨论,devmon 组件未能加载的根本原因是其对应的 systemd 服务文件未被正确部署或注册。

具体表现为:

  • 虽然已通过 Git 克隆获取了 devmon 源码(git@gitcode.com:openUBMC/devmon.git),但缺少将其作为系统服务安装的步骤。
  • 系统依赖 .service 文件来声明如何启动 D-Bus 服务。若该文件缺失或未软链接至 systemd 加载目录,则即使程序存在也无法自动启动。
  • 从日志可以看出,多个核心模块(如 chassis、bios、thermal_mgmt 等)都在尝试从 devmon 获取设备信息,说明 devmon 是南向设备管理的关键组件。

解决方案

:white_check_mark: 方法一:检查并创建 systemd 服务软链接(推荐)

参考 OpenUBMC 社区已有案例 #3321 的解决方案:

“直接拉取同步 PR_235 分支即可自动加载,帖子中操作失败是因为 /root/workspace/manifest/build/product/BMC/openUBMC/rootfs/etc/systemd/system/multi-user.target.wants/ 下直接新建 devmon.service,但实际这里新增的应该是 /root/workspace/manifest/build/product/BMC/openUBMC/rootfs/etc/systemd/system/devmon.service软链接。”

操作步骤如下:

# 1. 确认 devmon.service 是否存在
ls /etc/systemd/system/devmon.service

# 2. 若不存在,请确认源文件是否存在(通常由 Conan 或构建流程生成)
find /opt -name "devmon.service" 2>/dev/null
# 示例路径可能为:/opt/bmc/devmon/devmon.service

# 3. 如果找到源文件,则创建软链接到 multi-user.target.wants
sudo ln -s /opt/bmc/devmon/devmon.service /etc/systemd/system/multi-user.target.wants/devmon.service

# 4. 重新加载 systemd 配置并尝试启动服务
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl start devmon.service

# 5. 检查服务状态
systemctl status devmon.service

:warning: 注意:路径可能因构建方式不同而异,请结合 openUBMC 构建输出确定准确路径。


:white_check_mark: 方法二:验证是否已将 devmon 添加到 manifest 构建配置

确保 devmon 已正确集成到产品构建系统中。检查以下文件:

  1. manifest/build/subsys/rc/hardware.yml 或其他 yml 文件

    - conan: "devmon/1.2.23@openUBMC.release/stable"
    
  2. manifest/build/product/BMC/openUBMC/manifest.yml

    dependencies:
      - devmon/1.2.23@openUBMC.release/stable
    

若未添加,请补充后使用 bingo build 重新构建固件。


:white_check_mark: 方法三:确认 devmon 服务是否被 Conan 包管理器正确安装

运行以下命令检查 devmon 是否被 Conan 正常部署:

# 查询 Conan 是否安装了 devmon 包
conan list "devmon*" -r=openubmc_dev

# 查看安装路径
conan info devmon/1.2.23@openUBMC.release/stable --paths

确保相关二进制文件和服务描述文件已部署到目标路径。


补充说明

:small_blue_diamond: devmon 组件的功能定位

根据搜索结果,devmon 是一个设备监控系统,主要功能包括:

  • 监控和管理各种硬件设备(如 PCIe 设备、扩展卡)
  • 提供 D-Bus 接口:bmc.dev.devmon
  • 支持设备重新发现(DiscoverDevices())和列表查询(GetDeviceList()
  • 作为 component_drivers 驱动框架的基础服务,加载 .so 驱动文件

:small_blue_diamond: 为什么这么多组件都依赖 devmon?

日志显示 chassispcie_devicegeneral_hardware 等数十个模块均试图从 devmon 获取对象,说明它是:

  • 设备拓扑发现的核心代理
  • D-Bus 资源协作机制的中枢
  • 南向设备驱动注册与加载的统一入口

验证是否修复成功

执行以下命令验证 devmon 是否正常运行:

# 查看 D-Bus 服务是否可见
busctl --user list | grep bmc.kepler.devmon

# 查看 devmon 资源树(如果有提供此接口)
busctl --user tree bmc.kepler.devmon

# 再次查看 app.log 是否仍有 ServiceUnknown 报错
grep "devmon" /var/log/app.log | grep "ServiceUnknown"

若不再出现 ServiceUnknown 错误,并且 systemctl status devmon.service 显示 active (running),则表示问题已解决。


参考资料