我想执行一个脚本,该脚本在每次系统引导时都会出现在rootfs中,以指示成功更新和重置引导加载程序变量。
例如;自定义脚本";/etc
中存在的脚本为:
/etc
----/init.d
-----------custom-script.sh
我做的第一步是在linux镜像的rootfs中安装这个脚本。我已经在我的自定义Yocto层中创建了一个配方。meta-customrecipes-supportimages
层目录如下:
.
├── files
│ ├── custom-script.sh
└── core-image-base.bb
核心图像库.bb是:
DESCRIPTION = "Install script to Rootfs"
SUMMARY = "Install script to Rootfs and run after boot"
LICENSE = "CLOSED"
SRC_URI = "file://custom-script.sh"
do_install_append() {
install -d 644 ${D}${sysconfdir}/init.d
install -m 0755 ${WORKDIR}/custom-script.sh ${D}${sysconfdir}/init.d/custom-script.sh
FILES_${PN} = "${sysconfdir}/init.d"
在conf/layer.conf
中,我添加了IMAGE_INSTALL_append = " core-image-base"
。
现在我想在每次linux系统启动时执行这个脚本(afrer成功加载rootfs(。有人能帮我完成这件事吗?根据我的理解,我可以使用systemd服务来做这件事,每次系统启动时都应该执行这个服务。任何帮助都将不胜感激。
提前谢谢。
附言:我使用的是Ubuntu 20.04,这是我第一次在Dunfall版本的Yocto中使用systemd服务。
为了使custom-script.sh
在引导时(每次系统引导时(使用init.d
执行,custom-script.sh
应该具有以下格式
#!/bin/bash
# description: Description comes here....
# Source function library.
. /etc/init.d/functions
start() {
# code to start app comes here
# insert any kernel modules prior to
# executing/spawning any process that depends
# on the LKM
}
stop() {
# code to stop app comes here
# example: killproc program_name
# Kill all the process started in start() function
# remove any LKM inserted using insmod in start()
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
# code to check status of app comes here
# example: status program_name
;;
*)
echo "Usage: $0 {start|stop|status|restart}"
esac
exit 0
然后,您还需要在所需的运行级别目录(例如/etc/rc3.d
或/etc/rc5.d
等(中向custom-script.sh
添加符号链接。
要添加符号链接,您需要编辑core-image-base.bb
(也可以使用自定义的*.bb
文件(:
DESCRIPTION = "Install script to Rootfs"
SUMMARY = "Install script to Rootfs and run after boot"
LICENSE = "CLOSED"
SRC_URI = "file://custom-script.sh"
do_install_append() {
install -d 644 ${D}${sysconfdir}/init.d
install -m 0755 ${WORKDIR}/custom-script.sh ${D}${sysconfdir}/init.d/custom-script.sh
ln -sf ../init.d/custom-script.sh ${D}${sysconfdir}/rc4.d/S99custom-script.sh
ln -sf ../init.d/custom-script.sh ${D}${sysconfdir}/rc4.d/K99custom-script.sh
}
FILES_${PN} = "${sysconfdir}/init.d"
因此,我认为您缺少一个指向所需运行级别目录的符号链接,也许您需要编写自定义脚本,以便至少具有start()
和stop()
函数。
如果您正在使用systemd
,请参阅使用yocto 启用系统服务