问题描述
1230 基线的 storage 仓已经携带了 sml 库的代码,但是当前 sml 仍然是通过高可用携带二进制预编译的,是否可以激活 storage 组件自带 sml 的构建?需要进行什么样的配置?
观察到存在 sml 的编译选项
打开编译选项后,构建报错,缺少相关头文件
期望结果
能正确从源码构建 SML 库
1230 基线的 storage 仓已经携带了 sml 库的代码,但是当前 sml 仍然是通过高可用携带二进制预编译的,是否可以激活 storage 组件自带 sml 的构建?需要进行什么样的配置?
观察到存在 sml 的编译选项
打开编译选项后,构建报错,缺少相关头文件
能正确从源码构建 SML 库
答案内容由AI生成,仅供参考:
总结:实现从源码构建SML库的关键条件
| 条件 | 是否满足 | 说明 |
|---|---|---|
sml_open 编译选项 |
在 service.json 中启用 |
|
| 需引入 Broadcom/PMC/Huawei SDK Conan包 | ||
| 依赖配置正确 | ||
| 避免僵尸进程等问题 |
根据您提供的问题描述和系统环境信息,以下是对1230基线环境下如何激活并正确编译Storage组件内置SML库的详细分析与解决方案。
storage/src/lualib-src/sml,内含多个子模块(如 sml_lsi, sml_pmc, sml_base 等)。libsml_lsi.so 和其他相关库目前通过高可用组件或闭源依赖引入,为二进制形式(.so 文件)。service.json 中定义了两个关键选项:"sml_open": {
"description": "使能storage仓sml目录",
"option": [true, false],
"default": false
},
"storelib_enable": {
"description": "使能其他厂商存储管理库",
"option": [true, false],
"default": false
}
sml_open = true 是启用内部SML源码构建的关键配置。当您尝试开启 sml_open=true 构建时出现如下编译失败:
fatal error: lsi/storelib.h: No such file or directory
#include "lsi/storelib.h"
fatal error: pmc/pstore.h: No such file or directory
#include "pmc/pstore.h"
SML库依赖的底层厂商SDK头文件(如Broadcom/LSI、PMC)未在构建环境中提供。
尽管Storage组件中包含了SML的适配层源代码,但这些源码本身依赖于外部的闭源RAID卡厂商SDK头文件(例如 storelib.h, pstore.h),而这些头文件:
因此,即使启用了 sml_open 开关,由于缺少必要的头文件依赖,构建过程无法继续。
要实现在1230基线下从源码成功构建SML库,需满足以下条件:
必须确保以下组件可通过 Conan 或其他方式正确解析并提供头文件路径:
| 模块 | 所需头文件 | 来源建议 |
|---|---|---|
sml_lsi |
lsi/storelib.h |
Broadcom SDK 提供,应由 conan 包 broadcom-sdk 或 lsi-storelib-dev 提供 |
sml_pmc |
pmc/pstore.h |
PMC/Adaptec SDK 提供,应打包为 pmc-sdk |
sml_histore |
华为自研SDK | 内部闭源包 huawei-sml-sdk |
修改 conanfile.py 或 manifest.yaml,显式声明对这些SDK开发包的依赖:
# manifest.yaml
requires:
- conan: broadcom-sdk/1.0.0@openubmc/internal
- conan: pmc-sdk/1.2.0@openubmc/internal
- conan: huawei-sml-sdk/latest@openubmc/internal
注意:这些包需提前上传至企业内网 Conan 私服,并确保构建机器可访问。
sml_open 编译选项在构建命令或配置中明确设置:
bmcgo build --option sml_open=True --option storelib_enable=True
或在构建配置文件(如 vars.json)中设定:
{
"sml_open": true,
"storelib_enable": true
}
![]()
storelib_enable=True通常用于激活对非华为RAID卡的支持,与sml_open配套使用更佳。
确保 CMakeLists.txt 中对头文件包含路径的处理是动态且可扩展的。
例如,在 storage/src/lualib-src/sml/sml_lsi/CMakeLists.txt 中应有类似:
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}/inc
${BROADCOM_SDK_INCLUDE_DIR} # 通过Conan注入
)
可通过 Conan 的 cpp_info.includedirs 自动导出头文件路径,并在 CMake 中引用。
由于 bmcgo 是 openUBMC 的核心构建工具(如知识库所示,其版本影响构建行为),请确保:
bmcgo 版本(推荐 ≥0.5.370)bmcgo clean --all
bmcgo build --force --option sml_open=true
提示:可配合
--dry-run查看依赖解析是否正确加载了SDK包。
若短期内无法获取闭源SDK头文件,但仍需验证SML构建流程,可采用以下方式:
创建模拟头文件,供编译通过(适用于调试构建逻辑,不能用于生产):
// mock/lsi/storelib.h
#ifndef _LSI_STORELIB_H_
#define _LSI_STORELIB_H_
typedef struct { int dummy; } STOR_LIB_INFO;
#endif
然后将 mock/ 添加进 include path。
在 CMakeLists.txt 中添加判断:
if(NOT DEFINED BROADCOM_SDK_AVAILABLE)
add_definitions(-DUSE_STUB_SML)
endif()
并在代码中用 #ifdef USE_STUB_SML 包裹依赖厂商头的部分。
| 条件 | 是否满足 | 说明 |
|---|---|---|
sml_open 编译选项 |
在 service.json 中启用 |
|
| 需引入 Broadcom/PMC/Huawei SDK Conan包 | ||
| 依赖配置正确 | ||
| 避免僵尸进程等问题 |
神码_刘杰 曾成功解决类似编译问题(见文档chunk #1),方法为:移除冲突库并清理依赖缓存libsml_lsi.so 被证实需通过 storelib_enable=true 打包进固件(见 chunk #2)SML Library 本质是封装厂商SDK的抽象层,依赖底层 .so 和头文件(见 KG 实体描述)要实现
storage组件内建 SML 库的源码构建,必须:
lsi/storelib.h、pmc/pstore.h 等头文件以 Conan 包形式纳入依赖管理;sml_open=true 构建选项;manifest.yaml 正确声明SDK依赖并配置包含路径;bmcgo 构建并清理缓存。如果您所在组织尚无权限获取上述SDK头文件,请联系平台提供方或华为技术支持,申请相应的开发套件(SDK Dev Kit)以支持自主构建。
如您能提供更多关于所用RAID卡型号(如9560-8i)及具体SDK来源的信息,可进一步细化解决方案。
相关链接:
打开这两个编译选项并不能直接编译出博通的sml库,因为NDA缺少厂商提供部分,需要自行获取
参考:openubmc 是否支持 博通 9560-8i 的raid 卡 - 交流互助区 / 鲲鹏专区 - openUBMC 论坛
博通厂商的头文件缺失,无法提供,需要开发者有对应的头文件放在对应的目录下才能进行编译,目前只有1880的sml_histore可以在蓝区编译