在 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,请参考