赞
踩
这篇文档是基于OpenBMC官方的cheatsheet.md进行翻译和完善的,因为原文内容撰写的时间比较久了,需要进行更新,本文中做了适当的更新。如果读者有更好的建议,可以留下评论,我这边尽量再根据建议进行内容完善。
本文档旨在为常见的OpenBMC定制任务提供一组配方,而无需了解完整的yocto构建过程。
内核配方在:
meta-phosphor/common/recipes-kernel/linux/linux-obmc_X.Y.bb
上面是原文的示例,目前我没找到合适的位置,读者有建议或者知道具体位置可以留下评论。我找了类似的例子,如下位置:
meta-aspeed/recipes-kernel/linux/linux-aspeed_git.bb
这个bb文件中,通过require关键词引用了linux-aspeed.inc文件
require linux-aspeed.inc
linux-aspeed.inc文件的位置:
meta-aspeed/recipes-kernel/linux/linux-aspeed.inc
要使用本地git树,需要将SRC_URI改为不带主机名的git://URL,并删除protocol=git或者protocol=https参数。例如:
SRC_URI = "git:///home/jk/devel/linux;branch=${KBRANCH}"
SRCRV变量可以设置为固定的git提交,也可以设置为"${AUTOREV}",以使用KBRANCH中的最新提交。
Romulus的目标是romulus。
- $ cd openbmc
- $ . setup romulus
- $ bitbake obmc-phosphor-image
如果想编译的系统包含不同的机器配置:
- meta-<layer>/meta-<system>/conf/machine/machineA.conf
- meta-<layer>/meta-<system>/conf/machine/machineB.conf
可以将机器名称传递给setup程序,来指定要编译的机器配置。
- $ cd openbmc
- $ . setup machineB
- $ bitbake obmc-phosphor-image
你正在寻找一种方法来编译“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
上面是原文中的实例,下面是我目前测试的示例:
$ ./tmp/deploy/sdk/oecore-obmc-phosphor-image-x86_64-arm1176jzs-romulus-toolchain-nodistro.0.sh
按照提示操作。安装后,设置env的默认配置将类似于此命令:
. /opt/openbmc-phosphor/2.1/environment-setup-armv5e-openbmc-linux-gnueabi
上面是原文中的实例,下面是我目前测试的示例:
. /usr/local/oecore-x86_64/environment-setup-arm1176jzs-openbmc-linux-gnueabi
可以通过删除build/conf目录来重新配置程序编译:
rm -rf build/conf
或者
rm -rf build/machineName
并再次运行setup命令。
这是一个可以通过cli发出D-Bus命令的好工具。这样,就不必等待代码到达系统上的路径。也非常适合使用QEMU运行命令。
运行方式:
busctl call <path> <interface> <object> <method> <parameters>
<parameters>示例:sssay "t1" "t2" "t3" 2 2 3
QEMU有一个palmetto-bmc机器(从v2.6.0开始),它实现了启动Linux内核的核心设备。OpenBMC还维护了一棵树,其中包含上游的补丁或临时work-arounds方案,以在适当的情况下扩展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(请参阅本文档中的编译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
要退出,请输入Ctrl+a+c切换到QEMU监视器,然后输入quit退出。或者尝试输入Ctrl+a+x退出。
- git clone https://github.com/openbmc/qemu.git
- cd qemu
- git submodule update --recursive
- mkdir build
- cd build
- ../configure --target-list=arm-softmmu --enable-slirp
- make
编译期间可能会报错,可以尝试更新pip,安装一些依赖包,例如:
- pip3 install --upgrade pip
- sudo apt install ninja-build
- sudo apt install libglib2.0-dev
编译的文件位于:arm-softmmu/qemu-system-arm
使用桥接设备需要root权限进行设置。好处是qemu会话在网桥子网中运行,因此不需要端口转发。需要一些软件包作为virbr0,例如:
- apt-get install 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
还有一些其他有用的参数,比如可以将控制台重定向到另一个窗口。这就产生了一个易于访问的qemu命令会话。-monitor stdio -serial pty -nodefaults
使用桥接设备的方式,我没有测试通,有测试通的读者,可以留下评论,分享一下。我使用了其他命令,通过编译的QEMU启动了BMC,具体命令如下:
./qemu-system-arm -m 256 -M romulus-bmc -nographic -drive file=/home/test/open/openbmc/build/romulus/tmp/deploy/images/romulus/obmc-phosphor-image-romulus-20240312013659.static.mtd,format=raw,if=mtd -net user,hostfwd=:127.0.0.1:2222-:22,hostfwd=:127.0.0.1:2443-:443,hostname=qemu
登录:
curl -c cjar -k -X POST -H "Content-Type: application/json" -d '{"data": [ "root", "0penBmc" ] }' https://${bmc}/login
连接到主机控制台:
ssh -p 2200 root@bmc
开机:
- curl -c cjar -b cjar -k -H "Content-Type: application/json" -X PUT \
- -d '{"data": "xyz.openbmc_project.State.Host.Transition.On"}' \
- https://${bmc}/xyz/openbmc_project/state/host0/attr/RequestedHostTransition
SDK编译提供了GDB和调试符号:
(1) 配置好SDK环境后,即可使用$GDB
(2) 调试符号位于每个可执行文件的.debug/目录中。
使用GDB:
(1) 设置SDK环境;
(2) 运行以下GDB命:
- cd <sysroot_of_sdk_build>
- $GDB <relative_path_to_exeutable> <path_to_core_file>
默认情况下,在OpenBMC中禁用coredump。启用coredump的方式:
- echo '/tmp/core_%e.%p' | tee /proc/sys/kernel/core_pattern
- ulimit -c unlimited
你可能需要调查哪些文件是通过覆盖rwfs持久化的。为此,可以列出此路径,然后删除那些原始文件,或者删除覆盖以恢复文件。
/run/initramfs/rw/cow/
编译OpenBMC的第一个版本需要很长时间。它从互联网上下载各种存储库。
检查build/downloads或者示例build/romulus/downloads,以查看所有下载的存储库。
(1) 如果存储库是单个存档,则通常如下所示:
- zlib-1.2.11.tar.xz // 存储库本身
- zlib-1.2.11.tar.xz.done // 指示存储库已下载的标志
(2) 如果存储库由git管理,它通常如下所示:
- git2/github.com.openbmc.linux // git 裸克隆
- git2/github.com.openbmc.linux.done // 指示存储库已下载的标志
Bitbake会在编译过程中将代码提取到工作目录中,因此downloads目录可以分享给系统上的不同编译任务:
(1) 通过编辑build/conf/local.conf或build/romulus/conf/local.conf文件,将Bitbake环境变量DL_DIR设置为共享的downloads目录:
DL_DIR ?= "<path>/<to>/<existing>/downloads"
(2) 或者创建软链接:
ln -sf <path>/<to>/<existing>/downloads build/downloads
然后进行编译。这样将从下载代码中节省大量时间。
如果你在代码提取过程中遇到下载速度极慢的情况,则可以使用git代理来加快代码提取速度。
搜索一下git-proxy-wrapper,将找到各种方法来设置git协议的代理。
以下是~/bin中的一个包装示例,假设端口9054处有socks5代理:
- #!/bin/sh
- ## Use connect-proxy as git proxy wrapper which supports SOCKS5
- ## Install with `apt-get install connect-proxy`
- ## Use with `export GIT_PROXY_COMMAND=~/bin/git-proxy-wrapper`
- /usr/bin/connect -S localhost:9054 "$@"
然后,你可以运行export GIT_PROXY_COMMAND=~/bin/git-proxy-wrapper,现在将通过代理下载git代码。
devtool是Yocto中一个方便的实用程序,可以在本地目录中进行代码修改。典型用法是:
- # 要创建配方代码的本地副本并使用它进行编译:
- devtool modify <recipe>
- cd build/workspace/sources/<recipe> # 并做出代码修改
- bitbake obmc-phosphor-image # 编译修改的代码
-
- # 完成后,重置配方以忽略本地更改:
- devtool reset <recipe>
要使用这个工具,需要初始化构建环境,例如:. oe-init-build-env或者. setup romulus。上面的脚本会将<WORKDIR>/scripts/添加到您的PATH环境中,devtool就在路径中。
以下是真实的例子。
如果你想在ipmi中调试或添加新功能,你可能需要更改phosphor-host-ipmid中的代码。检查食谱,你知道这个存储库在phosphor-ipmi-host.bb中。下面是使用devtool在本地修改代码、编译和测试代码的步骤。
(1) 使用 devtool 创建本地存储库:
devtool modify phosphor-ipmi-host
devtool将存储库克隆到build/workspace/sources/phosphor-ipmi-host或者示例build/romulus/workspace/sources/phosphor-ipmi-host,创建并签出分支devtool。
(2) 在存储库中进行更改,例如添加代码以处理新的ipmi命令或简单地添加跟踪日志。
(3) 现在,你可以编译整个镜像或者单独编译ipmi配方:
- bitbake obmc-phosphor-image # 编译整个镜像
- bitbake phosphor-ipmi-host # 单独编译配方
(4) 通过刷新整个镜像或替换更改的二进制文件,来测试你修改的代码,。请注意,更改后的代码内置于 libapphandler.so 中,并由带内和带外 ipmi 守护程序使用。建议将更改的二进制文件复制到 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守护进程
- # 如果你想测试带外ipmi功能,你可以重启phosphor-ipmi-net.service
(5) 然后就可以测试你修改的代码了。
如果你想在Linux内核上工作,你也可以使用 devtool,但与常规存储库有一些不同。
注意:从ac72846提交开始开始,对于基于Aspeed的OpenBMC版本,Linux内核配方名称已更改为linux-aspeed。在以下示例中,如果修订版高于ac72846,请将linux-obmc替换为linux-aspeed。
(1) devtool不会创建“devtool”分支。相反,它会签出配方中指定的分支。例如,在OpenBMC v2.2标记上,linux-obmc_4.13.bb指定dev-4.13分支。
(2) 如果有补丁,devtool 会直接在分支上应用它们。
(3) devtool将defconfig和特定机型的配置复制到oe-workdir中。
(4) devtool基于上述配置生成.config文件。
你可以像往常一样修改代码并编译内核,如下所示:
bitbake linux-obmc -c build
如果您需要更改配置并将其保存为defconfig以供以后使用:
- bitbake linux-obmc -c menuconfig
- # 编辑配置,保存后生成 .config.new 作为新的内核配置
-
- bitbake linux-obmc -c savedefconfig
- # 它将把新的defconfig保存在 oe-workdir/linux-obmc-<version>/defconfig
编译完成后,可以通过把镜像刷到机器上来测试新内核,然而,刷镜像总是比较慢。
有一种更快的方法可以通过网络加载内核,这样就可以轻松地测试内核编译。
OpenBMC内核编译生成fit镜像,包括内核、dtb和initramfs。通常我们可以通过tftp加载,以Romulus为例:
(1) 将build/tmp/deploy/images/romulus/fitImage-obmc-phosphor-initramfs-romulus.bin或者示例/build/romulus/tmp/deploy/images/romulus/fitImage--6.6.16+git0+87832e937c-r0-romulus-20240312013659.bin放入tftp服务端,将其命名为fitImage
(2) 重启BMC,并不停的按ESC键,进入uboot shell
(3) 在uboot中:
- setenv ethaddr <mac:addr> # 如果mac地址不可用,则设置mac地址
- setenv ipaddr 192.168.0.80 # 设置BMC IP
- setenv serverip 192.168.0.11 # 设置tftp服务端IP
- tftp 0x83000000 fitImage # 将fit镜像加载到内存。在AST2400上使用0x43000000
- bootm 0x83000000 # 从fit镜像启动
然后,你将使用更新的内核运行OpenBMC。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。