busybox init 过程

原文:http://blog.chinaunix.net/uid-23404636-id-3031299.html

在嵌入式系统内,如果我们使用busybox内的init作为第一个用户进程其启动流程中注意点:

  1。内核在启动start_kernel后经过一系列的初始化后,会调用rest_init函数,在这个函数里会exec(/sbin/init)。
  2。在init启动后会根据是否有inittab文件,决定启动哪些脚本如果没有会有一个默认启动。
  3。在读取inittab文件后,根据如下规则:

/etc/inittab 文件中每个条目用来定义一个子进程,并确定它的启动方法,格式如下 :
<id>:<runlevels>:<action>:<process>
例如:
ttySAC0:askfirst:-/bin/sh
(1)<id>:表示这个进程要使用的控制台(即标准输入、标准输出、标准错误设备)。如果省略,则使用与init进程一样的控制台。
(2)<runlevels>:对于Busybox init程序,这个字段滑意义,可以省略。
(3)<action>:表示init程序如何控制这个子进程,
(4)<process>: 要执行的程序,它可以是可执行程序,也可以是脚本
如果<process>:字段有"-"字符,表示这个程序被称为“交互的”。在/etc/inittab/文件的控制下,init进程的行为总结如下:
(1)在系统启动前期,init进程首先启动<action>为sysinit wait once的3类子进程。
(2)在系统正常运行期间,init程序首先启动,<action>为respawn askfirst的两类子进程,并监视它们,发现某个子进程退出时重新启动它。
(3) 在系统退出时,执行<action> 为shutdown restart ctrlaltdel的3类子进程之一或全部。
如果根文件系统中没有/etc/initab文件,Busybox init程序将使用如下默认的inittab条目。

             /etc/inittab文件中<action>字段的意义

Action名称

执行条件

说明

Sysinit

系统启动后最先执行

只执行一次,init进程等待它结束才继续执行其它动作

Wait

系统执行完sysinit进程后

只执行一次,init进程等待它结束才继续执行其它动作

Once

系统执行完wait进程后

只执行一次,init进程不等待它结束

Respawn

启动完once进程后

Init进程监测发现子进程退出时,重新启动它

Askfirst

启动完respawn进程后

与respawn类似,不过init进程先输出“Please press Enter to actvie this console”,等用户输入驾车键之后才启动子进程

Shutdown

当系统关机时

即重启关闭系统命令时

Restart

Busybox中配置了CONFIG_FEATURE_USE_INITTAB,并且init进程接收到SIGHUP信号时

先重新读取,解析/etc/initab文件,再执行restart程序

Ctrlatldel

按下Ctr+Alt+del组合键时

 

 读取后分为几类:

    根据启动定义性质,分别启动。

其中在启动

Sysinit进程的时候,会如下:

init  fork一次 出现两个init进程。而后第二个init会再次fork 出现第三个init进程,不过第三个init进程存在的时间极短,就会调用exec把需要启动的进程拉入该进程进程名改变。
注意点:
  在以sysinit启动的脚本 必须能返回结束,否则该系统init进程将处于一直等待某个进程的状况,而无法后续回收僵尸进程。

===========================================================================================================
===========================================================================================================

BusyBox init进程依次进行以下工作:

1)为init设置信号处理进程。

2)初始化控制台。

3)解析inittab文件(/etc/inittab)。

4)执行系统初始化脚本(/etc/init.d/rcS作为缺省)。

5)执行所有阻塞的(会导致init暂停的)inittab命令(动作类型:wait)。

6)执行所有仅执行一次的inittab命令(动作类型:once)。

7)一旦完成以上工作,init进程便会循环执行以下工作:

8)执行所有终止时必须重新启动的inittab命令(动作类型:respawn)。

9)执行所有中止时必须重新启动但启动前必须前询问用户的inittab命令(动作类 型:askfirst)。

其中,inittab文件的每一行的格式为:id:runlevel:action:processprocess字段用来指定所执行程序的路径, 包括命令行选项。action字段用来指定可应用到process的动作。BusyBox init能够识别的inittab动作类型如下表所示:

动作

结果

sysinit

init提供初始化命令行的路径

respawn

每当相应的进程终止执行便重新启动

askfirst

类似respawn,不过它的主要用途是减少系统上执行的终端应用程序的数量。它将会促使init在控制台上显示“Please press Enter to activate this console.”的信息,并在重新启动进程之前等待用户按下Enter

wait

告诉init必须等到相应的进程完成才能继续执行

once

仅执行相应的进程一次,而且不会等待它完成

ctrlaltdel

当按下Ctrl-Alt-Delete组合键时,执行相 应的进程

shutdown

当系统关机时,执行相应的进程

restart

init重新启动时,执行相应的进程。通常此处所执行 的进程就是init本身

下面就是一个典型的嵌入式busyboxinittab文件的例子:

 

可见busybox分析完inittab脚本中会执行rcS脚本,下面就是一个rcS脚本的例子:

echo "export system param...."
export PATH=/sbin:/bin:
export HOSTNAME=micro2440

echo "init ip address....."
/sbin/ifconfig eth0 192.168.254.177

echo "Mount all filesystems (of the given types) mentioned in fstab."
mount –a

其中mount –a会加载文件/etc/fstab文件中的选项,这个目录的编写主要是安排哪些目录挂载哪些次级文件系统:例如:

proc           /proc        proc   defaults        0     0
tmpfs         /tmp        tmpfs  defaults        0     0
sysfs          /sys         sysfs  defaults        0     0

上面的rcS文件中不但加载了在etc/fstab中定义的文件系统(mount -a),还对系统的环境变量、ifconfig以及打印欢迎信息进行设置,这样比较省事儿,还有一种做法是在rcS中运行/usr/etc/rc.local脚本,该脚本的主要工作是安装核心模块、进行网络配置、运行应用程序、启动图形界面等,这里的rc.local脚本只进行ifconfig,打印欢迎信息,并执行/usr/etc/profile,profile文件时对应用程序的环境变量进行设置:

/sbin/init -> /etc/inittab -> /etc/init.d/rcS->/usr/etc/rc.local->/usr/etc/profile


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值