BMC开发修改代码流程
BMC 代码修改以及镜像构建到版本发布流程过程。主要对devtool的使用总结流程:
devtool modify --> 编辑代码 --> devtool build --> devtool build-image --> 部署测试 --> devtool finish1.切换到项目目录
cd <project_name>/openbmc2.初始化编译环境
. setup <machine_name>3.将代码提取到专属工作区
需要将想要修改的软件包从 OpenBMC 庞大的源代码树中“提取”到你专属的工作区。devtool modify命令创建一个可编辑的工作副本在workspace/sources目录下
devtool modify <recipe_name>执行此命令后,devtool 会做两件事:
- 将指定软件包的源代码克隆到 workspace/sources/<recipe-name> 目录下。
- 在这个源代码目录里自动创建一个名为 devtool 的新分支,方便你管理自己的修改。
4.编写个和修改代码
现在你可以进入源代码目录,像进行普通软件开发一样修改代码了。
这个目录下的代码是一个独立的 Git 仓库。你可以自由地创建分支、提交更改。所有修改都只存在于你的 workspace 中,不会影响原始的软件包
cd workspace/sources/<recipe_name> # 在此使用你喜欢的编辑器或IDE进行代码修改 # ... 编辑代码 ...5.构建单个软件包快速验证
完成初步修改后,你可以先单独构建这个软件包,检查编译是否通过。
. setup <machine_name> devtool build <recipe_name>这个命令会调用 BitBake 只编译你修改的这个包及其依赖,比构建完整镜像快得多,适合快速验证代码是否有语法错误。
它的编译产物在 workspace/sources/bmcweb/oe-workdir/package/usr/bin 下。
也可以将这个 bin 文件下载下来直接去替换运行 BMC 机器上 /usr/bin 目录下的同名文件,然后添加可执行权限chmod +x <filename>, 重启该 bin 文件对应的服务。用systemctl | grep <key_words>找到服务名,执行systemctl restart <serve_name>重启服务。
6.将修改集成到完整 BMC 镜像中
当你确认单个软件包编译通过后,就需要将它集成到完整的 BMC 固件镜像里进行整体测试
# 构建包含你所有工作区修改的完整镜像 # <image-name> 通常是 obmc-phosphor-image (执行 . setup <machine_name> 时会输出镜像名) devtool build-image <image_name> # 也可以用 -p 参数指定要构建哪些 workspace/source 下面的包 devtool build-image -p <package1,package2,...> <image-name>这个命令在背后做了几件关键的事:
- 它会检测你 workspace 里所有修改过的软件包。
- 为目标镜像(如 obmc-phosphor-image)动态创建一个 .bbappend 文件,用于将你修改的软件包添加到镜像安装列表中。
- 最后调用 bitbake <image_name> 开始构建完整的 BMC 固件镜像。
构建成功后,你会在 tmp/deploy/images/<your_machine>/ 目录下找到生成的镜像文件(如 obmc-phosphor-image-<machine>.ubi.mtd)。
7.部署和测试
将新生成的镜像部署到你的 BMC 硬件或 QEMU 模拟器上进行测试。
有两种主要的测试方法:
- 完整镜像刷新 (适用于大版本测试):将步骤四生成的完整镜像文件(通常是 .ubi.mtd 或 .tar 文件)通过 flash-bmc 或 pflash 等工具刷新到 BMC 的 Flash 中。
- 快速更新单个软件包 (适用于小范围调试):如果只是为了验证一个服务的修改,可以只部署单个软件包。前提是你的 BMC 已经在运行且能通过网络访问。这个方法非常快,无需重启 BMC。
# <target> 是你的 BMC 的 IP 地址或主机名 devtool deploy-target <recipe_name> root@<bmc_ip>8.清理和固化你的修改
当测试通过,你的修改达到预期效果后,需要将更改最终确定下来。
# 1. 生成一个包含你所有修改的补丁文件 devtool finish <recipe_name> <layer_path> # <layer-path> 是你想将修改保存到的目标层,例如 meta-my-company这个 finish 命令会:
- 将你 workspace 中的修改(所有提交)生成一个或一系列补丁文件。
- 将这些补丁文件复制到指定的 Yocto 层(Layer)中,更新原始的 Recipe。
- 最后,它会将你的软件包从 devtool 的工作区中移除,完成整个开发循环。
