Openwrt 软件启动机制
init 进程是所有系统进程的父进程,他被内核调起来并负责调用所有其他的进程.如果父进程退出,init 进程将成为他的父进程.
内核启动完成后,读取/etc/inittab文件,然后执行inittab中的sysinit所指的脚本
Openwrt init 文件的脚本内容如下:
::sysinit:/etc/init.d/rcS S boot
::shutdown:/etc/init.d/rcS K shutdown
::askconsole:/bin/ash --login
内核首先调用 "/etc/init.d/rcS" 然后再由rcS逐个启动软件进程
按照通常的做法,我们会将每个待启动的程序启动命令按行放入rcS文件,并顺序执行,显然这种做法在多进程列表时对于有插入进程的工作方式非常不人性化,所以在Openwrt中引入一个易控制的启动机制
- 所有的启动软件脚本,放置在/etc/init.d/目录下,如果需要随系统启动,则将启动脚本链接到/etc/rc.d/S*
- /etc/init.d 文件要求
#!/bin/sh /etc/rc.common #引用/etc/rc.common脚本的处理
# Copyright (C) 2015 OpenWrt.org
START=94 #起始顺序号 1-99
STOP=98 #停止
USE_PROCD=1
start() {
#省略函数体
}
stop() {
#省略函数体
}
restart() {
#省略函数体
}
脚本中 start() 和 stop() 是必须的
#/etc/rc.common函数含义
start # 启动服务
stop # 停止服务
restart # 重启服务
reload # 重新载入配置文件, 如果失败则重启
enable # 启用开机自启动
disable # 禁用开机自启动
boot #调用start
shutdown #调用stop
help #输出帮助信息
- 如下按照顺序,在/etc/rc.d创建的软链接
#在LEDE中查看目录下的文件,如下
root@OpenWrt:/# ls /etc/rc.d/
K10gpio_switch K98boot S12log S50dropbear
K50dropbear K99umount S19dnsmasq S94gpio_switch
K85odhcpd S00sysfixtime S19firewall S95done
K89log S10boot S20network S96led
K90network S10system S35odhcpd S98sysntpd
K90sysfixtime S11sysctl S50cron S99urandom_seed
启动顺序
START= 和 STOP= 决定脚本启动时的次序. 启动时init.d会根据文件名顺序, 自动执行在/etc/rc.d中找到的脚本. 初始化脚本可以作为/etc/init.d/下文件的软链放置在/etc/rc.d/. enable 和 disable 可以自动帮你创建对应的带序号的软链.
这个例子中START=94 会被链接到 /etc/rc.d/S94example, 启动时执行在START=93之后, 在START=95之前. 而STOP=98会被链接到 /etc/rc.d/K98example, 执行在STOP=97之后, 在STOP=99之前. 同一个启动数字的, 按字母顺序启动.
-
如果没有定义start boot 之类的函数则会引用/etc/rc.common中的同名函数
-
/etc/init.d/example enable或者disable 将会输出开启或者关闭程序的上电启动
参考文献
openwrt wiki
及
书籍:[智能路由器开发指南]