запустить initscript с помощью systemd при запуске с помощью yocto

Я хочу настроить собственный сценарий инициализации для запуска при запуске в образе с yocto, я следил за правильный ответ здесь - это то же самое, что я хочу - и поскольку я использую версию pyro, я устанавливаю эти переменные в файле local.conf, как указано в документации

DISTRO_FEATURES_append = "systemd"

VIRTUAL-RUNTIME_init_manager = "systemd"

DISTRO_FEATURES_BACKFILL_CONSIDERED = "sysvinit"

VIRTUAL-RUNTIME_initscripts = ""

Проблема в том, что initscript.service не вызывается при загрузке системы, и я не нахожу ничего в / var / log / messages, несмотря на то, что скрипт и служебный файл переданы, а systemd существует.

Я также пробовал использовать эту опцию в качестве замены init в yocto

pkg_postinst_keyfile() { #where keyfile is a recipe is added to IMAGE_INSTALL_append
    if [ x"$D" = "x" ]; then
      logger "key file is added"
    else
      exit 1
    fi
}

И снова, я не могу найти в журналах выражение «ключевой файл добавлен», несмотря на то, что рецепт выполнен, и ключевой файл передается в изображение, как и ожидалось из рецепта.

Итак, что-то не так с правильным ответом? Я вижу это хорошо, но не знаю, в чем проблема. А может ли кто-нибудь дать мне наглядный пример выполнения эквивалента с помощью Винита?

Целевая машина - qemux86-64.

Рецепты

У меня есть слой, который называется meta-mylayer, его дерево:

conf / layer.conf

recipes-core / mylayer-initscript / (как описано в приведенной выше ссылке)

recipes-core / images / apt-image.bb

apt-image - это изображение, созданное мной выше core-minimal, и его содержание

    SUMMARY = "An image which add the support of using deb package management"

inherit core-image
include recipes­core/images/core­-image-­minimal.bb

IMAGE_FEATURES += "package-management"
IMAGE_INSTALL_append = "gnupg coreutils keyfile initscript"

IMAGE_LINGUA = " "

LICENSE = "MIT"

IMAGE_ROOTFS_SIZE ?= "16192"


PACKAGE_FEED_URIS = "http://<public ip here>/my-repo/yahia-repo/expiremental \"
PACKAGE_FEED_BASE_PATHS = "deb"
PACKAGE_FEED_ARCHS = "all"

pkg_postinst_keyfile() {
    if [ x"$D" = "x" ]; then
      logger "key file is added"
    else
      exit 1
    fi
}

рецепт initscript и все файлы такие же, как указано в ссылке, без изменений.

если вас интересует рецепт ключевого файла, вот он

#
# The goal of this recipe is to move keyFile to target machine so it can be used as public key for 
# authoriztion of deb repo.
#
# Author: Yahia Farghaly

SUMMARY = "Move keyFile example to /deb_key"
SECTION = "examples"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"

SRC_URI = "file://keyFile \
           file://sources.list"

#to inform yocto where to package the file
FILES_${PN} += " /deb_key"

S = "${WORKDIR}"


do_install() {
         install -d ${D}/deb_key
         install -m 0755 keyFile ${D}/deb_key
}

И, конечно же, я делаю bitbake apt-image

служебный скрипт

[Unit]
Description=start initscript upon first boot

[Service]
Type=simple
ExecStart=/bin/sh -c 'sleep 5 ; /usr/sbin/initscript.sh'

initscript.h

#!/bin/sh

logger "starting initscript"

# do some work here. Mount rootfs as rw if needed.

logger "initscript work done"
echo "hi yahia" > /deb_key/hello

я не уверен, что результатом rootfs yocto является rw по умолчанию или только r?

рецепт initscript

SUMMARY = "Initial boot script"
DESCRIPTION = "Script to do any first boot init, started as a systemd service which removes itself once finished"
LICENSE = "CLOSED"
PR = "r3"

SRC_URI =  " \
    file://initscript.sh \
    file://initscript.service \
"

inherit allarch systemd

NATIVE_SYSTEMD_SUPPORT = "1"
SYSTEMD_PACKAGES = "${PN}"
SYSTEMD_SERVICE_${PN} = "initscript.service"

do_compile () {
}

do_install () {
    install -d ${D}/${sbindir}
    install -m 0755 ${WORKDIR}/initscript.sh ${D}/${sbindir}

    install -d ${D}${systemd_unitdir}/system/
    install -m 0644 ${WORKDIR}/initscript.service ${D}${systemd_unitdir}/system
}

person Yahia Farghaly    schedule 02.09.2017    source источник
comment
Вы можете поделиться своим рецептом?   -  person Jussi Kukkonen    schedule 02.09.2017
comment
Вы не показали рецепт, который фактически устанавливает служебный файл (который, как я понял, был причиной проблемы), или сам служебный файл. Что касается альтернативного метода, я не уверен, будет ли postinst работать в рецепте изображения, обычно он определяется в рецепте, который создает пакет, для которого предназначена функция postinst.   -  person Jussi Kukkonen    schedule 03.09.2017
comment
@jku хорошо, я их поставил   -  person Yahia Farghaly    schedule 03.09.2017
comment
Вы проверяли статус службы systemd после загрузки? Я почти уверен, что ExecStart не может содержать несколько команд, если Type = simple.   -  person Jussi Kukkonen    schedule 04.09.2017
comment
Кроме того, требуется ли WantedBy (в разделе «Установка» служебного файла) для автоматического запуска службы?   -  person Jussi Kukkonen    schedule 04.09.2017
comment
@jku, я сделал то, что хотел, с pkg_postinst _ $ {PN}, и, как вы сказали, это сработало для рецепта пакета, а не изображения. не уверен, что хотел   -  person Yahia Farghaly    schedule 04.09.2017


Ответы (1)


У меня работает со следующим изменением служебного скрипта.

[Unit]
Description=start initscript upon first boot

[Service]
Type=simple
ExecStart=/bin/sh -c 'sleep 5 ; /usr/sbin/initscript.sh'

[Install]
WantedBy=multi-user.target
person Clemens_neubau    schedule 11.10.2017