You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Yocto配方添加systemd服务时rootfs缺失及配置报错咨询

Yocto配方systemd服务配置问题修复

存在的核心问题

  • 语法错误:do_install函数缺少闭合右大括号},导致后续定义的SYSTEMD_SERVICE被识别为函数内部逻辑,不会被bitbake全局解析生效,systemd类无法读取该配置,自然不会处理服务文件打包逻辑
  • 变量位置错误:SYSTEMD_SERVICE必须定义为全局变量,不能放在任务函数内部,且需要搭配FILES:${PN}明确指定服务文件的安装路径,否则bitbake会将未列入打包列表的服务文件判定为遗漏文件丢弃,不会进入最终rootfs
  • 遗漏二进制安装逻辑:现有代码中只创建了${bindir}目录,未将编译生成的二进制程序安装到该目录,若实际环境中二进制正常则为粘贴代码时遗漏
  • 之前将SYSTEMD_SERVICE移到do_install前报错,是因为systemd类检查时未找到对应服务文件的打包配置,补全规则后即可解决
  • 较新Yocto版本(3.4 Honister及之后)推荐使用带包名覆盖的SYSTEMD_SERVICE:${PN}、SYSTEMD_AUTO_ENABLE:${PN}写法,避免多包场景下的变量冲突

修正后的完整配方代码

SUMMARY = "Henhouse Management Application"
SECTION = ""
LICENSE = "MIT"

inherit pkgconfig cmake systemd

SRC_URI = "git://github.com/pblxptr/hhctrl-mgmt.git;protocol=https;tag=master"
SRC_URI:append = " file://hhctrl-mgmt.service"
LIC_FILES_CHKSUM = "file://LICENSE;md5=6f6c3b7faa0513f8653c977c58af38f5"

S = "${WORKDIR}/git"

DEPENDS += "boost curl spdlog fmt"
EXTRA_OECMAKE = ""

# systemd相关全局配置,必须放在任务定义之前
SYSTEMD_SERVICE:${PN} = "hhctrl-mgmt.service"
SYSTEMD_AUTO_ENABLE:${PN} = "enable"
# 明确指定服务文件要打包进主包
FILES:${PN} += "${systemd_system_unitdir}/hhctrl-mgmt.service"

do_install () {
  # 安装编译生成的二进制文件,替换为实际生成的二进制文件名
  install -m 0755 -d ${D}${bindir}
  install -m 0755 ${B}/hhctrl-mgmt ${D}${bindir}/

  # 安装systemd服务文件
  install -d ${D}/${systemd_system_unitdir}
  install -m 0644 ${WORKDIR}/hhctrl-mgmt.service ${D}/${systemd_system_unitdir}
}

如果你使用的是3.4版本之前的旧版Yocto,将变量名中的冒号:替换为下划线_即可兼容,例如SYSTEMD_SERVICE_${PN}、FILES_${PN}、SRC_URI_append。

内容的提问来源于stack exchange,提问作者bielu000

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 21:36:06