在Yocto构建的linux系统上启动后执行自定义脚本



我想执行一个脚本,该脚本在每次系统引导时都会出现在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 启用系统服务

相关内容

  • 没有找到相关文章

最新更新