在 Yocto 构建的 linux 系统上启动后执行自定义脚本
Execute custom script after boot on Yocto-built linux system
我想在每次系统启动时执行一个存在于 rootfs 中的脚本,以指示更新成功并重置引导加载程序变量。
例如,/etc
中的“自定义脚本”脚本为:
/etc
----/init.d
-----------custom-script.sh
我做的第一步是在 linux 映像的 rootfs 中安装这个脚本。我在我的自定义 Yocto 层中创建了一个食谱。 meta-custom\recipes-support\images
图层目录如下:
.
├── files
│ ├── custom-script.sh
└── core-image-base.bb
核心图像-base.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 系统启动时执行这个脚本(在成功加载 rootfs 之后)。有人可以帮我完成这个吗?据我了解,我可以使用 systemd 服务来执行此操作,并且每次系统启动时都应执行此服务。任何帮助将不胜感激。
提前致谢。
P.S:我正在使用 Ubuntu 20.04,这是我第一次在 Yocto 中使用 Dunfell 版本的 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 "" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
# code to check status of app comes here
# example: status program_name
;;
*)
echo "Usage: [=10=] {start|stop|status|restart}"
esac
exit 0
然后您还需要在所需的 运行 级目录中向您的 custom-script.sh
添加一个符号 link,例如/etc/rc3.d
或 /etc/rc5.d
等
要添加符号 link,您需要编辑 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"
所以,我认为您缺少符号 link 到所需的 运行 级目录,也许您需要编写自定义脚本以获得 start()
和 stop()
至少有功能。
如果您使用的是systemd
,请参考
我想在每次系统启动时执行一个存在于 rootfs 中的脚本,以指示更新成功并重置引导加载程序变量。
例如,/etc
中的“自定义脚本”脚本为:
/etc
----/init.d
-----------custom-script.sh
我做的第一步是在 linux 映像的 rootfs 中安装这个脚本。我在我的自定义 Yocto 层中创建了一个食谱。 meta-custom\recipes-support\images
图层目录如下:
.
├── files
│ ├── custom-script.sh
└── core-image-base.bb
核心图像-base.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 系统启动时执行这个脚本(在成功加载 rootfs 之后)。有人可以帮我完成这个吗?据我了解,我可以使用 systemd 服务来执行此操作,并且每次系统启动时都应执行此服务。任何帮助将不胜感激。
提前致谢。
P.S:我正在使用 Ubuntu 20.04,这是我第一次在 Yocto 中使用 Dunfell 版本的 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 "" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
# code to check status of app comes here
# example: status program_name
;;
*)
echo "Usage: [=10=] {start|stop|status|restart}"
esac
exit 0
然后您还需要在所需的 运行 级目录中向您的 custom-script.sh
添加一个符号 link,例如/etc/rc3.d
或 /etc/rc5.d
等
要添加符号 link,您需要编辑 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"
所以,我认为您缺少符号 link 到所需的 运行 级目录,也许您需要编写自定义脚本以获得 start()
和 stop()
至少有功能。
如果您使用的是systemd
,请参考