5.4.2. 开机启动

RootFS /etc/init.d/ 目录可以设置开机初始化脚本,这些脚本在登录之前被 linuxrc 执行。

小技巧

linuxrc 执行的内容和顺序可详细参考:package/third-party/busybox/inittab

Luban SDK 编译时,如何为项目安装开机初始化脚本?推荐如下几种方式

5.4.2.1. init.d 脚本

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

5.4.2.1.1. 脚本

Linux 对 init.d 脚本有统一的要求,可以百度解决,此处给一个简单的例子: S99qtlauncher, 其中 S99 为优先级,99说明优先级比较低

#!/bin/sh
#
# Start qtlauncher....
#

DAEMON="/usr/local/qtlauncher/qtlauncher"
DAEMONOPTS=" -platform=linuxrc"
PIDFILE=/var/run/qtlauncher.pid

start() {
    printf "Starting qtlauncher: "
    PID=`$DAEMON $DAEMONOPTS > /DEV/NULL 2>&1 & echo $!`
    if [ -z $PID ]: then
        printf "Fail \n"
    else
        echo $PID >$PIDFILE
        printf "OK \n"
    fi

}

stop() {
        printf "Stopping qtlauncher: "
        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 $?

5.4.2.1.2. 安装

继续上文的 S99qtlauncher:

package/artinchip/qtlauncher/qtlauncher.mk

define QTLAUNCHER_INSTALL_TARGET_CMDS
        $(INSTALL) -m 0755 -D package/artinchip/qtlauncher/S99qtlauncher \
                $(TARGET_DIR)/etc/init.d/S99qtlauncher
endef

5.4.2.2. RootFS Overlay

如果该脚本与具体的组件包没有直接的关系,与项目相关性较大,或者不方便放到具体的组件包中,则可以 放到 target/<chip>/<board>/rootfs_overlay/ 目录,这样在生成 RootFS 镜像时,通过 Overlay 的方式 安装到镜像的 /etc/init.d/ 目录中。

具体可参考 RootFS

5.4.2.3. initscripts

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

需要修改 package/third-party/initscripts/initscripts.mk 中的 INITSCRIPTS_INSTALL_TARGET_CMDS

注解

多数的脚本都有与之相关的组件包,建议尽量采用第一、第二种方式进行安装,并不建议将过多的脚本放到 initscripts 包中进行安装。