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 组件构建与发布,典型流程:
bingo build→ 生成conanbase.pyconan create→export→generate(含 MDS 代码生成)→build(cmake build)→package(cmake install)- 产出
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)/tempCONFIG_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 包,不一定等于当前工作区代码。要用本地改动参与产品构建,需要:
- 在
storage_new执行bingo build并发布到可访问的 Conan remote;或 - 在 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 单元 |