背景介绍
因2509版本进行了 Conan 升级,编译过程中会遇到种种问题,故本文介绍了 2509 签名包的编译过程,供大家参考。
环境准备
如果此前已安装 Ubuntu24.04,可跳过环境准备步骤。
1. WSL2 安装 Ubuntu24.04
PowerShell窗口执行
- WSL2 安装 Ubuntu24.04
wsl --set-default-version 2
wsl --install -d Ubuntu-24.04如果在本步骤中出现错误,请确保您的操作系统支持 WSL,具体请参考安装 WSL | Microsoft Learn
- 重启系统后打开 WSL 设置 Ubuntu 系统账号密码
wsl- 设置 root 用户密码并设置 root 用户为 WSL 默认用户
sudo passwd root
su root在 /etc/wsl.conf 文件中添加内容
[user]
default=root- 重启 WSL
wsl --shutdown
wsl2. docker 加载与运行
Wsl-ubuntu24.04 环境下执行
- 运行 docker pull 拉取 openUBMC 的 2509 Docker 镜像快速完成环境的搭建,如果 docker 尚未安装,可参考Docker开发环境搭建 | 文档中心 | openUBMC。
docker pull swr.cn-north-4.myhuaweicloud.com/openubmc/ubuntu:24.04.2_25.09- 运行 docker image ls 查看镜像是否加载成功
root@DESKTOP-15CE9VA:~# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
swr.cn-north-4.myhuaweicloud.com/openubmc/ubuntu 24.04.2_25.09 91c3ea6eedcd 12 days ago 6.27GB创建 Container 实例
- 创建工作文件夹,作为 WSL-Ubuntu24.04 和 docker 共享的文件夹,方便代码和构建产物管理。
mkdir -p /root/gky_2509- 运行 docker run 创建 Container 实例 gky_2509
docker run -it --mount type=bind,source=/root/gky_2509,target=/home/workspace --name gky_2509 swr.cn-north-4.myhuaweicloud.com/openubmc/ubuntu:24.04.2_25.09 /bin/bash- 通过 docker ps 查看创建的实例,可以看到 container id 对应的 Container 状态
root@DESKTOP-15CE9VA:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f5e6956af1ac swr.cn-north-4.myhuaweicloud.com/openubmc/ubuntu:24.04.2_25.09 "/bin/bash" 56 minutes ago Up 56 minutes gky_2509Container 内部署远程 conan 服务
25.09 及之后的版本,所有组件使用的是 conan 2.x 作为打包工具,开发者需执行以下命令进行 conan 2.x 配置
sdk conan remote命名遵循
https://conan.openubmc.cn/bmc_sdk_{版本号},如 25.12 对应https://conan.openubmc.cn/bmc_sdk_25.1225.12_LTS-SP1 对应https://conan.openubmc.cn/bmc_sdk_25.12-LTS-SP1latest一般为最新版本,如最新为25.12,https://conan.openubmc.cn/bmc_sdk_latest等同https://conan.openubmc.cn/bmc_sdk_25.12bashconan profile detect --force conan remote add openubmc_sdk 'https://conan.openubmc.cn/bmc_sdk_latest' --insecure --force conan remote login openubmc_sdk <openUBMC社区用户名> -p <openUBMC社区用户密码> conan remote add openubmc_opensource 'https://conan.openubmc.cn/openubmc_opensource' --insecure --force conan remote login openubmc_opensource<openUBMC社区用户名> -p <openUBMC社区用户密码>
社区版本构建
1. 配置 GitCode 账户
在源码安装之前需要配置 gitcode 账户,并在 gitcode 个人设置中配置 ssh 公钥:
git config --global user.name <your username>
git config --global user.email <your email>
ssh-keygen -t rsa -b 2048 -C <your email>
cat ~/.ssh/id_rsa.pub2. 开发者环境准备
配置 root 账户密码:
sudo passwd root拉取 manifest 仓代码到本地工作空间。
cd /home/workspace
git clone git@gitcode.com:openUBMC/manifest.git
cd manifestManifest 切换到 2509 节点:
git checkout br_release_openUBMC2509_20251230之后,开发者需前往 openUBMC 社区软件应用中心下载 2509 版本对应的 bmcsdk,并将下载的 bmcsdk 文件存放在 manifest 代码仓目录下。然后,执行脚本文件进行环境初始化(此命令依赖 bmcsdk.zip 中的 hpm_tools、rtos_compiler、sdk,以及 lua-format)。
python3 init.py -path ./bmc_sdk.zip -user USER -psw PASSWORD # USER和PASSWORD为openUBMC社区用户名和密码3. Bingo 升级
sudo apt update
apt policy openubmc-bingo
pip3 install openubmc-bingo
sudo apt update && sudo apt install gnupg
sudo mkdir -p /etc/apt/keyrings
gpg --keyserver keyserver.ubuntu.com --recv-keys BF3B2D407FDEDEA0DC91CC9412640FBCB175287A
gpg --export BF3B2D407FDEDEA0DC91CC9412640FBCB175287A | sudo tee /etc/apt/keyrings/openubmc.gpg >/dev/null
echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/openubmc.gpg] https://openubmc-apt-repo.obs.cn-north-4.myhuaweicloud.com/Ubuntu/ noble main" | sudo tee /etc/apt/sources.list.d/openubmc.list
sudo apt update
apt policy openubmc-bingo
pip3 install openubmc-bingo
bingo upgrade4. 编译 2509
bingo build -b openUBMC -r openubmc_dev构建签名包
获得 privatebinary.zip 和 dev_tools.zip,可放在 /home/workspace 下。
1. 高可用组件及工具安装
apt update && pip install "conan>=2.0.0"
unzip dev_tools.zip && cd dev_tools
apt install -y rpm
cd compiler
rpm -ivh *.rpm
cp ./* /root/rtos_compiler/
cd ..
cd scripts
pip3 install *.whl
dpkg -i hw-ibmc-bmcgo_x86_64.deb
apt install -y -f
cd ..
cd hi1711
cp ./* /root/sdk/
cd ..
cd sdk
tar -zvxf bmc_sdk.tar.gz
cp ./* /root/sdk/
cp ./* /root/rtos_compiler/
cd ..
cp lua-format /usr/bin
cd ..
mkdir -p privatebinary
mv privatebinary.zip privatebinary
cd privatebinary
unzip privatebinary.zip
ls *.tar.gz | xargs -n1 tar xzvf
rm *.tar.gz privatebinary.zip
apt update && apt install -y rsync
rsync -av ./* /root/.conan2/p/
cd ..在进行以上配置后,可根据实际情况,选择使用以下本地签名或远端签名其中一种方式来进行 hpm 签名,建议采用远端签名方式。
2. 本地签名
/root 下创建 ca 文件夹,将 rootca.crl 、rootca.der、 signer.pem、tsa.cnf、ts_signer.pem 放在 /root/ca 下,配置 manifest.yml。
base:
signature:
certificates:
rootca_der: /root/ca/rootca.der
rootca_crl: /root/ca/rootca.crl
signer_pem: /root/ca/signer.pem
timestamp_signer_pem: /root/ca/ts_signer.pem
timestamp_signer_cnf: /root/ca/tsa.cnf修改 manifest.yml 中 firmware_mgmt 的特性 community_enable 为false。
- conan: firmware_mgmt
options:
community_enable: false修改 manifest.yml 中gpp files,将其中的*_BMC改为iBMC,将证书改为指向本地证书的路径。
gpp:
files:
# rootfs镜像文件固定为rootfs_BMC.img
- file: ${work_out}/rootfs_iBMC.img
- file: ${work_out}/rootfs_iBMC.tar.gz
# rootfs_BMC.img的cms签名文件
- file: ${work_out}/rootfs_iBMC.img.cms
# 签名文件的证书吊销列表
- file: /root/ca/rootca.crl
dst: cms.crl
# 签名的根证书
- file: /root/ca/rootca.der
dst: rootca.der在manifest仓库的.bmcgo/config中添加如下配置
[hpm_encrypt]
enable=true3. 远端签名(签名服务器签名)
为提升固件安全性、降低证书泄露风险,建议采用自建签名服务器替代本地签名模式。本地签名需将签名证书直接提供给开发者,存在一定的安全隐患,而通过签名服务器,可在不暴露证书的前提下完成固件签名。 目前,该方案已与社区版 Bingo 软件完成集成。开发者只需在 manifest.yml 文件中进行相应配置,即可通过 Bingo 调用签名服务,无需接触证书,兼顾安全性与易用性。参考了简易签名服务器的自建方案 - Infrastructure SIG - openUBMC 论坛方案。
签名过程
bingo 与签名服务器的交互如下图所示:
构建阶段,先由 bingo 的签名模块向签名服务器发送POST请求,请求中包含待签名文件及签名相关信息。具体如下:
其中,待签名文件及签名参数包括:
| 参数 | 类型 | 解释 |
|---|---|---|
| CertId | 字符串 | 证书ID |
| FileName | 字符串 | 待签名文件名 |
| FileSha256 | 字符串 | 待签名文件sha256数据 |
| Token | 字符串 | 认证令牌 |
| Version | 字符串 | 协议版本 |
签名服务器根据收到的请求信息,进行签名,返回签名后的文件 signed.zip,解压后包含以下四个文件:
| 文件名 | 解释 |
|---|---|
| root.crl | root CA的crl文件 |
| root.crl.sha256 | root CA的crl sha256 |
| XXX.cms | 签名后的文件 |
| XXX.cms.sha256 | 签名后的文件 sha256 |
在使用 Bingo 构建 BMC 固件的过程中,系统会多次对特定文件执行签名操作。若配置了签名服务器,Bingo 会将待签名文件及其对应的 SHA256 校验值通过 POST 请求发送至签名服务器。签名服务器接收到请求后,首先验证文件的 SHA256 值以确保数据完整性,随后对文件进行签名,并将签名结果返回给 Bingo。Bingo 的签名模块收到签名后的文件后,继续执行后续构建流程。
整个通信过程中,所有传输的文件均通过 SHA256 校验机制进行完整性验证,有效防止数据在传输过程中被篡改。
此外,还包含若干扩展字段,用于增强签名服务的灵活性与安全性:
- Token:签名服务器的认证令牌。每次签名请求必须携带该令牌,服务器会验证其合法性,若无效则拒绝签名请求。
- CertId:证书标识符。签名服务器可配置多个证书,通过指定不同的 CertId 选择对应的证书进行签名,便于证书的轮换、吊销和精细化管理。
- Version:协议版本号。用于标识当前通信协议的版本,便于未来 Bingo 签名模块升级时实现向后兼容,确保服务平稳演进。
签名服务的具体流程
基于以上签名过程,签名服务需实现以下核心功能模块:
- 请求接收:通过POST接口接收签名请求,为必选项。
- 安全验证:依次验证Token、CertId、Version合法性。该选项可根据实际情况应用,为可选项。
- 数据校验:对请求文件进行完整性验证,为必选项。
- 签名执行:执行核心签名处理逻辑,为必选项。
- 结果返回:将签名后的文件打包返回,为必选项。
签名处理流程基于 bingo 本地文件签名实现,通过分析构建日志获得以下关键命令序列:
# 1. 证书格式转换
openssl x509 -in /root/ca/rootca.der -inform der -outform pem -out rootca.pem
# 2. CRL格式转换
openssl crl -in /root/ca/rootca.crl -inform der -outform pem -out cms.crl.pem
# 3. 执行签名
hpm_signer -s /root/ca/signer.pem \
-t /root/ca/ts_signer.pem \
-T /root/ca/tsa.cnf \
-i /home/workspace/manifest/temp/build_openUBMC_debug_dev/sdk/origin_uboot_debug/uboot.bin \
-o /home/workspace/manifest/temp/build_openUBMC_debug_dev/sdk/origin_uboot_debug/uboot.bin.cms
# 4. 签名验证
hpm_verify -r rootca.pem \
-C cms.crl.pem \
-c /home/workspace/manifest/temp/build_openUBMC_debug_dev/sdk/origin_uboot_debug/uboot.bin \
-s /home/workspace/manifest/temp/build_openUBMC_debug_dev/sdk/origin_uboot_debug/uboot.bin.cms文件说明:
- 输入文件: uboot.bin(待签名文件)
- 输出文件: uboot.bin.cms(已签名文件)
- 证书材料: rootca.der, rootca.crl, signer.pem, ts_signer.pem, tsa.cnf
签名服务搭建指南
环境准备
系统:Ubuntu24.04
基础镜像:openubmc (BMC构建镜像)代码编译
可选择基于 Go 搭建 HTTP 服务端, 使用以下编译命令可将 Go 项目编译为 Linux 64位可执行文件 cms-server。
GOOS=linux GOARCH=amd64 go build -o cms-server main.go签名服务部署
证书部署示例结构:
/etc/cms-certs/
├── kunlun/
│ ├── signer.pem
│ ├── ts_signer.pem
│ ├── tsa.cnf
│ ├── rootca.der
│ └── rootca.crl
└── other-cert/
├── signer.pem
└── ...将 Go 编译的签名服务程序 cms-server 部署为系统服务。Systemd 服务配置示例:
cat > "/etc/systemd/system/cms-signer.service" << EOF
[Unit]
Description=CMS Sign Server
After=network.target # 在网络服务之后启动
[Service]
Type=simple
WorkingDirectory= /opt/cms-signer
ExecStart=/opt/cms-signer/cms-server -certs /etc/cms-certs # 启动命令
Restart=always # 自动重启
RestartSec=5 # 重启间隔
StandardOutput=journal # 日志输出到系统日志
StandardError=journal
[Install]
WantedBy=multi-user.target # 多用户模式下启用
EOF配置签名服务为开机自启动服务:
systemctl daemon-reload # 重新加载服务配置
systemctl enable cms-signer.service # 设置开机自启
systemctl start cms-signer.service # 立即启动服务
systemctl status cms-signer.service --no-pager # 检查状态配置过程
manifest.yml中进行如下修改:
signature:
files:
- file: ${product}/ca/rootca.crl
dst: cms.crl
simple_signer_server:
cert_id: kunlun
url: "http://192.168.1.199:8089/sign"
rootca_der: "${product}/ca/rootca.der"
ssl_verify: false修改 manifest.yml 中gpp files,将其中的*_BMC改为iBMC。
gpp:
files:
# rootfs镜像文件固定为rootfs_BMC.img
- file: ${work_out}/rootfs_iBMC.img
- file: ${work_out}/rootfs_iBMC.tar.gz
# rootfs_BMC.img的cms签名文件
- file: ${work_out}/rootfs_iBMC.img.cms参数说明:
- url: 签名服务地址(生产环境建议使用 HTTPS)
- rootca_der: 伙伴根证书路径
- cert_id: 签名证书 ID
- ssl_verify: HTTPS 证书验证开关
将伙伴自生成的 rootca.crl 和 rootca.der 替换 manifest/build/product/ca 下的默认 rootca.crl 和 rootca.der。关于证书的生成,可参考自签名CA创建以及HPM签名指导 - CICD SIG - openUBMC 论坛。
4. Dat 文件替换
特别注意:
build/product/BMC/openUBMC/rootfs/etc/system/system/multi-user.target.wants 路径下的 .service 文件必须为软链接
ls -l build/product/BMC/openUBMC/rootfs/etc/systemd/system/multi-user.target.wants如果不是软链接则在 manifest 执行以下命令:
cd build/product/BMC/openUBMC/rootfs/etc/systemd/system/multi-user.target.wants
ls *.service |awk -F',' '{print $1}'| xargs -P 12 -I {{}} ln -sf ../{{}} {{}}把这两个文件复制到 manifest 的 build/manufacture/misc 目录下(解决升级密钥问题)
5. 添加高可用组件
manifest.yml 文件中,在 dependencies: 下增加以下配置:
- conan: power_strategy/1.70.74@openubmc/stable
- conan: cooling/1.70.75@openubmc/stable
- conan: ai_engine/1.90.3@openubmc/stable
- conan: fault_diagnosis/1.90.85@openubmc/stable
- conan: metric_analyzer/1.90.18@openubmc/stable
- conan: tpcm/1.90.15@openubmc/stable
- conan: trust/1.90.25@openubmc/stable
- conan: iam/1.90.12@openubmc/stable
- conan: siteai/v100r025c10spc001b100_001@openubmc/stable
- conan: sitedata/v100r025c10spc001b100_001@openubmc/stable
- conan: hisec_ict_ne/24.1.13.b001@openubmc/stable
- conan: license/1.80.6@openubmc/stable
- conan: adaptive_lm/v100r009c00spc300b100@openubmc/stable
- conan: storelib/07.1002.0100.0000.b006_03@openubmc/stable
- conan: storelibit/07.0700.0200.0600.b003@openubmc/stable
- conan: storelibir3/16.02.b002@openubmc/stable
- conan: storagecore/5.25.11.0.b002@openubmc/stable
- conan: linux_kernel/5.10.0-60.18.0.50.oe2203-h5058@openubmc/stable
- conan: taishanserver2.9.0_csr/0.0.375@openubmc/stable
- conan: taishanserver2.10.0_csr/1.0.18@openubmc/stabletaishanserver2.9.0_csr 如果重复则先暂时删除 taishanserver2.9.0_csr 组件(vpd 已经自带 taishan 仓的 csr)
因高可用组件中包括 iam/1.90.12@openubmc/stable,因此需去掉 dependencies:下原有的 iam。
- conan: iam6. 修改高可用组件启动配置
修改 build/product/BMC/openUBMC/rootfs/opt/bmc/apps/hica/subsys/energy/config.cfg
新增
config:include_app("cooling")
config:include_app("power_strategy")修改 build/product/BMC/openUBMC/rootfs/opt/bmc/apps/hica/subsys/ras/config.cfg
新增
config:include_app("fault_diagnosis")
config:include_app("metric_analyzer")
config:include_app("ai_engine")修改 build/product/BMC/openUBMC/rootfs/opt/bmc/apps/hica/subsys/security/config.cfg
新增
config:include_app("trust")修改 build/product/BMC/openUBMC/rootfs/opt/bmc/conf/launch_control.json 新增
{
"components": [
{
"name": "cooling",
"type": "fork"
},
{
"name": "power_strategy",
"type": "fork"
}
],
"delay": {
"seconds": 15,
"uptime": 100
}
}新增
{
"components": [
{
"name": "ai_engine",
"type": "fork"
},
{
"name": "fault_diagnosis",
"type": "fork"
},
{
"name": "metric_analyzer",
"type": "fork"
}
],
"delay": {
"seconds": 20,
"uptime": 100
}
}新增
{
"name": "trust",
"type": "fork"
}新增
{
"name": "license",
"type": "fork"
}7. Busybox工具集成
集成 busybox 工具,用于使用 telnet 查看调试日志等。
manifest目录下:
git clone https://gitcode.com/openUBMC/conan_index.git
cd conan_index/recipes2/busybox/all
conan create . --name=busybox --version=1.34.0 --user=openubmc --channel=release --profile=profile.ini配置 manifest.yml,增加 debug_dependencies 配置。
debug_dependencies:
- conan: busybox/1.34.0@openUBMC.release/stable8. 修改 make_uboot_img.py
修改 /usr/local/bin/make_uboot_img.py 第九行,将 bingo 改为 bmcgo
9. Flatbuffers 问题处理
wget https://github.com/google/flatbuffers/archive/v2.0.0.tar.gz -O flatbuffers-2.0.0.tar.gz
tar -zxf flatbuffers-2.0.0.tar.gz
mkdir flatbuffers-2.0.0/build
cd flatbuffers-2.0.0/build
sudo cmake ..
sudo make -j8 install10. 编译构建
bmcgo build -b openUBMC -r openubmc_dev