运行 图像中通过 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
我有一个 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