1 系统介绍
任何系统的启动都是开发人员首要关注的问题,因为只有了解了系统的启动流程和启动机制,才能真正掌握一个系统,如果对启动的启动不熟悉的话,是不可能真正用好一个系统,openwrt系统也不例外,他的启动和一般的嵌入式系统启动还有所区别,现在咱们就分析一下openwrt的启动流程。
2 内核补丁
在Openwrt的官网上面下载的源码,其中包括了一些内核补丁,这里究竟为什么要给内核做补丁呢?因为Openwrt为了支持更多的路由器,更多的操作和Openwrt特有的一些内核功能,linux源码是不具备的,这样Openwrt为了增加这些功能,就需要在linux官网上面下载的源代码中做一些修改,在这里体现为给linux源码打补丁。Openwrt源码中的linux补丁文件放在target/linux/generic文件下面,有对于不同版本的linux内核补丁文件。MT7621采用的是4.14版本的内核,所以他的补丁文件在patches-3.10目录下面。这里是所有的内核补丁文件,在编译Openwrt的时候,会首先把他们拷贝到内核目录下面,然后在内核上面打上这些补丁,然后再编译内核。咱们首先分析他对于linux启动的补丁,它的名字是921-use_preinit_as_init.patch(在Ubuntu源文件中),咱们可以看看他的内容。
可以看到他它修改linux内核中默认的启动项,可以看到它首先启动/etc/preinit(开发板的文件系统中),它是个脚本,咱们就从这个脚本说起。
3 preinit
preinit脚本在etc目录下面,首先先看看他的内容:
这就是个bash脚本,前半部分只是定义了一些变量,先记住他们的内容即可,有两个函数是我们需要了解的,boot_hook_init和boot_run_hook。他们定义在/lib/functions/preinit.sh文件中,boot_hook_init是初始化一个函数队列,boot_run_hook是运行一个函数队列,还有一个这个文件没有体现,后面的文件中会遇到,这里说明一下,boot_book_add这个是在一个函数队列中添加一个函数。然后就是执行:
循环执行/lib/preinit 目录下面的脚本,这里简要分析/lib/preinit目录下的一个文件,循环执行/lib/preinit目录下面的脚本,这里简要分析一个,这里分析02_default_set_state,首先看看他的内容。
可以看到它就是在preinit_main函数队列中增加一个函数,这个函数就是简单的执行一个脚本。当运行preinit_main的时候,队列中的所有函数就会依次执行。其他文件可以自行分析,都比较简单。
最后在preinit脚本中执行preinit_main。执行完这个脚本之后init进程会根据inittab文件执行其他的启动项。
4 inittab
inittab为linux初始化文件系统时init初始化程序用到的配置文件。这个文件负责设置init初始化程序初始化脚本在哪里;每个运行级初始化时运行的命令;开机、关机、重启对应的命令;各运行级登陆时所运行的命令。
如果存在/etc/inittab文件,Busyboxinit程序解析它,然后按照它的指示创建各种子进程,否则使用默认的配置创建子进程。
/etc/inittab文件中每个条目用来定义一个子进程,并确定它的启动方法,格式如下
:::
1、id:表示这个子进程要使用的控制台,如果省略,则使用与init进程一样的控制台.
2、runlevels:这个字段没有意义,可以省略。在linux有意义.
3、action:表示init进程如何控制这个子进程,具体取值见下表.
4、process:要执行的程序,它可以是可执行程序,也可以是脚本.如果process字段前有“-”字符,这个程序被称为“交互的”.
【attention】action取值
名称 | 执行条件 | 说明 |
---|---|---|
sysinit | 系统启动后最先执行 | 指定初始化脚本路径,只执行一次,init进程等待它结束才继续执行其它动作 |
wait | 系统执行完sysinit进程后 | 只执行一次,init进程等待它结束才继续执行其它动作 |
once | 系统执行完wait进程后 | 只执行一次,init进程不等待它结束 |
respawn | 启动完once进程后 | init进程监测发现子进程退出时,重新启动它,永不结束.如Shell命令解释器 |
askfirst | 启动完respawn进程后 | 与respawn类似,不过init进程先输出“Please pressEntertoactivatethis console”,等用户输入回车后才启动子进程 |
shutdown | 当系统关机时 | 即重启、关闭系统时执行的程序 |
restart | 系统重启时 | init进程重启时执行的程序,通常是init程序本身先重新读取、解析/etc/inittab文件,再执行restart程序 |
ctrl+alt+del | 按下Ctrl+Alt+Del | 键时按Ctrl+Alt+Del组合键时执行的程序 |
先肯看/etc/inittab中的内容:
从上面的分析可以看出它在开机启动的时候执行/etc/init.d/rcS脚本,以前是有/etc/init.d/rcS脚本的,现在的openwrt已经去掉了这个脚本文件,只要有rcSSboot这几个参数就可以,但是功能是有的就是按顺序执行/etc/rc.d下面的各个脚本,以S开头代表启动的时候执行的脚本,与命令行中的S对应,以K开头的代表关机的时候需要执行的脚本,与命令行中的K对应。
5 总结
从上面的分析我们来总结一下openwrt的启动流,/etc/preinit->/lib/preinit/->/etc/inittab->/etc/rc.d/S。
-
嵌入式
+关注
关注
5096文章
19203浏览量
308391 -
函数
+关注
关注
3文章
4350浏览量
63067 -
OpenWrt
+关注
关注
10文章
131浏览量
39546 -
启动流程
+关注
关注
0文章
14浏览量
6505 -
脚本
+关注
关注
1文章
392浏览量
14982
发布评论请先 登录
相关推荐
Openwrt开发指南 第1章 OpenWrt入门
Openwrt开发指南 第2章 OpenWrt开发环境搭建
Openwrt开发指南 第3章 OpenWrt下载及配置
Openwrt开发指南 第4章 烧写OpenWrt固件
Openwrt开发指南 第7章 添加Web界面
Openwrt开发指南 第12章 添加OpenWrt软件包
Openwrt开发指南 第14章 统一接口配置UCI
Openwrt开发指南 第17章 驱动开发之字符设备驱动程序
Openwrt开发指南 第22章 Openwrt串口的使用2
Openwrt开发指南 第29章 OpenWrt 防火墙介绍
![<b class='flag-5'>Openwrt</b><b class='flag-5'>开发指南</b> <b class='flag-5'>第</b>29<b class='flag-5'>章</b> <b class='flag-5'>OpenWrt</b> 防火墙介绍](https://file1.elecfans.com/web2/M00/8C/D1/wKgaomSyVr-AB38EAACpb5ioTgU243.png)
RT5350 Wi-Fi 模块开发指导_物联网 openwrt 开发概述
openwrt都有什么功能_openwrt详细功能介绍_openwrt刷机教程
![<b class='flag-5'>openwrt</b>都有什么功能_<b class='flag-5'>openwrt</b>详细功能介绍_<b class='flag-5'>openwrt</b>刷机教程](https://file1.elecfans.com//web2/M00/A7/1D/wKgZomUMQnmACto5AAAR9_H4Skk796.jpg)
评论