Edit online

开机启动

4 Dec 2024
Read time: 2 minute(s)
在 Luban SDK 中,为项目安装开机初始化脚本,可以通过以下多种方式实现:
  • init.d 脚本:如果初始化脚本与组件包相关。
  • RootFS Overlay:如果初始化脚本与具体的组件包没有直接关系。
  • initscripts:不建议将过多的脚本存放在 initscripts 包中进行安装。
提示: 登录之前 linuxrc 会执行开机脚本,执行的内容和顺序可详细参考 package/third-party/busybox/inittab
注:

大部分初始化脚本都有与之相关的组件包,建议 采用init.d 脚本RootFS Overlay 方式进行安装。

init.d 脚本

如果初始化脚本与某组件包相关,可以编写一个 init.d 脚本, 在该组件包安装文件时,将对应的脚本安装到 /etc/init.d/ 目录。Linux 对 init.d 脚本有统一的要求。

lvgl-ui 应用为例,编写一个 init.d 脚本来管理其启动和停止的详细流程如下所示:
  1. 编写脚本

    编写一个 package/artinchip/lvgl-ui/S00lvgl 脚本,S00 为优先级,00 说明优先级最高。

    #!/bin/sh
    #
    # Start test_lvgl....
    #
    
    
    DAEMON="/usr/local/bin/test_lvgl"
    PIDFILE=/var/run/test_lvgl.pid
    TSCALIB=/etc/pointercal
    
    start() {
        printf "Starting test_lvgl: "
    
        if [ ! -f $TSCALIB ]; then
            /usr/bin/ts_calibrate
        fi
        sync
        PID=`$DAEMON > /dev/null 2>&1 & echo $!`
        if [ -z $PID ]; then
            printf "Fail \n"
        else
            echo $PID >$PIDFILE
            printf "OK \n"
        fi
    }
    
    stop() {
        printf "Stopping test_lvgl: "
        PID=`cat $PIDFILE`
        if [ -f $PIDFILE ]; then
            kill -HUP $PID
            printf "OK \n"
            rm -f $PIDFILE
        else
            printf "pidfile not found \n"
        fi
    }
    
    case "$1" in
        start)
            start
            ;;
        stop)
            stop
            ;;
        restart|reload)
            stop
            start
            ;;
        *)
        echo "Usage: $0 {start|stop|restart}"
        exit 1
    esac
    
    exit $?
    
  2. 安装脚本

    S00lvgl脚本安装到 /etc/init.d/ 目录中,可以在 mk 文件中完成。例如对于 lvgl-ui 应用,可以修改 package/artinchip/lvgl-ui/lvgl-ui.mk 文件:

    define LVGL_UI_POST_TARGET_INSTALL
        @$(call MESSAGE,"post target install")
        $(INSTALL) -m 0755 -D package/artinchip/lvgl-ui/S00lvgl \
            $(TARGET_DIR)/etc/init.d/S00lvgl
    endef
    

RootFS Overlay

如果初始化脚本与具体的组件包没有直接关系,但与项目相关性较大,或者不方便放到具体的组件包中,则可以使用 RootFS Overlay 方式,具体步骤如下:
  1. target/chip/board/rootfs_overlay/ 目录下创建一个目录,例如 /etc/init.d/,并将脚本放入其中:
    mkdir -p target/chip/board/rootfs_overlay/etc/init.d
    cp package/artinchip/lvgl-ui/S00lvgl target/chip/board/rootfs_overlay/etc/init.d/S00lvgl
    chmod +x target/chip/board/rootfs_overlay/etc/init.d/S00lvgl
    
  2. 确保在生成 RootFS 镜像时,Overlay 被正确应用。通常在构建系统的配置文件中进行设置。

具体可参考 RootFS 和 Overlay

initscripts

/etc/init.d/ 目录是由 package/third-party/initscripts/ 包进行安装创建的, 也可以将相关初始化脚本放在该包中进行安装。需要修改 package/third-party/initscripts/initscripts.mk 中的 INITSCRIPTS_INSTALL_TARGET_CMDS