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_sdk 的 conanfile.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,通过 hica、openubmc_sdk 等间接依赖到 hardware 子系统里的各组件

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

storage 在 Level 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.json 中 storage 以 fork 形式列在 hardware 组下,与 chassis、mctpd 等并列。

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 create → export → generate(含 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_pmc、sml_lsi、platform 等目录;当前顶层 sml/CMakeLists.txt 未将其全部 add_subdirectory。厂商 RAID 库(如 libsml_lsi.so、libsml_pmc.so)多在运行时通过 dlopen 按 sml_multilib.h 中的路径加载。

Lua 与生成代码安装

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

源路径 安装内容
src/lualib/ 业务 Lua
gen/storage/、gen/class/ MDS 自动生成(codeGenPolicy.version 见 service.json)
src/service/ Skynet 入口 main.lua、smld.lua
mds/schema.json、mds/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_FILE → temp/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.cfg → config:set_start("storage/service/main")
  • 产品内:由 hardware/config.cfg 的 config:include_app("storage") 加载
  • 逻辑入口:src/service/main.lua → StorageApp(src/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.json、mds/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 单元

参考链接

相关推荐
Leo.yuan40 分钟前
财务团队从“做表“到“分析“,缺的不是工具,是一套财经数智化体系
大数据
云表无代码开发1 小时前
日本开发者彻底破防:中文太强了!换成英文直接裂开
大数据·服务器·人工智能·microsoft·信息可视化
皮皮学姐分享-ppx1 小时前
地级市、省级人才政策强度测算(2000-2025)
大数据·数据库·人工智能·百度·高考
大大大大晴天2 小时前
面向湖仓一体的大数据安全治理:识别、授权、脱敏与审计
大数据
NailiConveyor2 小时前
输送机系统与WMS仓储管理系统集成的5个关键技术点
大数据·运维·自动化·制造·业界资讯
HZZD_HZZD2 小时前
碳排放核算只报一个数,审计凭什么信你?合众致达蒙特卡洛不确定性量化实测:25.2万度园区月账95%置信区间收窄至±2.4%
大数据·物联网
一只专注api接口开发的技术猿2 小时前
告别手工复制粘贴:搭建电商商品自动化监控与数据分析实践
大数据·运维·数据挖掘·数据分析·自动化
wtblszn2 小时前
光伏发电与光热发电有什么区别
大数据·运维·物联网
weixin_177297220693 小时前
成立三年估值80亿美元:法律AI公司Harvey给中国企业的四个启发
大数据·人工智能
ha_lydms3 小时前
MaxCompute中窗口函数
大数据·hadoop·阿里云·云计算·dataworks·maxcompute·odps