openUBMC集成构建

storage 组件构建与集成说明

本文档说明 storage 组件在 openUBMC 中的编译构建方式,并结合 manifest_new_blue (产品集成仓)与 storage_new(组件源码仓)进行说明。


一、整体架构

openUBMC 采用 Conan 包管理 + CMake 编译 + bingo 工程工具 的模式:

层级 仓库/位置 作用
组件源码 storage_new 业务代码、CMake、Conan 入口
产品集成 manifest_new_blue 声明依赖版本、子系统划分、rootfs 启动配置
构建工具 bingo + Conan 远程仓 单组件 bingo build;整包 bingo build 拉取各 Conan 包

bingo build (产品级)
manifest_new_blue 产品集成
bingo build (组件级)
storage_new 源码仓
mds/service.json

(依赖/选项/代码生成)
CMakeLists.txt
conanfile.py → ConanBase
src/lualib/*.lua
src/lualib-src/

l_sml + sml
生成 conanbase.py
MDS 代码生成 → gen/
conan create
storage/x.y.z@openubmc/stable
build/subsys/hardware.yml
build/sdk/conanfile.py

合并子系统版本
product/.../manifest.yml
rootfs 启动配置
rootfs / HPM 镜像


二、manifest_new_blue:storage 如何被拉进产品

2.1 源码与子模块

manifest_new_blue/.gitmodules 将 storage 登记为子模块(开发时常对应 app/storage):

ini 复制代码
[submodule "app/storage"]
    path = app/storage
    url = https://gitcode.com/openUBMC/storage.git

2.2 子系统依赖(hardware)

storage 归属 hardware 子系统 ,在 build/subsys/hardware.yml 中固定 Conan 坐标,例如:

yaml 复制代码
dependencies:
  - conan: "storage/1.100.24@openubmc/stable"
  # 同文件中还包含 vpd、chassis、pcie_device 等 hardware 组件

产品构建时,openubmc_sdkconanfile.py 会扫描 build/subsys/*.yml,把子系统里写死的版本 覆盖 到 SDK/产品 manifest 里同名组件的版本上,保证整包版本一致。

2.3 SDK 与产品 manifest

  • build/sdk/manifest.yml:列出 conan: storage(开发 SDK 用)
  • build/product/BMC/openUBMC/manifest.yml:openUBMC 产品总 manifest,通过 hicaopenubmc_sdk 等间接依赖到 hardware 子系统里的各组件

2.4 依赖规则(dep-rules.json)

storageLevel 4 / hardware 子系统中。构建/启动顺序上相关依赖包括:

方向 说明
storage → mctpd、pcie_device storage 依赖这些组件
chassis → storage chassis 依赖 storage
manufacture → storage 产测场景依赖 storage

这主要影响 Conan 依赖解析和运行时加载顺序,而不是 storage 自身的 CMake 逻辑。

2.5 运行时:挂在 hardware 进程,无独立 systemd

mds/service.json 中:

json 复制代码
{
    "name": "storage",
    "type": "application",
    "deployConfig": "hardware.service"
}

不单独提供 storage.service ,而是作为 hardware 子系统 里的一个 Skynet 应用被拉起。

hardware 子系统 Skynet 配置(manifest_new_blue 中)示例:

lua 复制代码
include "/opt/bmc/libmc/config.cfg"
config:set_root("/")
config:set_start("hica/subsys/hardware/service/main")
config:include_app("storage")
-- 同文件还 include mdb_interface、chassis、mctpd 等
config:done()

launch_control.jsonstoragefork 形式列在 hardware 组下,与 chassismctpd 等并列。

systemd 侧由 hardware.service 启动,例如:

ini 复制代码
ExecStart=secbox -f .../hardware/secbox.cfg -c 'exec -a hardware /opt/bmc/skynet/skynet /opt/bmc/apps/hica/subsys/hardware/config.cfg'

三、storage_new:组件自身如何编译

3.1 Conan 入口(继承 ConanBase)

conanfile.py 继承由 bingo 自动生成的 conanbase.py(该文件在 .gitignore 中,不在源码仓内):

python 复制代码
from conanbase import ConanBase, copy, os

class AppConan(ConanBase):
    def package(self):
        super().package()
        copy(self, "permissions.ini",
             src=os.path.join(self.source_folder, "dist"),
             dst=self.package_folder)

参考 openUBMC 组件构建与发布,典型流程:

  1. bingo build → 生成 conanbase.py
  2. conan createexportgenerate(含 MDS 代码生成)→ build(cmake build)→ package(cmake install)
  3. 产出 storage/<version>@openubmc/<stage>

单组件本地构建示例 (在 storage_new 目录):

bash 复制代码
bingo build --stage=stable

# 关闭开源 SML 目录编译(使用 libmgmt_protocol 闭源库):
# bingo build --stage=stable -o storage:sml_open=False

3.2 构建依赖与选项(mds/service.json)

build 依赖:

Conan 包 用途
libmc4lua Lua 框架
mctpd MCTP 相关
libmgmt_protocol 管理协议 / 闭源 SML

test 依赖(单元测试): hwproxy、hwdiscovery、ipmi_core、persistence、mdb_interface、key_mgmt、dtframeforlua、fructrl 等。

构建选项:

选项 默认值 说明
sml_open true 使能本仓 src/lualib-src/sml 开源 SML 编译;映射为 CMake CONAN_DEFS_SML_OPEN

3.3 CMake 构建内容

根目录 CMakeLists.txt 主要完成:编原生库安装 Lua/生成代码安装配置与 rootfs 片段

原生库(src/lualib-src)
cmake 复制代码
ADD_SUBDIRECTORY(l_sml)
if(CONAN_DEFS_SML_OPEN)
    add_definitions(-DBUILD_SML_OPEN)
    ADD_SUBDIRECTORY(sml)
endif()
产物 条件 说明
sml.so(l_sml) 始终编译 Lua 与 SML 的绑定层
libsml_base_open.so sml_open=true 开源 SML(sml_base / sml_histore / pd_log_parse)
libsml_base.so sml_open=false 使用 libmgmt_protocol 预编译闭源库

sml_open=true 时参与编译的子目录:

复制代码
src/lualib-src/sml/
├── sml_base/
├── sml_histore/
└── pd_log_parse/

开源库安装路径(由 sml_install_libdir.cmake 决定):

  • 64 位:usr/lib64/
  • 32 位:usr/lib/

说明: 仓内另有 sml_pmcsml_lsiplatform 等目录;当前顶层 sml/CMakeLists.txt 未将其全部 add_subdirectory。厂商 RAID 库(如 libsml_lsi.solibsml_pmc.so)多在运行时通过 dlopensml_multilib.h 中的路径加载。

Lua 与生成代码安装

安装前缀:opt/bmc/apps/storage/

源路径 安装内容
src/lualib/ 业务 Lua
gen/storage/gen/class/ MDS 自动生成(codeGenPolicy.version 见 service.json)
src/service/ Skynet 入口 main.luasmld.lua
mds/schema.jsonmds/service.json 模型与服务描述
include/ opt/bmc/lualib
dist/config.cfg 应用级 Skynet 配置
dist/user_conf/rootfs/ rootfs 附加文件
主要第三方依赖(CMake find_package / Conan)
  • libmc4lua、skynet、json、liblogger、huawei_secure_c
  • glib-2.0、gmodule-2.0(PkgConfig)
  • libmgmt_protocol

3.4 Conan 包内目录布局(示意)

复制代码
opt/bmc/apps/storage/
├── lualib/              # 业务逻辑
├── gen/                 # client、db、json_types 等
├── service/             # main.lua, smld.lua
├── mds/                 # schema.json, service.json
├── config.cfg           # 来自 dist/config.cfg
└── luaclib/             # 若有其它 native 模块

opt/bmc/luaclib/
└── sml.so               # l_sml 编译产物

usr/lib64/               # sml_open=true 时
├── libsml_base_open.so
├── libsml_custom_base_open.so
├── libsml_histore_open.so
└── libpd_log_parse_open.so

permissions.ini          # conanfile.package() 从 dist/ 拷贝

3.5 本地开发与测试(Makefile)

bash 复制代码
# 需已安装 SDK,且 temp/ 下有 skynet、libmc 等(bingo install_sdk)
make unit_test      # 运行 test/unit/test.lua
make joint_test     # 集成测试(test_app.conf)
make gen            # MDS 代码生成(依赖 TPL_DIR,由 SDK/bingo 提供)

环境变量(Makefile 中定义):

  • ROOT_DIR$(PWD)/temp
  • CONFIG_FILEtemp/opt/bmc/libmc/config.cfg

四、从构建到运行的完整链路

Skynet hardware 子系统 Conan 远程仓 bingo 开发者 Skynet hardware 子系统 Conan 远程仓 bingo 开发者 systemd hardware.service storage_new: bingo build --stage=stable 生成 conanbase + MDS codegen conan create → storage/x.y.z@openubmc/stable manifest: bingo build (产品) 拉取 hardware.yml 中 storage 版本 组装 rootfs skynet hardware/config.cfg include_app("storage") storage/service/main.lua → StorageApp

应用入口:

  • 组件内:dist/config.cfgconfig:set_start("storage/service/main")
  • 产品内:由 hardware/config.cfgconfig:include_app("storage") 加载
  • 逻辑入口:src/service/main.luaStorageAppsrc/lualib/storage_app.lua

五、版本与集成对齐

位置 版本示例 说明
manifest_new_blue/build/subsys/hardware.yml 1.100.24 产品集成锁定的 Conan 版本
storage_new/mds/service.json 1.100.22 仓内元数据版本
CHANGELOG 与发布节奏一致 记录各版本变更

若本地 storage_new 未将对应版本发布到 Conan 仓,产品整包构建仍会拉取远程 stable 包,不一定等于当前工作区代码。要用本地改动参与产品构建,需要:

  1. storage_new 执行 bingo build 并发布到可访问的 Conan remote;或
  2. 在 manifest 中临时指向 dev channel / 本地 cache(按团队规范操作)。

六、关键开关小结

开关 作用域 说明
sml_open 组件 Conan option true:编译开源 sml/false:链接 libmgmt_protocol 闭源 SML
manufacture 产品/组件选项 为 true 时可能安装 manufacture/ 目录(BUILD_MANUFACTURE
--stage bingo build dev / rc / stable,决定包坐标 channel
--build_type bingo build debug / release / dt

七、相关文件索引(storage_new)

文件 用途
conanfile.py Conan 包定义,继承 ConanBase
CMakeLists.txt 安装规则、子目录、SML 开关
mds/service.json 组件名、版本、依赖、选项、代码生成策略
mds/schema.jsonmds/model.json 数据模型
src/lualib/ 业务 Lua
src/lualib-src/ C/C++ 原生库(l_sml、sml)
src/service/main.lua Skynet 服务入口
dist/config.cfg 独立运行时的 Skynet 配置
dist/permissions.ini 权限配置,打入 Conan 包
gen/ MDS 生成代码(勿手改)
Makefile 本地 unit_test / gen

八、相关文件索引(manifest_new_blue)

文件 用途
build/subsys/hardware.yml hardware 子系统 Conan 依赖及 storage 版本
build/sdk/manifest.yml SDK 依赖列表
build/product/BMC/openUBMC/manifest.yml 产品总 manifest
build/sdk/conanfile.py 合并 subsys 版本到 manifest
dep-rules.json 子系统/组件依赖规则
rootfs/.../hardware/config.cfg hardware Skynet 启动,include storage
rootfs/.../launch_control.json 组件 fork 配置
rootfs/etc/systemd/system/hardware.service hardware systemd 单元

参考链接

相关推荐
liyunlong-java1 小时前
Elasticsearch 8.5.3 + IK 分词器 + Kibana 8.5.3 一键安装
大数据·elasticsearch·jenkins
真上帝的左手1 小时前
19. 大数据-数据仓库简介
大数据·数据仓库
Volunteer Technology1 小时前
MapReduce使用与原理(一)
大数据·eclipse·mapreduce
Volunteer Technology1 小时前
MapReduce使用与原理 (二)
大数据·mapreduce
石逸凡2 小时前
新时代的信息茧房
大数据·人工智能
澈2072 小时前
Git入门指南:核心概念与实用操作
大数据·git·搜索引擎
workflower2 小时前
人工智能全球治理
大数据·人工智能·设计模式·机器人·动态规划
workflower2 小时前
AI灵活高效的智慧用能核心场景
大数据·人工智能·设计模式·机器人·动态规划
189228048612 小时前
NV301固态MT29F32T08GWLBHD6-QJES:B
大数据·服务器·人工智能·科技·缓存