Openwrt 软件启动机制

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

书籍:[智能路由器开发指南]

你可能感兴趣的:(openwrt,启动,Openwrt)