#linux #yocto #systemd #bitbake #recipe
Вопрос:
У меня есть изображение 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. У меня также есть служба systemd, которая мне нужна для автоматического выполнения пакета myserver
, когда какая-то машина включена. Где находится этот пакет и как я могу выполнить его из блока systemd?(Что path in ExecStart
мне нужно использовать).
Спасибо за ваши ответы! Может быть, вы дадите мне несколько замечаний, потому что я относительно новичок в этой области
Комментарии:
1. Можете ли вы перефразировать свой вопрос и сделать его более ясным? Я не совсем понимаю, о чем вы спрашиваете.
2. @Alexandrkravchuk Я просто хочу запустить двоичный файл
myserver
из блока systemd, и я не знаю, где находится этот пакет(myserver) на моем изображении. Дело в том, что я прошью какое-нибудь устройство с моим пользовательским изображением, и мне нужно будет выполнить пакет yocto, когда это устройство включено3. вы добавили пакет к изображению?
IMAGE_INSTALL
4. @Alexandrkravchuk, спасибо за ответ. Да, и у меня есть мой
server
пакет в tmp/deploy/images/lt;файл манифестаgt;. Но где будет сам двоичный файл, когда я прошью устройство с этим изображением? Может быть, я что-то упустил
Ответ №1:
Прежде всего, обратите внимание, что для использования службы systemd вам необходимо убедиться, что systemd
в DISTRO_FEATURES
.
уточните у:
bitbake -e (YOUR_IMAGE) | grep ^DISTRO_FEATURES=
Поскольку sysvinit
по умолчанию используется диспетчер инициализации, убедитесь, что:
INIT_MANAGER = "systemd"
Вот простой systemd
пример рецепта ( meta-custom/recipes-example/systemd-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
- файлы/пример.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
Комментарии:
1. Большое спасибо! Правильно ли я понял: когда я создам свой пользовательский образ и флэш-устройство с этим изображением, мой двоичный файл(пример) будет находиться в каталоге usr/bin этого устройства?
2. Проверьте мое ОБНОВЛЕНИЕ в ответе
3. Большое вам спасибо! Вы действительно помогли мне разобраться во многих вещах, когда писали индивидуальный рецепт.