使用 OpenBMC SDK 实现 "Hello World"
使用 OpenBMC 的 SDK 实现 hello word
内容: 从头开始编译汇编并在 QEMU
中运行 OpenBMC
应用
受众: 完成开发环境设置 配置文档
克隆并构建一个仓库
本文档使用 openbmc/phosphor-state-manager 仓库。为了保证你的仓库组织结构,将它们放到一个通用的目录下,比如 ~/Code/
下。
- 克隆仓库
git clone https://github.com/openbmc/phosphor-state-manager.git
- 添加打印
Hello World
代码
在添加代码后,你的cd phosphor-state-manager vi bmc_state_manager_main.cpp
diff
看起来会像如下+#include <iostream> int main(int argc, char**) { @@ -17,6 +18,8 @@ int main(int argc, char**) bus.request_name(BMC_BUSNAME); + std::cout<<"Hello World" <<std::endl; + while (true) {
- 编译仓库
这个仓库是基于meson
,因此执行如下命令meson build ninja -C build
将应用载入到 QEMU
中
- 瘦身生成的内容
OpenBMC
是一个嵌入式环境,因此最好载入最小的应用/二进制文件arm-openbmc-linux-gnueabi-strip phosphor-bmc-state-manager
- 为你的应用创建一个安全的文件系统
现在是时候载入你的Hello World
应用到QEMU
虚拟环境中了。OpenBMC
覆写PATH
变量,来使其首先查看/usr/local/bin/
中的内容,因此,只需简单的scp
你的应用到/usr/loacl/bin
中,运行它就可以了。这在命令行测试下十分有效,但是当你想要通过systemd
服务启动你的应用时,将会遇到问题,因为应用路径在服务文件是硬编码的。让我们看看专业人员如何操作,创建一个叠加文件系统。叠加将会节省你的时间与精力。不再需要重命名、恢复原始文件,不再有遗忘你在debug
过程中使用的文件,因此,也不再需要搭建你的系统。登录到QEMU
示例,然后运行这些命令。 scp
这个二进制文件到QEMU
实例
如果你启动QEMU
时,使用了默认端口,那么如下命令可以直接在你的phosphor-state-manager
目录下执行,如果你选择你自己的端口,那么使用自己的端口号替换默认端口2222
:scp -P 2222 phosphor-bmc-state-manager root@127.0.0.1:/usr/bin/
在 QEMU
中运行应用
- 终止
BMC
的状态管理服务systemctl stop xyz.openbmc_project.State.BMC.service
- 在
QEMU
会话中运行你的应用
你将会看到你的phosphor-bmc-state-manager
Hello World
打印信息。按下^C
终止这个应用。这不是你测试新应用的正规方法。一般应该使用systemd
服务 - 通过
systemd
服务启动应用
OpenBMC
使用systemd
来管理它的应用。后面会有相关的教程,现在,只需要简单的运行如下的命令来重启BMC
状态管理服务,来查看它是否有使用你的新的应用:
因为systemctl restart xyz.openbmc_project.State.BMC.service
systemd
启动了你的服务,Hello World
不会打印到你的终端中,但是这些内容会出现在日志中。在后面的教程中会具体讨论日志相关内容,现在只需要简单运行如下命令:
在其中的一条日志中会看到类似下面的内容:journalctl | tail
<date> romulus phosphor-bmc-state-manager[1089]: Hello World
到此就结束了!你定制化一个 BMC
应用,使用 SDK 编译它,并在 QEMU
中运行了它!