1711烧片后, 闭源product_mgmt模块资源树路径丢失

问题描述

烧片后或重启BMC后, 出现首页机框图不显示的问题;
定位过程如下:
1.怀疑web请求有问题;
异常 ‘https://70.183.12.117/UI/Static/theme/custom/bmcimg/product/null.png
正常 https://70.189.80.157/UI/Static/theme/custom/bmcimg/product/img_01.png

  1. 该请求来自/UI/Rest/Overview的返回, 发现为null;

  2. /UI/Rest/Overview来自资源树路径/bmc/kepler/Systems/1/Product;

  3. 环境/bmc/kepler/Systems/1/Product的资源树路径不见了
    异常如下图


    正常如下图

  4. 该资源树来自bmc.kepler.product_mgmt

  5. 日志查看发现闭源模块product_mgmt有db相关报错


    怀疑可能是烧片后没有持久化文件, 而模块没有正确处理导致初始化过程中断;
    以下是一键收集

dump_null_20260416-0750.tar.gz (1.5 MB)

环境信息

  • 软件版本:openUBMC 1230LTS sp1

重现步骤

  1. 烧片后有大概率出现
  2. 重启也有可能出现

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

1711烧片后闭源product_mgmt模块资源树路径丢失问题分析

问题现象

在1711烧片或重启BMC后,出现首页机框图不显示的问题。具体表现为:

  • Web请求路径异常:https://70.183.12.117/UI/Static/theme/custom/bmcimg/product/null.png
  • 正常应为:https://70.189.80.157/UI/Static/theme/custom/bmcimg/product/img_01.png
  • /UI/Rest/Overview接口返回的ProductImage字段为null
  • 资源树路径/bmc/kepler/Systems/1/Product丢失

问题定位过程

1. 资源树结构对比

异常环境资源树缺失情况:

/bmc/kepler/Systems/1/Product  // 该路径完全缺失

正常环境资源树结构:

└─/bmc/kepler/Systems
    └─/bmc/kepler/Systems/1
        ├─/bmc/kepler/Systems/1/Contact
        └─/bmc/kepler/Systems/1/Product  // 存在Product路径

该资源树由bmc.kepler.product_mgmt模块提供,其正常运行对产品信息显示至关重要。

2. 日志分析

app.log.1中发现大量与product_mgmt模块相关的错误日志:

1. 2026-04-16 07:07:33.153243 product_mgmt ERROR: persist_client_lib.lua(446): read by tables call failed, error: BMC.Error.Unknow: ... attempt to index local 'db' (a nil value)
2. 2026-04-16 07:11:45.731335 product_mgmt ERROR: service.lua(49): Get product obj failed!
3. 2026-04-16 07:11:45.732531 product_mgmt ERROR: app_preloader.lua(232): ...pcall failed(...mc/apps/product_mgmt/lualib/digital_warranty/service.lua:50: Get product obj failed)

关键错误信息显示:

  • 数据库访问失败(attempt to index local 'db' (a nil value)
  • 无法获取产品对象(Get product obj failed!
  • 连续多次pcall调用失败,表明初始化过程反复失败

3. 根本原因分析

根据知识图谱信息和日志分析,问题的根本原因如下:

数据库持久化机制失效
product_mgmt模块依赖于数据库持久化存储来管理产品信息。然而,在烧片或重启过程中,出现了以下问题:

  1. 持久化数据未正确创建
    烧片过程中,/data/persistence目录未能成功创建,导致数据库文件无法持久化存储。这与"复位持久化"机制有关:数据在BMC重启后可保留,但在BMC升级、AC掉电和Flash擦写时会丢失。

  2. 模块容错机制不足
    product_mgmt模块在初始化时尝试访问数据库,但由于db对象为nil值,导致"attempt to index local ‘db’"错误。模块未能妥善处理数据库不存在或初始化失败的情况,导致整个服务启动失败。

  3. 服务级联失败
    由于product_mgmt服务启动失败,依赖它的digital_warranty等子服务也无法正常工作,形成级联故障。

问题关联知识

相关实体关系

实体 关系 目标实体 描述
Bmc.Kepler.Product_Mgmt 实现 bmc.kepler.Systems.Product product_mgmt模块负责提供产品信息接口
bmc.kepler.Systems.Product 映射 ProductPicture 产品图片信息通过此接口暴露
复位持久化 特性 BMC升级 升级过程中数据会丢失

相似问题案例

在Topic 3606中,昆仑太科_安阳阳报告了类似问题:“最终定位是BMC环境问题,不是白牌包问题,重启BMC后,升级成功,页面也可以正常访问”。这表明product_mgmt模块对环境状态敏感,环境异常可能导致服务初始化失败。

在Topic 5073中,日志分析显示/data/persistence目录未创建,导致数据库无法打开,这与当前问题高度相似。

解决方案建议

短期解决方案

  1. 检查并修复持久化目录

    # 确保持久化目录存在且可写
    mkdir -p /data/persistence
    chmod 755 /data/persistence
    
  2. 强制重启BMC恢复
    根据昆仑太科_安阳阳的经验,重启BMC服务可以解决临时状态问题。

  3. 验证product_mgmt组件版本
    检查/etc/package_infoproduct_mgmt组件的版本信息,确保使用的是最新稳定版本。

长期改进建议

  1. 增强模块容错能力

    • 修改product_mgmt模块代码,增加数据库初始化前的健壮性检查
    • 实现当数据库不可用时的降级机制,至少保证基础服务可用
  2. 优化烧片流程

    • 在烧片脚本中加入对/data/persistence目录的预创建和权限设置
    • 增加烧片后验证步骤,确保关键服务正常运行
  3. 改进持久化策略

    • 考虑将关键产品信息采用"掉电持久化"而非"复位持久化"
    • 实现配置文件备份机制,防止升级导致数据丢失
  4. 完善监控告警

    • 增加对product_mgmt服务状态的健康检查
    • 当资源树关键路径缺失时触发告警

验证方法

  1. 检查资源树路径是否存在:

    mdbctl tree | grep "/bmc/kepler/Systems/1/Product"
    
  2. 验证ProductPicture属性值:

    mdbctl lsprop /bmc/kepler/Systems/1/Product bmc.kepler.Systems.Product ProductPicture
    
  3. 确认Web接口返回正常:

    curl https://<BMC_IP>/UI/Rest/Overview
    

    应返回正确的ProductImage值如img_01而非null

psr没有配置product对象,升级一下psr试试呢