开机启动
- init.d 脚本:如果初始化脚本与组件包相关。
- RootFS Overlay:如果初始化脚本与具体的组件包没有直接关系。
- initscripts:不建议将过多的脚本存放在 initscripts 包中进行安装。
大部分初始化脚本都有与之相关的组件包,建议 采用init.d 脚本 和 RootFS Overlay 方式进行安装。
init.d 脚本
如果初始化脚本与某组件包相关,可以编写一个 init.d 脚本, 在该组件包安装文件时,将对应的脚本安装到 /etc/init.d/ 目录。Linux 对 init.d 脚本有统一的要求。
lvgl-ui
应用为例,编写一个 init.d
脚本来管理其启动和停止的详细流程如下所示:-
编写脚本
编写一个 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 $?
-
安装脚本
将 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
-
在 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
-
确保在生成 RootFS 镜像时,Overlay 被正确应用。通常在构建系统的配置文件中进行设置。
具体可参考 RootFS 和 Overlay。
initscripts
/etc/init.d/ 目录是由 package/third-party/initscripts/ 包进行安装创建的, 也可以将相关初始化脚本放在该包中进行安装。需要修改 package/third-party/initscripts/initscripts.mk 中的 INITSCRIPTS_INSTALL_TARGET_CMDS 。