システム化されたUSERサービスのためのYoctoレシピ

システム化されたUSERサービスのためのYoctoレシピ

有効なシステムユーザーサービスを追加するためにyoctレシピを作成しようとしています。

問題は、サービスが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

systemdユーザーサービスは、次のようにYoctoで有効にできます。

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

関連情報