OpenBMC 一些杂项

OpenBMC 备忘录

我的博客
本文档旨在提供一些常用的 OpenBMCrecipe 客制化任务,本文只是对 原始文档 的部分翻译,不一定贴合实际情况,需要实事求是。

构建一个指定的机型配置

如果你希望构建一个不同的系统配置:

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 程序,但是使用的却是 PPCx86 系统,可以构建 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.linuxgit 的克隆
    • git2/github.com.openbmc.linux.done 已经克隆的标识

BitBake 在编译过程中,将会提取代码到工作目录,因此 downloads 目录可以被系统上的不同构建所共享:

  • 通过修改 build/conf/local.conf 文件来设置 BitBakeDL_DIR 变量到你的共享下载目录
    DL_DIR ?= "path_to_existing_downloads"
    
  • 创建一个链接
    ln -sf path_to_existing_downloads build/downloads
    

然后再进行编译,这样会因为无需下载代码而节省很多时间。

使用 git 代理

如果你在中国,那么可能会因为网络原因,在下载过程中崩溃,可以使用 git 代理来加速代码获取。
可以 google git-proxy-wrapper 找到合适的 git 协议代理。

devtool

devtoolYocto 中方便的工具,来对本地目录做出修改,通常的使用方法是:

# 在工作区中构建 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 本地修改、编译并测试的方法:

  1. 使用 devtool 提取出代码仓库:
    devtool modify phosphor-ipmi-host
    
    devtool 克隆仓库到 build/workspace/sources/phosphor-ipmi-host,创建 devtool 分支
  2. 对仓库做出修改
  3. 现在可以编译整个固件了
    bitbake obmc-phosphor-image # build the whole image
    bitbake phosphor-ipmi-host  # build the recipe
    
  4. 为了测试做出的修改,可以烧录整个固件,或用新的包替换原本的二进制包,注意到,修改的代码编译为 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
    
  5. 现在你可以看到你做出的修改的内容了

开发 linux 内核

使用 devtool 开发 linux 内核

开发内核也可以使用 devtool 工具,当然会有一些不同点。
注意: 在新的 ac72846 中内核名修改称为 linux-aspeed,依据不同的版本灵活使用 linux-obmclinux-aspeed

  1. devtool 不会创建 devtool 分支,它会检出 recipe 中指定的分支
  2. 如果有补丁,devtool 会直接将它们打到分支上
  3. devtool 复制 defconfg 以及 machine-specific configoe-workdir
  4. 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 为例:

  1. build/tmp/deploy/images/romulus/fitImage-obmc-phosphor-initramfs-romulus.bin 到一个 tftp 服务器,将它名命为 fitImage
  2. 重启 BMC 并进入 uboot
  3. 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 启动
    

现在你运行了新的内核了。

posted @ 2021-12-14 22:37  ArvinDu  阅读(3583)  评论(0编辑  收藏  举报