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
相关产品推荐
相关产品推荐

