This service is available only in Japanese-language.
よろしくお願いいたします。
現在 yocto kirkstone 上にて raspberry pi cm4 のOSイメージを構築しております。その中で、OS起動時にある処理を行った後にmonit(これは例です)を起動したいという要望があったとします。
yocto warrior を使用していたときは、以下レシピ(monit-startup-cansel.bb)を作成し、core-image-base.bbappendを別途用意し、そこで「IMAGE_INSTALL:append = " monit"」「IMAGE_INSTALL:append = " monit-startup-cansel"」を記述して対処しました。
※initはsysVinitを選択しております。
--------
DESCRIPTION = "monit startup cansel"
SUMMARY = "Custom recipe : monit startup cancel"
SECTION = "PRIVATE"
LICENSE = "CLOSED"
PR = "r0"
LIC_FILES_CHKSUM = "file:///${COMMON_LICENSE_DIR}/eCos-2.0;md5=8c3ea41d02fa9c9253c692351e5940e7"
FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
inherit autotools update-rc.d
PACKAGES = "monit-startup-cansel"
RDEPENDS_${PN} = "initscripts monit"
FILES_${PN} += "${sysconfdir}/init.d/monit"
SRC_URI += ""
INITSCRIPT_PACKAGES = "monit-startup-cansel"
INITSCRIPT_NAME_monit-startup-cansel = "monit"
INITSCRIPT_PARAMS_monit-startup-cansel = "remove"
do_compile() {
:
}
pkg_postinst_ontarget_${PN}() {
:
}
do_install() {
install -d ${D}${sysconfdir}/init.d
bbnote "monit-startup-cansel.bb : do_install is complite."
}
--------
yocto kirkstone でも引き続き同じことをしたく、以下の対応レシピを用意しました(のちにautotoolsをinheritする必要はないなと思いましたのでここでは消してあります)。
--------
DESCRIPTION = "monit startup cansel"
SUMMARY = "Custom recipe : monit startup cancel"
SECTION = "PRIVATE"
LICENSE = "CLOSED"
PR = "r0"
LIC_FILES_CHKSUM = "file:///${COMMON_LICENSE_DIR}/eCos-2.0;md5=8c3ea41d02fa9c9253c692351e5940e7"
FILESEXTRAPATHS:prepend := "${THISDIR}/files:"
inherit update-rc.d
PACKAGES = "monit-startup-cansel"
RDEPENDS:${PN} = "initscripts monit"
FILES:${PN} += "${sysconfdir}/init.d/monit"
SRC_URI += ""
INITSCRIPT_PACKAGES = "monit-startup-cansel"
INITSCRIPT_NAME:${PN} = "monit"
INITSCRIPT_PARAMS:${PN} = "remove"
do_install() {
install -d ${D}${sysconfdir}/init.d
bbnote "monit-startup-cansel.bb : do_install is complite."
}
--------
すると、以下のエラーが発生し bitbake が失敗しました。
--------
WARNING: core-image-base-1.0-r0 do_rootfs: monit-startup-cansel.postinst returned 1, marking as unpacked only, configuration required on target.
ERROR: core-image-base-1.0-r0 do_rootfs: Postinstall scriptlets of ['monit-startup-cansel'] have failed. If the intention is to defer them to first boot,
then please place them into pkg_postinst_ontarget:${PN} ().
Deferring to first boot via 'exit 1' is no longer supported.
--------
エラー内容からしますと、インストールするべき内容物が何もないからだろうと判断しましたが、これではデーモンを自動実行しないようにするという目的が果たせません。
ちなみに、「INITSCRIPT_PARAMS:${PN} = "stop 1 2 3 4 5 ."」とアプローチを変えるとエラーが発生しませんでしたが自動実行されてしまい目的は達成できませんでした。
このような場合の対処法をご教示いただければと存じます。
s.yamaguchi
2023/5/18 (木) 10:48
補足です。
※上で書いた「INITSCRIPT_PARAMS:${PN} = "stop 1 2 3 4 5 ."」は試しに実施してみただけで、この内容で自動実行させないようにする意図はありません。
yakuhito
2023/5/19 (金) 13:13
既存のレシピに対するbbappendに変更点を記載することをお勧めします
構築の一貫性の確保の観点から、他のレシピで生成されるファイルに対する操作は行えない仕組みに変わってきています。
daemonとして動作するパッケージを生成するレシピに対するbbappendで変更されることをお勧めします。
s.yamaguchi
2023/5/19 (金) 13:21
回答ありがとうございます。
上記、回答ありがとうございました。既存のレシピの追加措置として対応してみます。
s.yamaguchi
2023/5/19 (金) 14:39
解決できました。
以下の通り、meta-local/recipes-support/monit/monit_%.bbappend を用意しましたところ、OS初回起動時に抑止できました。
--------
pkg_postinst_ontarget:${PN} () {
cd /etc/init.d
update-rc.d -f monit remove
exit 0
}
--------
→これにより、/etc/ipk-postinsts に「00N-monit」(00Nは通番)ができまして、OS初回起動時にこれが実行され自動起動を防げました。
--------
Fri Mar 9 21:34:57 2018: Running postinst /etc/ipk-postinsts/003-monit...
Fri Mar 9 21:34:57 2018: System startup links for /etc/init.d/monit already exist.
Fri Mar 9 21:34:57 2018: update-rc.d: /etc/init.d/monit exists during rc.d purge (continuing)
Fri Mar 9 21:34:57 2018: Removing any system startup links for monit ...
Fri Mar 9 21:34:57 2018: /etc/rc0.d/K89monit
Fri Mar 9 21:34:57 2018: /etc/rc1.d/K89monit
Fri Mar 9 21:34:57 2018: /etc/rc2.d/S89monit
Fri Mar 9 21:34:57 2018: /etc/rc3.d/S89monit
Fri Mar 9 21:34:57 2018: /etc/rc4.d/S89monit
Fri Mar 9 21:34:57 2018: /etc/rc5.d/S89monit
Fri Mar 9 21:34:57 2018: /etc/rc6.d/K89monit
--------