OpenBMC 一些杂项
OpenBMC 备忘录
我的博客
本文档旨在提供一些常用的 OpenBMC
的 recipe
客制化任务,本文只是对 原始文档 的部分翻译,不一定贴合实际情况,需要实事求是。
构建一个指定的机型配置
如果你希望构建一个不同的系统配置:
meta-<layer>/meta-<system>/conf/machine/machineA.conf
meta-<layer>/meta-<system>/conf/machine/machineB.conf
你可以通过设置 MACHINE
环境变量,配置想要构建的机型:
cd openbmc
TEMPLATECONF=meta-<layer>/meta-<system>/conf . openbmc-env
export MACHINE="machineB"
bitbake obmc-phosphor-image
构建 OpenBMC 的 SDK
想要编译 ARM
程序,但是使用的却是 PPC
或 x86
系统,可以构建 sdk
来接受一个 fakeroot
环境:
bitbake -c populate_sdk obmc-phosphor-image
./tmp/deploy/sdk/ \
openbmc-phosphor-glibc-x86_64-obmc-phosphor-image-armv5e-toolchain-2.1.sh
依据提示,在它默认安装后,设置的环境会与如下的命令相似:
. /opt/openbmc-phosphor/2.1/environment-setup-armv5e-openbmc-linux-gnueabi
使用 D-Bus CLI 工具
busctl 是一个很好的命令行工具,运行:
busctl call <path> <interface> <object> <method> <parameters>
使用 QEMU
QEMU
具有一个 palmetto-bmc
机型,来启动一个 Linux Kernel 设备。OpenBMC
也维护一个树来增强 QEMU
的兼容性。
qemu-system-arm -m 256 -M palmetto-bmc -nographic \
-drive file=<path>/flash-palmetto,format=raw,if=mtd \
-net nic \
-net user,hostfwd=:127.0.0.1:2222-:22,hostfwd=:127.0.0.1:2443-:443,hostname=qemu
如果没有错误,且 QEMU
启动了,那么与 BMC
通讯时,只需要修改正确的端口就好了:
curl -c cjar -b cjar -k -H "Content-Type: application/json" \
-X POST https://localhost:2443/login -d "{\"data\": [ \"root\", \"0penBmc\" ] }"
或
ssh -p 2222 root@localhost
退出时,按下 ^a c
,来切换 QEMU 监视器,然后 quit
退出。
通过 QEMU 桥接设备
使用桥设备的一个好处是,你的 qemu
会话运行在桥接子网,在访问设备的时候就不需要端口了。但是需要额外的包来提供 virbr0
,比如:
apt-get install -y libvirt libvirt-bin bridge-utils uml-utilities qemu-system-common
qemu-system-arm -m 256 -M palmetto-bmc -nographic \
-drive file=<path>/flash-palmetto,format=raw,if=mtd \
-net nic,macaddr=C0:FF:EE:00:00:02,model=ftgmac100 \
-net bridge,id=net0,helper=/usr/lib/qemu-bridge-helper,br=virbr0
在进行桥接时,可能会遇到一些问题,可以参考一下下面的配置、命令:
$ cat /etc/qemu/bridge.conf
allow virbr0
$ qemu-system-arm --help | grep helper
[,br=bridge][,helper=helper][,sndbuf=nbytes][,vnet_hdr=on|off][,vhost=on|off]
use network helper 'helper' (default=/usr/lib/qemu/qemu-bridge-helper) to -netdev bridge,id=str[,br=bridge][,helper=helper]
using the program 'helper (default=/usr/lib/qemu/qemu-bridge-helper)
我验证成功的一个命令:
sudo qemu-system-arm -m 256 -M romulus-bmc -nographic -drive file=./tmp/deploy/images/romulus/obmc-phosphor-image-romulus.static.mtd,format=raw,if=mtd -net nic,macaddr=C0:FF:EE:00:00:02,model=ftgmac100 -net bridge,id=net0,helper=/usr/lib/qemu/qemu-bridge-helper,br=virbr0
共享下载目录
在初次构建 OpenBMC
时,需要花费很长的时间,会从网上下载不同的仓库下来。
检查 build/download
目录,来查看下载的仓库。
- 如果文件是单独的文档,那么它看起来会是:
zlib-1.2.11.tar.xz
即下载的文件zlib-1.2.11.tar.xz.done
文件已经下载的标识
- 如果一个仓库通过
git
管理,那么它看起来像是:git2/github.com.openbmc.linux
对git
的克隆git2/github.com.openbmc.linux.done
已经克隆的标识
BitBake 在编译过程中,将会提取代码到工作目录,因此 downloads
目录可以被系统上的不同构建所共享:
- 通过修改
build/conf/local.conf
文件来设置BitBake
的DL_DIR
变量到你的共享下载目录DL_DIR ?= "path_to_existing_downloads"
- 创建一个链接
ln -sf path_to_existing_downloads build/downloads
然后再进行编译,这样会因为无需下载代码而节省很多时间。
使用 git 代理
如果你在中国,那么可能会因为网络原因,在下载过程中崩溃,可以使用 git
代理来加速代码获取。
可以 google git-proxy-wrapper
找到合适的 git
协议代理。
devtool
devtool
是 Yocto
中方便的工具,来对本地目录做出修改,通常的使用方法是:
# 在工作区中构建 recipe 的代码,修改编译它
devtool modify <recipe>
cd /build/workspace/sources/<recipe>
bitbake obmc-phosphor-image
# 移除修改的内容
devtool reset <recipe>
下面是使用 devtool
工具的一个例子,如果想要在 ipmi
中实现一个新的功能,可能需要修改 phosphor-host-ipmid
进程的代码,查看食谱,你确定是 phosphor-ipmi-host.bb
下面是使用 devtool
本地修改、编译并测试的方法:
- 使用
devtool
提取出代码仓库:devtool modify phosphor-ipmi-host
devtool
克隆仓库到build/workspace/sources/phosphor-ipmi-host
,创建devtool
分支 - 对仓库做出修改
- 现在可以编译整个固件了
bitbake obmc-phosphor-image # build the whole image bitbake phosphor-ipmi-host # build the recipe
- 为了测试做出的修改,可以烧录整个固件,或用新的包替换原本的二进制包,注意到,修改的代码编译为
libapphandler.so
它同时被host
以及net ipmi
守护进程使用,推荐复制修改的二进制包到BMC
因为更方便测试:# 替换 BMC 中的 libapphandler.so.0.0.0 scp build/workspace/sources/phosphor-ipmi-host/oe-workdir/package/usr/lib/ipmid-providers/libapphandler.so.0.0.0 root@bmc:/usr/lib/ipmid-providers/ systemctl restart phosphor-ipmi-host.service # 重启 ipmi 守护进程 # 如果想要测试 net ipmi,那么可以 systemctl restart phosphor-ipmi-net.service
- 现在你可以看到你做出的修改的内容了
开发 linux 内核
使用 devtool 开发 linux 内核
开发内核也可以使用 devtool
工具,当然会有一些不同点。
注意: 在新的 ac72846 中内核名修改称为 linux-aspeed
,依据不同的版本灵活使用 linux-obmc
与 linux-aspeed
。
devtool
不会创建devtool
分支,它会检出recipe
中指定的分支- 如果有补丁,
devtool
会直接将它们打到分支上 devtool
复制defconfg
以及machine-specific config
到oe-workdir
devtool
基于上面的配置生成.config
文件
你可以调整代码,并像以往一样编译内核:
bitbake linux-aspeed -c build
修改配置
如果你需要修改配置,并保留它为 defconfig
以方便后面使用:
bitbake linux-aspeed -c menuconfig
# 编辑 configs 之后保存
# .config.new 作为新的内核配置文件
bitbake linux-aspeed -c savedefconfig
# 保存新的 defconfig 到 oe-workdir/linux-aspeed-<version>/defconfig
测试 linux 内核
在编译完成之后,可以烧录镜像来测试新的内核,然而这个过程可能非常缓慢。可以通过网络的方式调试新内核,OpenBMC
内核编译生成 fit
镜像,包括内核 kernel
,设备树 dtb
以及文件系统 initramfs
。通常我们可以通过 tftp
载入它,以 romulus
为例:
- 将
build/tmp/deploy/images/romulus/fitImage-obmc-phosphor-initramfs-romulus.bin
到一个tftp
服务器,将它名命为fitImage
- 重启
BMC
并进入uboot
- 在
uboot
中:setenv ethaddr <mac:addr> # 设置 mac 地址 setenv ipaddr 102.168.0.80 # 设置 BMC IP setenv serverip 192.168.0.11 # 设置 tftp 服务器 IP tftp 0x83000000 fitImage # 将 fitImage 载入到 ram 中,若芯片是 AST2400 使用 0x43000000 bootm 0x83000000 # 从 fitImage 启动
现在你运行了新的内核了。