web-dev-qa-db-fra.com

Activer les services systemd à l'aide de yocto

Salut c'est mon arbre de calque

├── 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

Ici test_systemd.service est le fichier de service qui doit invoquer test_systemd.sh, ce que j'essaie de réaliser en utilisant 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"

Le problème est que lorsque j'essaie de préparer une recette système bitbake, bitbake génère une erreur indiquant que test_systemd.service est introuvable. J'ai réussi à installer les deux fichiers dans RFS avec une tentative précédente mais quand j'inclus le concept systemd. J'obtiens aucune erreur de fichier. Quelle pourrait être la raison ? Message d'erreur

 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.

Est-ce également la bonne façon d'écrire une recette bb pour systemd et quelle est la signification de l'écriture de cette

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

sans ce bitbake jette une erreur.

9
user7345878
SYSTEMD_SERVICE_${PN} += "file://test_systemd.service"

Ce devrait être:

SYSTEMD_SERVICE_${PN} = "test_systemd.service"

Autres notes (sans rapport avec l'erreur):

  • Installer des choses dans/home n'est probablement pas une bonne idée (vous pouvez utiliser par exemple ${libexecdir} Pour les scripts dont d'autres scripts ont besoin.
  • il n'y a aucune raison d'avoir un do_install_append() dans un fichier bb: vous pouvez simplement tout mettre dans do_install()
  • Si votre Yocto est récent, utiliser ${systemd_system_unitdir} Au lieu de /lib/systemd/system Est une bonne idée (dans les anciennes versions, ${systemd_unitdir}/system/ Fonctionne)
12
Jussi Kukkonen

Afin de résoudre cette erreur d'emballage, j'ai utilisé l'étape d'installation suivante

do_install() {
   install -d ${D}${bindir}
   install -m 0755 ${WORKDIR}/test_systemd.sh ${D}${bindir}
   install -d ${D}${systemd_unitdir}/system
   install -m 0644 ${WORKDIR}/test_systemd.service ${D}${systemd_unitdir}/system
}
0
smokycookie