OpenBMC 构建
与 UEFI 类似,OpenBMC 也有自己的一套构建体系,简单的构建并不需要对这套基于 BitBake 工具的构建体系有太多的理解。

构建

❯ git clone git@github.com:openbmc/openbmc.git

cd openbmc

source setup romulus
Machine romulus found in meta-ibm/meta-romulus
Common targets are:
     obmc-phosphor-image

❯ bitbake obmc-phosphor-image

❯ ls build/romulus/tmp/deploy/images/romulus
obmc-phosphor-image-romulus-20231103030737.static.mtd

其中 setup 脚本做的事情主要是搜索 meta-*/conf/machine/ 目录,找到与命令行参数匹配的机器类型,然后执行 oe-init-build-env 脚本(${target} 即命令行参数机器类型):

configs=$(ls -1 meta-*/meta-*/conf/machine/*.conf meta-*/conf/machine/*.conf)
configs="$configs $(ls -1 poky/meta/conf/machine/qemu*.conf)"

for cfg in $configs; do
    name=${cfg##*/}
    name=${name%.conf}
    tmpl=${cfg%/machine/*.conf}

    if [ "${name}" = "${target}" ]; then
        mkdir -p "${build_dir}"
        TEMPLATECONF="${tmpl}/templates/default" source oe-init-build-env "${build_dir}"
    fi
done

而 oe-init-build-env 脚本做的事情主要是根据 TEMPLATECONF 目录下的 bblayers.conf.sample 和 local.conf.sample 文件在 build/conf 目录下创建相应 bblayers.conf, local.conf 文件,然后将 TEMPLATECONF 的值写入 templateconf.cfg 文件。

因此,setup 脚本也可以通过类似如下的方法显式执行(默认构建目录为 build):

TEMPLATECONF=meta-ibm/meta-romulus/conf/templates/default source oe-init-build-env

内置支持的机器类型可以通过如下命令查看:

source setup
Target machine must be specified. Use one of:

ahe50dc                 lannister               s6q
bletchley               mori                    s7106
daytonax                mtjade                  s8036
dl360-g11               mtmitchell              sbp1
dl360poc                ncplite                 swift
e3c246d4i               nf5280m7                system1
ethanolx                nicole                  tatlin-archive-x86
evb-ast2500             olympus-nuvoton         tiogapass
evb-ast2600             on5263m5                transformers
evb-npcm750             p10bmc                  vegman-n110
evb-npcm845             p10bmc-distributed      vegman-rx20
f0b                     palmetto                vegman-sx20
fp5280g2                qcom-dc-scm-v1          witherspoon
g220a                   quanta-q71l             witherspoon-tacoma
gbs                     rl300-g11               x11spi
genesis3                romed8hm3               yosemite4
greatlakes              romulus                 yosemitev2
kudo                    s2600wf                 zaius

构建目录

构建目录(TOPDIR)下的内容如下所示:

9af78ac421c5ef09e50d203b87bdc12c.png

其中 work/ 目录是构建过程的中间产物,sysroots-components/ 目录保存了应用构建时用到的 recipe-sysroot 和 recipe-sysroot-native 目录的内容,deploy/images/romulus/ 是最终生成的镜像,这三者类似于 rpmbuild 的 BUILD, BUILDROOT, RPMS 三个目录。

work/ 和 sysroots-components/ 下的各目录有点类似于 rpmbuild 的 RPMS/noarch, RPMS/x86_64 等,与体系架构相关。

gcc 在 sysroots-components/x86_64/gcc-cross-arm 目录下,binutils 在 sysroots-components/x86_64/binutils-cross-arm 目录下。

bitbake 命令

❯ bitbake -s
bmcweb                                            :1.0+git-r0
gcc                                                :13.2.0-r0
gcc-cross-arm                                      :13.2.0-r0

❯ bitbake bmcweb -c listtasks
❯ bitbake bmcweb -e | grep ^BBLAYERS= -5

❯ bitbake bmcweb
❯ bitbake bmcweb -c cleansstate
❯ bitbake bmcweb -c cleanall

❯ bitbake-layers show-layers

listtasks 列出来的 task 可以单独执行:

❯ bitbake virtual/kernel -c do_fetch

qemu 模拟运行

❯ qemu-system-arm -m 256 -M romulus-bmc -nographic -drive file=build/romulus/tmp/deploy/images/romulus/obmc-phosphor-image-romulus-20231103030737.static.mtd,format=raw,if=mtd -net nic -net user,hostfwd=::2222-:22,hostfwd=::2443-:443,hostfwd=udp::2623-:623,hostname=qemu

注意 hostname 参数不可缺少,否则无法启动。

登陆用户名和密码(包括 SSH 和 bmcweb):root / 0penBmc

不需要按照文档里的方法去用 qemu fork,而是直接可以用系统自带的上游版 qemu 启动虚拟机

在 QEMU 中运行 OpenBMC
https://jia.je/system/2023/08/11/openbmc-qemu/

OpenBMC 每日构建镜像(以 romulus 为例)
https://jenkins.openbmc.org/job/latest-master/lastSuccessfulBuild/label=docker-builder,target=romulus/


最后修改于 2023-12-31