systemd USER 服务的 Yocto 配方

systemd USER 服务的 Yocto 配方

我正在尝试创建 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

相关内容