答案内容由AI生成,仅供参考:
account组件本地IT失败问题分析与解决方案
问题描述
在进行代码上库时,account组件的本地集成测试(IT)失败,主要报错信息如下:
-
D-Bus服务未找到错误:
Set app [trust] log level [info] failed, error: org.freedesktop.DBus.Error.ServiceUnknown: The name bmc.kepler.trust was not provided by any .service files -
AccountService接口调用失败:
service not exists, path:/bmc/kepler/AccountService/Accounts/2, interface:bmc.kepler.AccountService.ManagerAccount -
测试进程崩溃:
Command [...] died with <Signals.SIGSEGV: 11> -
Conan依赖包源码缺失:
ERROR: The 'openldap/2.6.10+openubmc_02@openubmc/stable' package has 'exports_sources' but sources not found in local cache.
根本原因分析
1. D-Bus服务 bmc.kepler.trust 不存在
根据错误日志:
Set app [trust] log level [info] failed, error: org.freedesktop.DBus.Error.ServiceUnknown: The name bmc.kepler.trust was not provided by any .service files
这表明系统尝试通过 D-Bus 设置 trust 组件的日志级别时,未能找到名为 bmc.kepler.trust 的服务。该问题是典型的 D-Bus ServiceUnknown 错误,说明以下之一发生:
bmc.kepler.trust服务未启动。- 系统中缺少对应的
.service文件(即 systemd 单元文件或 D-Bus 激活配置)。 - 服务注册失败或未正确打包进镜像。
知识图谱佐证:多个服务如
bmc.kepler.account、bmc.kepler.license和Certificate都因缺少.service文件导致启动失败,属于同类问题。
2. AccountService D-Bus 接口路径不可用
关键报错:
service not exists, path:/bmc/kepler/AccountService/Accounts/2, interface:bmc.kepler.AccountService.ManagerAccount
这表示 test_account.lua 在尝试访问 /bmc/kepler/AccountService/Accounts/2 路径上的 ManagerAccount 接口时失败。可能原因包括:
bmc.kepler.AccountService服务未正常注册或加载。- AccountService Manager 接口未正确暴露在 D-Bus 上。
account组件未完成初始化即被调用。- IT 测试用例中使用了错误的对象路径或接口名。
知识图谱佐证:
bmc.kepler.AccountService.ManagerAccounts类正是用于管理账户创建和检索的 D-Bus 接口,应确保其已成功注册。
3. Conan 包依赖问题 —— 缺少源码缓存
错误提示:
ERROR: The 'openldap/2.6.10+openubmc_02@openubmc/stable' package has 'exports_sources' but sources not found in local cache.
此问题说明:
- 当前使用的 Conan 包是在“源码构建”模式下创建的(即带有
exports_sources)。 - 本地 Conan 缓存中没有该包的源码部分(可能因缓存清理、网络问题或远程仓库不可达导致)。
- 您使用的 remote 地址可能不匹配或已失效。
注意:这不是因为用错了
conan remote,而是远程包的源码未同步或已被清除。
4. 测试进程崩溃(SIGSEGV)
日志中出现:
died with <Signals.SIGSEGV: 11>
这是典型的 段错误(Segmentation Fault),意味着测试程序访问了非法内存地址。可能原因有:
account_IT进程在调用空指针或已释放资源(如 D-Bus 连接未建立却强行调用)。test_account.lua中的代码未正确处理 D-Bus 服务不存在的异常情况。- 前序错误(如 trust 服务缺失)导致后续依赖组件状态异常,最终引发崩溃。
解决方案
1. 检查并修复 bmc.kepler.trust 服务缺失问题
方法一:确认 trust 组件是否已构建并部署
# 检查是否存在 trust 组件包
conan search "trust*" -r=openubmc_dev
# 或查看构建产物中是否有 trust 的 .service 文件
find <build_root> -name "*.service" | grep -i trust
方法二:检查服务是否在目标系统中注册
进入运行环境后执行:
# 查看 D-Bus 上已注册的服务
busctl --user list | grep bmc.kepler.trust
# 检查 systemd 是否加载了 trust 服务单元
ls /etc/systemd/system/multi-user.target.wants/ | grep trust
systemctl status bmc.kepler.trust # 查看服务状态
方法三:手动添加软链接(参考 devmon 修复方式)
类似 devmon 服务加载失败问题 的修复方案:
# 正确做法:创建软链接指向实际 service 文件
ln -s /etc/systemd/system/devmon.service \
/etc/systemd/system/multi-user.target.wants/devmon.service
请确认 trust.service 是否也缺少此类软链接。
2. 排查 AccountService 接口无法访问问题
检查 AccountService 是否启动成功
# 检查 D-Bus 是否注册了 AccountService
busctl --user tree bmc.kepler.AccountService
# 查看 account 服务日志
journalctl -u account | grep -i error
验证 D-Bus 路径和接口正确性
# 列出 AccountService 下所有对象路径
busctl --user introspect bmc.kepler.AccountService
# 示例输出应包含:
# /bmc/kepler/AccountService/Accounts/2
# bmc.kepler.AccountService.ManagerAccount
若无输出,则说明服务未成功注册。
检查 account 组件启动日志
# 查看 framework.log 中 account 启动记录
grep -A5 -B5 "bmc.kepler.account" /var/log/framework.log
预期输出应包含:
monitor component account added, service: bmc.kepler.account
3. 解决 Conan 依赖源码缺失问题
清理并重新获取依赖
# 清理 conan 缓存(根据是否为 conan v2)
rm -rf ~/.conan2/p/* # 对于 Conan 2.x
# 或 rm -rf ~/.conan/data/* (Conan 1.x)
# 重新检测 profile
conan profile detect --force
# 添加正确的远程仓库(注意拼写 openubmc)
conan remote add openubmc_dev https://conan.openubmc.cn/conan_1/ --insecure --force
# 登录(如需)
conan remote login openubmc_dev -p <your_token>
下载预编译包而非触发源码构建
# 尝试手动下载 openldap 包(避免源码构建)
conan download openldap/2.6.10+openubmc_02@openubmc/stable -r openubmc_dev
更改构建命令以禁用源码构建
# 使用 -o */*:test=False 或指定 --build=missing 而非 --build=account/*
bingo build --it -o "*/*:test=True" --build=missing
建议升级至
bingo test -jit(JIT 模式),避免本地 SDK 不匹配问题。
4. 防止 SIGSEGV 崩溃 —— 增加异常处理
修改 test_account.lua,在调用 D-Bus 前增加健壮性检查:
local ok, res = pcall(function()
-- 原始调用前先检测服务是否存在
if not bus.service_exists("bmc.kepler.AccountService") then
print("ERROR: AccountService not available on D-Bus")
return false
end
-- 安全调用接口
bus.call(...)
end)
if not ok then
log.error("Test failed with error: " .. tostring(res))
-- 清理资源,防止后续崩溃
cleanup_test_data()
end
复现建议(本地调试)
步骤 1:准备干净环境
# 清除旧缓存
rm -rf ~/.conan2/p/*
rm -rf <workspace>/temp
# 重新拉取 manifest 并初始化
git pull origin main
python3 init.py xxx
步骤 2:使用正确远程并恢复依赖
conan profile detect --force
conan remote add openubmc_dev https://conan.openubmc.cn/conan_1/ --insecure --force
conan install "bingo_cases/[>=1.0.0]@openubmc/stable" --deployer-folder=./deploy
步骤 3:构建并运行 IT 测试
# 推荐使用 JIT 模式绕过部分依赖问题
bingo test -jit --it -m account
参考文档:Qemu相关FAQ
总结
| 问题 | 原因 | 解决方案 |
|---|---|---|
bmc.kepler.trust 服务不存在 |
缺少 .service 文件或未注册 |
检查服务文件、添加软链接、确认打包完整性 |
AccountService 接口调用失败 |
D-Bus 服务未启动或路径错误 | 使用 busctl 验证服务存在性,检查日志 |
Conan 报 exports_sources 找不到 |
本地无源码缓存 | 清理缓存,重新下载预编译包,避免源码构建 |
| 测试崩溃(SIGSEGV) | 未处理服务不存在异常 | 添加 pcall 异常捕获,增强测试容错能力 |
参考资料
相关链接: