问题描述
同样都是获取PCIe设备pid/vid信息,在network_adapter组件中的请求失败了,但是进入系统后在终端模式下运行busctl命令确是能成功拿到信息的
终端模式下:
环境信息
-
软件版本:[OpenUBMC2509]
-
硬件配置:[Hi1711 + KP920]
期望结果
network_adapter组件中能正常获取PCIe设备信息
这种现象该如何去进一步调试呀
同样都是获取PCIe设备pid/vid信息,在network_adapter组件中的请求失败了,但是进入系统后在终端模式下运行busctl命令确是能成功拿到信息的
终端模式下:
软件版本:[OpenUBMC2509]
硬件配置:[Hi1711 + KP920]
network_adapter组件中能正常获取PCIe设备信息
这种现象该如何去进一步调试呀
答案内容由AI生成,仅供参考:
network_adapter组件获取 PCIe VID/DID 失败,但在终端busctl成功,极可能是因权限、调用上下文、参数编码错误或服务依赖时机导致,而非功能缺失。
busctl 手动命令逐项比对。busctl --user call bmc.kepler.network_adapter /bmc/kepler/network_adapter/MicroComponent bmc.kepler.MicroComponent.Debug SetDlogLevel a{ss}sy 0 debug 2
network_adapter 启动晚于 pmu.service。busctl 测试是否可访问。network_adapter组件中IPMI命令执行失败问题分析与调试建议根据您提供的现象描述和日志信息,network_adapter 组件在尝试通过 PMU 接口获取 PCIe 设备 VID/DID 信息时失败,但在系统终端使用 busctl 命令却能成功获取。这表明底层功能是可用的,问题出在 组件调用路径、权限、参数构建或环境上下文差异 上。
以下是对该问题的系统性分析和进一步调试建议。
| 项目 | 现象 |
|---|---|
| 失败场景 | network_adapter 组件内部调用 get_info_from_pmu 获取 PCIe 设备 PID/VID 失败 |
| 成功场景 | 在终端执行 busctl 直接调用 GetPciE VidDid 成功返回数据 |
| 错误日志 | get_info_from_pmu call failed with error: /openbmc...(路径错误或权限拒绝) |
| 目标设备 | PCIe BDF: 2:0:0(Bus=2, Device=0, Function=0) |
| 系统平台 | OpenUBMC2509 + Hi1711 + KP920 平台 |
结合知识库和日志内容,可能导致此行为差异的原因如下:
network_adapter 以特定用户身份运行(通常是受限服务账户),而终端 busctl 以 root 或具有更高权限的用户执行。bmc.kepler.Systems.Pmu.GetPciE 可能对调用者有 访问控制策略,限制非授权组件调用。
证据支持:
您的日志显示:ERROR: get_info_from_pmu call failed with error: /openbmc...路径式错误提示常出现在 D-Bus 路径未正确注册、权限不足或服务未响应时。
is_local=true 对应 cpu_id=0x40 是否正确?)y 是 byte,q 是 uint16)
证据支持:
日志中关键调试信息:[PMU_DEBUG] PCI address encoding: addr[1]=0x00, addr[2]=0x00, addr[3]=0x20, addr[4]=0x00 [PMU_DEBUG] Read length field: 3 (actual bytes to read: 4)表明正在手动构建一个地址结构,若编码格式与
GetPciE所需不符,将导致失败。
network_adapter 启动时机早于 PMU 完全初始化完成,导致首次调用失败。
证据支持:
busctl call成功能说明后续 PMU 服务可用,但组件启动阶段可能过早调用。
network_adapter 很可能是通过中间层封装函数(如 get_info_from_pmu)调用 PMU 接口,可能存在中间逻辑错误。busctl 是直接对 D-Bus 接口发起调用,绕过了封装逻辑。
证据支持:
知识库中描述IPMI Request是标准协议调用方式,不同的调用链可能导致行为不同。
在终端运行以下命令检查 PMU 接口是否可访问:
# 查看服务接口是否存在
busctl --user introspect bmc.kepler.compute /bmc/kepler<Systems/1/Pmu
# 检查权限和方法定义
busctl --user call bmc.kepler.compute /bmc/kepler<Systems/1/Pmu org.freedesktop.DBus.Introspectable Introspect
确认输出中包含:
Method GetPciE VidDid ...
Method GetPciE SubVidDid ...
尝试在 network_adapter 运行用户环境下执行相同的 busctl 命令:
# 假设组件以 `_network` 或 `openbmc` 用户运行
sudo -u openbmc busctl --user call bmc.kepler.compute /bmc/kepler<Systems/1/Pmu bmc.kepler.Systems.Pmu GetPciE VidDid a{ss}byyyyy 0 1 true 0 2 0 0
若失败 → 权限不足或用户会话总线未启动
查看 PMU 相关组件日志,确认是否收到调用请求:
journalctl -u pmu.service --no-pager | tail -50
# 或
tail -f /var/log/app.log | grep -i pmu
重点关注是否有:
分析 card_update_identifier.lua 和 init.lua 中参数传递流程:
-- 你代码中
local pcie_info = {
is_local = true,
cpu_id = 0,
bus_num = 0x02,
device_num = 0x00,
func_num = 0x00
}
确保最终传给 GetPciE 的参数顺序与 busctl 一致:
a{ss}byyyyy 0 1 true 0 2 0 0
其中各字段应为:
| 参数 | 类型 | 值 | 说明 |
|---|---|---|---|
| a{ss} | dict | 0 | 可选参数(通常为空) |
| b | bool | 1 (true) | is_local |
| y | byte | 0 | CPU ID (low byte?) |
| y | byte | 2 | Bus Number |
| y | byte | 0 | Device Number |
| y | byte | 0 | Function Number |
注意:某些实现要求 cpu_id 使用完整8位编码(如 0x40 表示 CPU0 local),请核实文档。
增强 get_info_from_pmu 调用部分的错误捕获:
local result, err = pmu_obj:GetPciE("VidDid", options)
if not result then
print("[ERROR] D-Bus call failed: ", err) -- 捕获具体错误信息
else
print("[SUCCESS] ", result)
end
这有助于判断错误类型是:
PermissionDeniedNoSuchMethodTimeoutInvalidArgs检查 network_adapter.service 是否声明了对 pmu.service 的依赖关系:
[Unit]
Description=Network Adapter Service
After=pmu.service ; 确保 PMU 已启动
Wants=pmu.service
[Service]
User=openbmc
ExecStart=...
否则需加入重试机制,避免早期调用失败。
| 知识点 | 来源说明 |
|---|---|
PMU 负责提供 PCIe 设备四元组信息(VID, DID, SVID, SSID) |
KG 实体 PMU |
BMC 需向 PMU 查询 PCIe 元数据使用 BDF 作为标识符 |
KG 关系 (BMC, PMU) |
IPMI 请求可触发 PMU PCI Info Request |
KG 实体 PMU PCI Info Request |
network_adapter 模块用于管理网卡信息,包括 BDF、MAC、速率等 |
搜索结果 #4 network_adapter 功能简介 |
组件间通过 D-Bus 调用其他服务(如 busctl call) |
搜索结果 #2 Lua 开发框架 |
network_adapter组件获取 PCIe VID/DID 失败,但在终端busctl成功,极可能是因权限、调用上下文、参数编码错误或服务依赖时机导致,而非功能缺失。
busctl 手动命令逐项比对。busctl --user call bmc.kepler.network_adapter /bmc/kepler/network_adapter/MicroComponent bmc.kepler.MicroComponent.Debug SetDlogLevel a{ss}sy 0 debug 2
network_adapter 启动晚于 pmu.service。busctl 测试是否可访问。如仍无法解决,建议提交详细日志和组件版本信息至社区 issue 跟踪:
参考链接:AtomGit | GitCode - 全球开发者的开源社区,开源代码托管平台 (类似问题跟踪)
如有更多日志或代码片段,可继续提供以便深入分析。
这个函数里面加打印,imu_cmd.get_info_from_pmu