account组件本地IT失败

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

account组件本地IT失败问题分析与解决方案

问题描述

在进行代码上库时,account组件的本地集成测试(IT)失败,主要报错信息如下:

  1. 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
    
  2. AccountService接口调用失败

    service not exists, path:/bmc/kepler/AccountService/Accounts/2, interface:bmc.kepler.AccountService.ManagerAccount
    
  3. 测试进程崩溃

    Command [...] died with <Signals.SIGSEGV: 11>
    
  4. 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 激活配置)。
  • 服务注册失败或未正确打包进镜像。

:white_check_mark: 知识图谱佐证:多个服务如 bmc.kepler.accountbmc.kepler.licenseCertificate 都因缺少 .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 测试用例中使用了错误的对象路径或接口名。

:white_check_mark: 知识图谱佐证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 地址可能不匹配或已失效。

:warning: 注意:这不是因为用错了 conan remote,而是远程包的源码未同步或已被清除。


4. 测试进程崩溃(SIGSEGV)

日志中出现:

died with <Signals.SIGSEGV: 11>

这是典型的 段错误(Segmentation Fault),意味着测试程序访问了非法内存地址。可能原因有:

  • account_IT 进程在调用空指针或已释放资源(如 D-Bus 连接未建立却强行调用)。
  • test_account.lua 中的代码未正确处理 D-Bus 服务不存在的异常情况。
  • 前序错误(如 trust 服务缺失)导致后续依赖组件状态异常,最终引发崩溃。

解决方案

:white_check_mark: 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 是否也缺少此类软链接。


:white_check_mark: 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

:white_check_mark: 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 不匹配问题。


:white_check_mark: 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 异常捕获,增强测试容错能力

参考资料

相关链接:

  1. ACCOUNT组件执行集成测试报错
  2. ssh能登录但是web登录不上
  3. 开发板启动过程中在内核解压后无法继续运行
  4. devmon服务没有加载
  5. account | 文档中心 | openUBMC