OpenWrt 启动时会执行 rc.d/ 下的脚本. 这篇文章 介绍了启动脚本里的规则.
K50dropbear -> ../init.d/dropbear
K85odhcpd -> ../init.d/odhcpd
K89log -> ../init.d/log
K90network -> ../init.d/network
K98boot -> ../init.d/boot
K99umount -> ../init.d/umount
S00sysfixtime -> ../init.d/sysfixtime
S10boot -> ../init.d/boot
S10system -> ../init.d/system
S11sysctl -> ../init.d/sysctl
S12log -> ../init.d/log
S19firewall -> ../init.d/firewall
S20network -> ../init.d/network
S35odhcpd -> ../init.d/odhcpd
S50cron -> ../init.d/cron
S50dropbear -> ../init.d/dropbear
S50qos -> ../init.d/qos
S50telnet -> ../init.d/telnet
S60dnsmasq -> ../init.d/dnsmasq
S80trelay -> ../init.d/trelay
S90qdmsg -> ../init.d/qdmsg
S95done -> ../init.d/done
S96led -> ../init.d/led
S98sysntpd -> ../init.d/sysntpd
- rc.d/ 下的脚本都是链接到 init.d/ 下的.
- S开头的表示在开机时执行, K开头的表示在关机时执行. 数字序号用来控制各脚本的执行的顺序.
- 脚本里 boot() 函数会在开机时默认被执行
- start_service()
boot() 函数在开机时默认被调用
procd 解析 /etc/inittab 文件. 该文件内容如下:
::sysinit:/etc/init.d/rcS S boot
::shutdown:/etc/init.d/rcS K shutdown
::askconsole:/bin/ash --login
- sysinit 指明启动初始化时, 在 procd 内针对它有相应的回调函数. 该函数到 /etc/rc.d/ 下找脚本执行.
- /etc/init.d/rcS 的本意是指明处理该过程的脚本. OpenWrt 中在 procd 中已经预设后处理函数为 rcS().
- S 表示找 /etc/rc.d/ 下面名字以 'S' 开头的脚本.
- boot 就是执行该脚本中时以 boot 为参数. 执行脚本中的 boot 函数.
同里, 也可以知道 shutdown 里的处理过程:
- 找 /etc/rc.d/ 下名字以 'K' 开头的脚本.
- 以 shutdown 为参数执行该脚本, 即执行脚本中的 shutdown 函数.