我正在尝试创建 yocto 配方,以便添加启用 systemd 用户服务。
问题是,由于该服务安装在 systemd/user 中,因此使用 bitbake 我收到此错误:
错误:mediumlevel-service-1.0-r0 do_package:SYSTEMD_SERVICE_mediumlevel-service 值mediumlevel.service 不存在
我的食谱是:
SUMMARY = "Launch mediumlevel at boot"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
inherit systemd
SRC_URI = "file://mediumlevel.service \
"
S = "${WORKDIR}"
SYSTEMD_SERVICE_${PN} = "mediumlevel.service"
do_install() {
install -d ${D}${systemd_user_unitdir}
install -m 0644 ${WORKDIR}/mediumlevel.service ${D}${systemd_user_unitdir}
}
FILES_${PN} += "/usr/lib/systemd/user"
REQUESTED_DISTRO_FEATURES = "systemd"
你怎么认为?
谢谢!
答案1
systemd.bbclass 只关心系统服务而不关心用户服务。
我想你必须做这样的事情:
删除 SYSTEMD_SERVICE_${PN} 变量
FILES_${PN} += "${systemd_user_unitdir}"
pkg_postinst_${PN} () {
#!/bin/sh -e
OPTS=""
if [ -n "$D" ]; then
OPTS="--root=$D"
fi
systemctl ${OPTS} --user enable mediumlevel.service
}
也许您甚至需要删除该inherit systemd
行,因为该类设置了 pkg_postinst。
答案2
我不知道答案是否仍然与您相关,但无论如何我想把它放在这里。
我相信您的问题来自安装步骤和软件包的文件。我可以看到您尝试在该文件夹上安装该服务,但这似乎不适用于 Yocto。您需要提供文件名和文件夹。 FILE_${PN} 上也是如此。这个食谱应该效果更好:
SUMMARY = "Launch mediumlevel at boot"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
inherit systemd
SRC_URI = "file://mediumlevel.service \
"
S = "${WORKDIR}"
SYSTEMD_SERVICE_${PN} = "mediumlevel.service"
do_install() {
install -d ${D}${systemd_user_unitdir}
install -m 0644 ${WORKDIR}/mediumlevel.service ${D}${systemd_user_unitdir}/mediumlevel.service
}
FILES_${PN} += "${systemd_user_unitdir}/mediumlevel.service"
REQUESTED_DISTRO_FEATURES = "systems"
我希望它可以帮助您或其他人:)
答案3
可以通过以下方式在 Yocto 中启用 systemd 用户服务:
inherit systemd
SRC_URI = "file://mediumlevel.service"
do_install() {
install -d ${D}${systemd_user_unitdir}
install -m 0644 ${S}/mediumlevel.service ${D}${systemd_user_unitdir}
}
pkg_postinst:${PN}() {
mkdir -p $D${sysconfdir}/systemd/user/default.target.wants
ln -s ${systemd_user_unitdir}/mediumlevel.service $D${sysconfdir}/systemd/user/default.target.wants/mediumlevel.service
}
该方法相当于在目标设备上运行:
systemctl --global enable mediumlevel.service