运行 图像中通过 systemd 服务的 yocto 包

run yocto package via systemd service in image

我有一个 yocto 图像,其中附加了我自己的包。我的食谱:

FILESEXTRAPATHS_append := ":${THISDIR}/../systemd/files"
inherit systemd
SRC_URI = "file://myserver.tar.gz"

SYSTEMD_AUTO_ENABLE = "enable"
SYSTEMD_SERVICE_${PN} = "serverAutoStart.service"

SRC_URI_append = " file://serverAutoStart.service"

FILES_${PN} += "${systemd_unitdir}/system/serverAutoStart.service"


do_compile() {
        make
}

#for myserver package
do_install() {
        install -m 0755 -d ${D}${bindir} ${D}${docdir}/myserver
        install -m 0644 ${S}//myserver ${D}${bindir}
}

#for systemd package
do_install_append() {
  install -d ${D}/${systemd_unitdir}/system
  install -m 0644 ${WORKDIR}/serverAutoStart.service ${D}/${systemd_unitdir}/system
}

在这个食谱中,我继承了一个 systemd class。我还有一个 systemd 服务,我需要在某些机器打开时自动执行 package myserver 。这个包在哪里,我如何从 systemd 单元执行它?(我需要使用什么 path in ExecStart)。

感谢您的回答!可能是你给我一些评论,因为我在这个领域相对较新

首先请注意,要使用systemd服务,您需要确保DISTRO_FEATURES中的systemd

检查:

bitbake -e (YOUR_IMAGE) | grep ^DISTRO_FEATURES=

因为 sysvinit 是默认的初始化管理器,请确保:

INIT_MANAGER = "systemd"

这是一个简单的 systemd 食谱示例 (meta-custom/recipes-example/systemd-example/):

  • files/example.服务
[Unit]
Description=Systemd Service Example
Before=basic.target

[Service]
Type=simple

# Put the path to the binary installed by do_install()
ExecStart=/usr/bin/example
ExecStop=/bin/killall example
ExecReload=/bin/killall example; /usr/bin/example

# These are optional, you can remove them, or
# read about systemd properties for more control
RemainAfterExit=yes
Restart=on-failure
RestartSec=30s

[Install]
WantedBy=basic.target
  • files/example.c

  • systemd-example_0.1.bb

SUMMARY = "Systemd example recipe"
DESCRIPTION = "Systemd service example for xxx"
LICENSE = "CLOSED"

SRC_URI = "file://example.c"
SRC_URI += "file://example.service"

S = "${WORKDIR}"

do_compile(){
    ${CC} ${CFLAGS} ${LDFLAGS} ${WORKDIR}/example.c -o ${WORKDIR}/example
}

do_install(){
    install -d ${D}/usr/bin

    # Install the binary
    install -m 0744 ${WORKDIR}/example ${D}/usr/bin

    # Install systemd stuff
    install -d ${D}${systemd_unitdir}/systemd
    install -m 0644 ${WORKDIR}/example.service ${D}${systemd_unitdir}/systemd
}

# Systemd class stuff
inherit systemd
NATIVE_SYSTEMD_SUPPORT = "1"
SYSTEMD_SERVICE_${PN} = "example.service"

不需要SYSTEMD_AUTO_ENABLE = "enable",因为它默认启用。

更新

现在,通过以下方式将食谱添加到您的图像中:

IMAGE_INSTALL_append = " systemd-example"

将该行放入您的自定义图像配方或 local.conf 中进行测试。

当你构建镜像时你会发现/usr/sbin/example,它会被systemd服务自动执行example.service,检查状态:

systemctl status example