如何在使用Buildroot制作Linux镜像时添加自定义服务
操作步骤
前提配置
首先确认Buildroot已启用systemd作为init系统:
- 执行
make menuconfig进入配置界面 - 定位到
System configuration -> Init system,选择systemd - 保存配置后退出
方案1:RootFS Overlay 快速集成
适合应用无复杂依赖、需要快速验证的场景,无需编写Buildroot包配置:
- 自定义overlay路径:在
System configuration -> Root filesystem overlay directories填写你要使用的overlay目录路径,例如board/<你的板卡型号>/overlay - 放置编译好的C++二进制:将用Buildroot交叉编译器编译好的二进制文件放入overlay的
usr/bin/目录下,赋予执行权限:mkdir -p board/<你的板卡型号>/overlay/usr/bin cp your_app board/<你的板卡型号>/overlay/usr/bin/ chmod +x board/<你的板卡型号>/overlay/usr/bin/your_app - 编写systemd服务文件,命名为
your_app.service,参考内容:[Unit] Description=Custom C++ application service After=network.target [Service] ExecStart=/usr/bin/your_app Restart=always User=root [Install] WantedBy=multi-user.target - 放置服务文件到overlay对应目录:
mkdir -p board/<你的板卡型号>/overlay/usr/lib/systemd/system cp your_app.service board/<你的板卡型号>/overlay/usr/lib/systemd/system/ - 配置开机自启:创建自启软链接到overlay目录
mkdir -p board/<你的板卡型号>/overlay/etc/systemd/system/multi-user.target.wants ln -s /usr/lib/systemd/system/your_app.service board/<你的板卡型号>/overlay/etc/systemd/system/multi-user.target.wants/your_app.service - 正常执行
make编译镜像即可,烧录后服务会随系统自动启动。
方案2:自定义Buildroot包(推荐长期维护)
适合应用有依赖、需要和Buildroot统一编译流程的场景:
- 在Buildroot源码的
package/目录下新建应用包目录:mkdir package/your_app - 新建
package/your_app/Config.in文件,内容参考:config BR2_PACKAGE_YOUR_APP bool "your_app" depends on BR2_INSTALL_LIBSTDCPP help Custom C++ service application. - 新建
package/your_app/your_app.mk文件,内容参考:YOUR_APP_VERSION = 1.0 # 本地源码路径,若使用git托管可替换为git地址,同时修改SITE_METHOD为git YOUR_APP_SITE = /path/to/your/app/source YOUR_APP_SITE_METHOD = local YOUR_APP_DEPENDENCIES = libstdcpp # 有其他依赖可在此处追加 YOUR_APP_INSTALL_STAGING = NO define YOUR_APP_BUILD_CMDS # 若应用使用Makefile/CMake构建,可直接调用$(MAKE) -C $(@D) $(TARGET_CXX) $(TARGET_CFLAGS) $(TARGET_LDFLAGS) -o $(@D)/your_app $(@D)/main.cpp endef define YOUR_APP_INSTALL_TARGET_CMDS $(INSTALL) -D -m 0755 $(@D)/your_app $(TARGET_DIR)/usr/bin/your_app $(INSTALL) -D -m 0644 $(YOUR_APP_PKGDIR)/your_app.service $(TARGET_DIR)/usr/lib/systemd/system/your_app.service endef define YOUR_APP_INSTALL_INIT_SYSTEMD mkdir -p $(TARGET_DIR)/etc/systemd/system/multi-user.target.wants ln -sf /usr/lib/systemd/system/your_app.service $(TARGET_DIR)/etc/systemd/system/multi-user.target.wants/your_app.service endef $(eval $(generic-package)) - 将之前编写的
your_app.service文件放入package/your_app/目录下 - 修改
package/Config.in,在合适的分类下追加一行:source "package/your_app/Config.in" - 执行
make menuconfig,在Target packages分类下找到your_app并勾选 - 执行
make编译镜像即可。
验证
镜像烧录启动后,执行systemctl status your_app.service,若输出显示active (running)则配置生效。
内容的提问来源于stack exchange,提问作者AlexB
相关产品推荐
相关产品推荐

