OpenBMC 开发指南
本文档介绍 OpenBMC 定制化构建的步骤。
1. 创建本地 OpenBMC 项目
1.1 依赖条件
参考Yocto 指导文档,在编译 OpenBMC 前,需要给编译的宿主机器,检查是否已经安装对应的软件。以 Ubuntu 和 Fedora 操作系统示例,使用如下命令,安装工具软件。
Ubuntu
sudo apt install git python3-distutils gcc g++ make file wget gawk diffstat bzip2 cpio chrpath zstd lz4 bzip2
Fedora
sudo dnf install git python3 gcc g++ gawk which bzip2 chrpath cpio hostname file diffutils diffstat lz4 wget zstd rpcgen patch
1.2 下载 OpenBMC 源码
git clone git@gitee.com:openbmc/openbmc.git
1.3 构建特定的 BMC 卡
使用如下命令,查看是否已实现对该 BMC 卡的适配;若未适配需要自行开发。
$ . setup
Target machine must be specified. Use one of:
ast25ps23 e2ps23 evb-pomelov11
dl360poc mtjade swift
e3c246d4i mtmitchell tatlin-archive-x86
ethanolx nicole tiogapass
evb-ast2500 olympus-nuvoton transformers
evb-ast2600 on5263m5 vegman-n110
evb-npcm750 p10bmc vegman-rx20
f0b palmetto vegman-sx20
fp5280g2 qcom-dc-scm-v1 witherspoon
g220a quanta-q71l witherspoon-tacoma
gbs romed8hm3 x11spi
greatlakes romulus yosemitev2
gsj s2600wf zaius
kudo s6q
lannister s7106
以 e2ps23 的服务器示例,执行如下命令。
cd openbmc
. setup e2ps23
4) 编译构建
bitbake obmc-phosphor-image
首次构建 OpenBMC,需要耗费很长的时间,这是因为要从互联网上下载各种软件包、工具链等。 'bitbake obmc-phosphor-image' 命令执行完成后,将会在 ‘tmp/dempoy/images/e2ps23' 目录下,生成 u-boot 、内核、文件系统、mtd 格式镜像等文件。
$ cd tmp/demploy/image/e2ps23
$ ls
fitImage obmc-phosphor-image-e2ps23-20230814030016.static.mtd
u-boot.bin u-boot-e2ps23.bin
1.5 烧录固件
将类似名为 'obmc-phosphor-image-e2ps23-20230814030016.static.mtd' 的 mtd 格式固件,烧录到 BMC 卡的 flash。启动 BMC 系统,即可验证 BMC 固件功能是否达到预期要求。
2. OpenBMC 开发
在 OpenBMC 的顶层目录里,可根据下面的命名规则,找到特定服务器的BMC型号,参考其他机器的配置文件,编写未适配机器的配置文件。
meta-<layer>/meta-<system>/conf/machine/machineA.conf
meta-<layer>/meta-<system>/conf/machine/machineB.conf
然后执行如下命令,若执行成功,将会在 'tmp/dempoy/images/machineB' 目录下,生成 u-boot、内核、文件系统、mtd 格式镜像等文件。
$ cd openbmc
$ . setup machineB
$ bitbake obmc-phosphor-image
3. 使用 devtool 修改 recipe
'devtool' 作为 Yocto 项目里的一款便捷工具,为 OpenBMC 的开发者提供了快捷的代码修改方式。 'devtool' 的使用命令如下:
$ devtool modify <recipe>
$ cd build/workspace/sources/<recipe>
$ bitbake obmc-phosphor-image
其中 '<recipe>' 为 OpenBMC 的任一配方名称。在进入目录 'build/workspace/sources/<recipe>' ,可对源代码做本地修改保存后,执行 'bitbake obmc-phosphor-image' 命令成功后,修改的代码即可被编译进 mtd 格式的固件里。将mtd格式的固件烧录到 BMC 的 flash,启动 BMC 系统,可测试修改的功能是否生效。
3.1 devtool 使用示例
(1) 使用 'devtool' 解压源码压缩包。
devtool modify phosphor-state-manager
上述命令,将 recipe 名为 'phosphor-state-manager' 的源码,解压到如下目录里。
(2) 修改 recipe 的代码
vi workspace/sources/phosphor-state-manager/bmc_state_manager_main.cpp
添加 'Hello World' 的打印到 recipe 里。
+#include <iostream>
int main(int argc, char**)
{
@@ -17,6 +18,8 @@ int main(int argc, char**)
bus.request_name(BMC_BUSNAME);
+ std::cout<<"Hello World" <<std::endl;
+
while (true)
{
(3) 重新构建编译
使用如下命令,将修改的 recipe 重新构建编译,打包进二进制的 flash 固件里。
bitbake obmc-phosphor-image
(4) 测试验证
将固件烧录到 flash,或在 QEMU 里测试验证,查看修改是否生效。
journalctl | grep "Hello World"
终端将会输出如下打印内容:
<date> e2ps23 phosphor-bmc-state-manager[1089]: Hello World
3.2 使用 devtool 修改 recipe
若 '<recipe>' 的修改达到设计的要求,可使用 'git format-patch' 命令,将差异文件,以补丁的形式导出。接着使用如下命令,将本地修改撤销,使用 OpenBMC 原生的 '<recipe>'。
$ devtool reset <recipe>
4. 设置软件包目录共享
在编译 OpenBMC 的服务器上,可以使得多个用户共享 OpenBMC 下载的软件包目录。OpenBMC 根据软件包的管理软件,给下载的软件包重新命名。用户可以在 'build/downloads' 查看下载的软件包。
- 若软件包是单个的压缩包,命名如下:
zlib-1.2.11.tar.xz
- 软件包的原名zlib-1.2.11.tar.xz.done
- 软件包已经下载完成的标志
- 若软件包被git版本工具管理,命名如下:
git2/gitee.com.openbmc.linux
- 软件包的原名git2/gitee.com.openbmc.linux.done
- 软件包已经下载完成的标志