запустите пакет yocto через службу systemd в образе

#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. Большое вам спасибо! Вы действительно помогли мне разобраться во многих вещах, когда писали индивидуальный рецепт.