gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 19:05:41 25 4
gpt4 key购买 nike

我想在每次系统启动时执行 rootfs 中存在的脚本,以指示成功更新和重置引导加载程序变量。
例如,/etc 中的“custom-script”脚本作为:

/etc
----/init.d
-----------custom-script.sh
我做的第一步是将此脚本安装在 linux 镜像的 rootfs 中。我在我的自定义 Yocto 层中创建了一个食谱。 meta-custom\recipes-support\images层目录如下:
.
├── files
│ ├── custom-script.sh
└── core-image-base.bb
core-image-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 "$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
然后,您还需要在所需的运行级别目录中添加一个指向您的 custom-script.sh 的符号链接(symbolic link),例如 /etc/rc3.d/etc/rc5.d 等。
要添加符号链接(symbolic 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"
因此,我认为您缺少指向所需运行级目录的符号链接(symbolic link),也许您需要编写自定义脚本以至少具有 start()stop() 函数。
如果您使用 systemd ,请引用 Enable systemd services using yocto

关于ubuntu - 在 Yocto 构建的 linux 系统上启动后执行自定义脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70532388/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com