当前位置:   article > 正文

OpenBMC文档2:OpenBMC备忘录_openbmc的官方文档怎么看

openbmc的官方文档怎么看

这篇文档是基于OpenBMC官方的cheatsheet.md进行翻译和完善的,因为原文内容撰写的时间比较久了,需要进行更新,本文中做了适当的更新。如果读者有更好的建议,可以留下评论,我这边尽量再根据建议进行内容完善。

本文档旨在为常见的OpenBMC定制任务提供一组配方,而无需了解完整的yocto构建过程。

1. 使用本地内核编译

内核配方在:

 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中的最新提交。

2. 编译Romulus

Romulus的目标是romulus。

  1. $ cd openbmc
  2. $ . setup romulus
  3. $ bitbake obmc-phosphor-image

3. 编译指定配置的机器

如果想编译的系统包含不同的机器配置:

  1. meta-<layer>/meta-<system>/conf/machine/machineA.conf
  2. meta-<layer>/meta-<system>/conf/machine/machineB.conf

可以将机器名称传递给setup程序,来指定要编译的机器配置。

  1. $ cd openbmc
  2. $ . setup machineB
  3. $ bitbake obmc-phosphor-image

4. 编译OpenBMC SDK

你正在寻找一种方法来编译“ARM”程序,但要在“PPC”或“x86”系统上运行?你可以编译sdk接收fakeroot环境。

  1. $ bitbake -c populate_sdk obmc-phosphor-image
  2. $ ./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

5. 重新编译和重新配置

可以通过删除build/conf目录来重新配置程序编译:

rm -rf build/conf

或者

rm -rf build/machineName

并再次运行setup命令。

6. 有用的D-Bus CLI工具

6.1 busctl

这是一个可以通过cli发出D-Bus命令的好工具。这样,就不必等待代码到达系统上的路径。也非常适合使用QEMU运行命令。

运行方式:

busctl call <path> <interface> <object> <method> <parameters>

<parameters>示例:sssay "t1" "t2" "t3" 2 2 3

7. 使用QEMU

QEMU有一个palmetto-bmc机器(从v2.6.0开始),它实现了启动Linux内核的核心设备。OpenBMC还维护了一棵树,其中包含上游的补丁或临时work-arounds方案,以在适当的情况下扩展QEMU的功能。

  1. qemu-system-arm -m 256 -M palmetto-bmc -nographic \
  2. -drive file=<path>/flash-palmetto,format=raw,if=mtd \
  3. -net nic \
  4. -net user,hostfwd=:127.0.0.1:2222-:22,hostfwd=:127.0.0.1:2443-:443,hostname=qemu

如果出现错误,你可能需要编译QEMU(请参阅本文档中的编译QEMU的章节)。如果没有错误并且QEMU启动,只需在与BMC交互时更改端口。

  1. curl -c cjar -b cjar -k -H "Content-Type: application/json" \
  2. -X POST https://localhost:2443/login -d "{\"data\": [ \"root\", \"0penBmc\" ] }"

或者

ssh -p 2222 root@localhost

要退出,请输入Ctrl+a+c切换到QEMU监视器,然后输入quit退出。或者尝试输入Ctrl+a+x退出。

8. 编译QEMU

  1. git clone https://github.com/openbmc/qemu.git
  2. cd qemu
  3. git submodule update --recursive
  4. mkdir build
  5. cd build
  6. ../configure --target-list=arm-softmmu --enable-slirp
  7. make

编译期间可能会报错,可以尝试更新pip,安装一些依赖包,例如:

  1. pip3 install --upgrade pip
  2. sudo apt install ninja-build
  3. sudo apt install libglib2.0-dev

编译的文件位于:arm-softmmu/qemu-system-arm

8.1 使用桥接设备

使用桥接设备需要root权限进行设置。好处是qemu会话在网桥子网中运行,因此不需要端口转发。需要一些软件包作为virbr0,例如:

  1. apt-get install libvirt libvirt-bin bridge-utils uml-utilities qemu-system-common
  2. qemu-system-arm -m 256 -M palmetto-bmc -nographic \
  3. -drive file=<path>/flash-palmetto,format=raw,if=mtd \
  4. -net nic,macaddr=C0:FF:EE:00:00:02,model=ftgmac100 \
  5. -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

9. 启动主机

登录:

curl -c cjar -k -X POST -H "Content-Type: application/json" -d '{"data": [ "root", "0penBmc" ] }' https://${bmc}/login

连接到主机控制台:

ssh -p 2200 root@bmc

开机:

  1. curl -c cjar -b cjar -k -H "Content-Type: application/json" -X PUT \
  2. -d '{"data": "xyz.openbmc_project.State.Host.Transition.On"}' \
  3. https://${bmc}/xyz/openbmc_project/state/host0/attr/RequestedHostTransition

10. GDB调试

SDK编译提供了GDB和调试符号:

(1) 配置好SDK环境后,即可使用$GDB

(2) 调试符号位于每个可执行文件的.debug/目录中。

使用GDB:

(1) 设置SDK环境;

(2) 运行以下GDB命:

  1. cd <sysroot_of_sdk_build>
  2. $GDB <relative_path_to_exeutable> <path_to_core_file>

11. Coredump

默认情况下,在OpenBMC中禁用coredump。启用coredump的方式:

  1. echo '/tmp/core_%e.%p' | tee /proc/sys/kernel/core_pattern
  2. ulimit -c unlimited

12. 清理读写文件系统的变更

你可能需要调查哪些文件是通过覆盖rwfs持久化的。为此,可以列出此路径,然后删除那些原始文件,或者删除覆盖以恢复文件。

/run/initramfs/rw/cow/

13. 编译

13.1 分享downloads目录

编译OpenBMC的第一个版本需要很长时间。它从互联网上下载各种存储库。

检查build/downloads或者示例build/romulus/downloads,以查看所有下载的存储库。

(1) 如果存储库是单个存档,则通常如下所示:

  1. zlib-1.2.11.tar.xz // 存储库本身
  2. zlib-1.2.11.tar.xz.done // 指示存储库已下载的标志

(2) 如果存储库由git管理,它通常如下所示:

  1. git2/github.com.openbmc.linux // git 裸克隆
  2. 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

然后进行编译。这样将从下载代码中节省大量时间。

14. 使用git代理

如果你在代码提取过程中遇到下载速度极慢的情况,则可以使用git代理来加快代码提取速度。

搜索一下git-proxy-wrapper,将找到各种方法来设置git协议的代理。

以下是~/bin中的一个包装示例,假设端口9054处有socks5代理:

  1. #!/bin/sh
  2. ## Use connect-proxy as git proxy wrapper which supports SOCKS5
  3. ## Install with `apt-get install connect-proxy`
  4. ## Use with `export GIT_PROXY_COMMAND=~/bin/git-proxy-wrapper`
  5. /usr/bin/connect -S localhost:9054 "$@"

然后,你可以运行export GIT_PROXY_COMMAND=~/bin/git-proxy-wrapper,现在将通过代理下载git代码。

15. devtool

devtool是Yocto中一个方便的实用程序,可以在本地目录中进行代码修改。典型用法是:

  1. # 要创建配方代码的本地副本并使用它进行编译:
  2. devtool modify <recipe>
  3. cd build/workspace/sources/<recipe> # 并做出代码修改
  4. bitbake obmc-phosphor-image # 编译修改的代码
  5. # 完成后,重置配方以忽略本地更改:
  6. devtool reset <recipe>

要使用这个工具,需要初始化构建环境,例如:. oe-init-build-env或者. setup romulus。上面的脚本会将<WORKDIR>/scripts/添加到您的PATH环境中,devtool就在路径中。

以下是真实的例子。

15.1 提取并修改ipmi代码

如果你想在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配方:

  1. bitbake obmc-phosphor-image # 编译整个镜像
  2. bitbake phosphor-ipmi-host # 单独编译配方

(4) 通过刷新整个镜像或替换更改的二进制文件,来测试你修改的代码,。请注意,更改后的代码内置于 libapphandler.so 中,并由带内和带外 ipmi 守护程序使用。建议将更改的二进制文件复制到 BMC,因为这样更易于测试:

  1. # 替换libapphandler.so.0.0.0
  2. 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/
  3. systemctl restart phosphor-ipmi-host.service # 重启带内ipmi守护进程
  4. # 如果你想测试带外ipmi功能,你可以重启phosphor-ipmi-net.service

(5) 然后就可以测试你修改的代码了。

16. 开发Linux内核

16.1 提取Linux内核代码

如果你想在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

16.2 修改配置

如果您需要更改配置并将其保存为defconfig以供以后使用:

  1. bitbake linux-obmc -c menuconfig
  2. # 编辑配置,保存后生成 .config.new 作为新的内核配置
  3. bitbake linux-obmc -c savedefconfig
  4. # 它将把新的defconfig保存在 oe-workdir/linux-obmc-<version>/defconfig

16.3 测试Linux内核

编译完成后,可以通过把镜像刷到机器上来测试新内核,然而,刷镜像总是比较慢。

有一种更快的方法可以通过网络加载内核,这样就可以轻松地测试内核编译。

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中:

  1. setenv ethaddr <mac:addr> # 如果mac地址不可用,则设置mac地址
  2. setenv ipaddr 192.168.0.80 # 设置BMC IP
  3. setenv serverip 192.168.0.11 # 设置tftp服务端IP
  4. tftp 0x83000000 fitImage # 将fit镜像加载到内存。在AST2400上使用0x43000000
  5. bootm 0x83000000 # 从fit镜像启动

然后,你将使用更新的内核运行OpenBMC。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/405502
推荐阅读
  

闽ICP备14008679号