使用yocto启用systemd服务

use*_*878 10 bitbake yocto

嗨,这是我的图层树

??? conf
?   ??? layer.conf
??? COPYING.MIT
??? README
??? recipes-hello
    ??? helloworld
    ?   ??? helloworld-0.1
    ?   ?   ??? helloworld.c
    ?   ?   ??? helloworld.patch
    ?   ?   ??? newhelloworld.c
    ?   ??? helloworld_0.1.bb
    ??? message
    ?   ??? message-0.1
    ?   ?   ??? message.txt
    ?   ??? message_0.1.bb
    ??? service
        ??? service-0.1
        ?   ??? test_systemd.service
        ?   ??? test_systemd.sh
        ??? service_0.1.bb
Run Code Online (Sandbox Code Playgroud)

这里test_systemd.service是必须调用test_systemd.sh的服务文件,我试图使用service_0.1.bb来实现

    # This recipe performs the following tasks
    # 1) Install .sh file in /home/root/ and .sh script creates a random text file
    # 2) Install the .service file in systemd directory
    # 3) Invoke the .sh script via .service file
    inherit systemd

SUMMARY = "Install and start a systemd service"
SECTION = "examples"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"

#here we specify the source we want to build
SRC_URI = "file://test_systemd.sh"
SRC_URI += "file://test_systemd.service"
#here we specify the source directory, where we can do all the building and expect sources to be placed
S = "${WORKDIR}"

SYSTEMD_SERVICE_${PN} = "test_systemd.service"


#bitbake task
#created a directory /home/root for target install the script
do_install() {
             install -d ${D}/home/root
             install -m 0755 ${WORKDIR}/test_systemd.sh ${D}/home/root

             install -d ${D}{systemd_system_unitdir}
             install -m 0644 ${WORKDIR}/test_systemd.service ${D}{systemd_system_unitdir}
}

#Pack the path
FILES_${PN} += "/home/root"
FILES_${PN} += "/lib/systemd/system"

REQUIRED_DISTRO_FEATURES= "systemd"
Run Code Online (Sandbox Code Playgroud)

问题是当我尝试bitbake系统配方时,bitbake抛出一个错误,说找不到test_systemd.service.我设法在之前的尝试中安装了RFS中的两个文件,但是当我包含systemd概念时.我得到没有这样的文件错误.可能是什么原因 ?错误信息

 NOTE: Executing SetScene Tasks
NOTE: Executing RunQueue Tasks
ERROR: service-0.1-r0 do_package: SYSTEMD_SERVICE_service value test_systemd.service does not exist
ERROR: service-0.1-r0 do_package: Function failed: systemd_populate_packages
ERROR: Logfile of failure stored in: /home/guest/yocto_practice/poky/build-beaglebone/tmp/work/cortexa8hf-neon-poky-linux-gnueabi/service/0.1-r0/temp/log.do_package.2860
ERROR: Task (/home/guest/yocto_practice/meta-testlayer/recipes-hello/service/service_0.1.bb:do_package) failed with exit code '1'
NOTE: Tasks Summary: Attempted 514 tasks of which 506 didn't need to be rerun and 1 failed.

Summary: 1 task failed:
  /home/guest/yocto_practice/meta-testlayer/recipes-hello/service/service_0.1.bb:do_package
Summary: There were 2 ERROR messages shown, returning a non-zero exit code.
Run Code Online (Sandbox Code Playgroud)

这也是为systemd编写bb配方的正确方法,写这个的意义是什么

#Pack the path
    FILES_${PN} += "/home/root"
    FILES_${PN} += "/lib/systemd/system"
Run Code Online (Sandbox Code Playgroud)

没有这个bitbake抛出错误.

Jus*_*nen 12

SYSTEMD_SERVICE_${PN} += "file://test_systemd.service"
Run Code Online (Sandbox Code Playgroud)

这应该是:

SYSTEMD_SERVICE_${PN} = "test_systemd.service"
Run Code Online (Sandbox Code Playgroud)

其他说明(与错误无关):

  • 将东西安装到/ home可能不是一个好主意(你可以使用例如${libexecdir}其他脚本需要的脚本).
  • do_install_append()在bb文件中没有理由:你可以放入所有内容do_install()
  • 如果您的Yocto是最近的,使用${systemd_system_unitdir}而不是/lib/systemd/system一个好主意(在较旧的版本中${systemd_unitdir}/system/工作)

  • 您当前的配方引用了两次`$ {D} {systemd_system_unitdir}`.它应该是`$ {D} $ {systemd_system_unitdir}`.否则它在这里工作. (2认同)