BusyBox init工作流程

linux启动完成后,运行由Busybox产生的init进程。

/sbin/init是系统启动的第一个用户进程,pid=1。
init的工作是根据/etc/inittab脚本来进行系统的初始化工作,关机前的工作等等。

init代码在BusyBox中init/init.c中,主要进行以下工作:

》为init进程设置信号处理进程。

》对控制台进行初始化。

》解析inittab文件即/etc/inittab。

》若无/etc/inittab,采用默认的inittab,运行初始化脚本/etc/init.d/rcS.

》运行inittab中其他命令。

----------------------------------------------------------------------------

系统默认的inittab:

#         ::sysinit:/etc/init.d/rcS
#         ::askfirst:/bin/sh
#         ::ctrlaltdel:/sbin/reboot
#         ::shutdown:/sbin/swapoff -a
#         ::shutdown:/bin/umount -a -r
#         ::restart:/sbin/init

#         tty2::askfirst:/bin/sh
#         tty3::askfirst:/bin/sh
#         tty4::askfirst:/bin/sh

不管自己的inittab,还是系统默认inittab,一般首先运行/etc/init.d/rcS脚本,之后再进行后续工作。

-----------------------------------------------------------------------------

action解析:

sysinit:为init提供初始化命令行的路径。

respawn:在紧跟进程结束后,重启启动该进程(后边的process)。--复位,重启

askfirst:类似respawn,主要用途是减少系统上执行的终端应用程序的数量,

               会在控制台上显示“Please press Enter to active this console"的信息,

               并在系统重启之前等待用户按下”Enter“键。

wait:通知init必须等到相应的进程执行完之后才能继续执行其他的动作。

once:进程只执行一次,而且不会等待它完成。

ctrlaltdel:当按下ctrl-Alt-Del组合键时运行的进程。

shutdown:当系统关机时运行的进程。

restart:当init进程重启启动时执行的进程,事实上就是init本身。

-------------------------------------------------------------------------------

跟踪init/init.c中init的执行流程,可知其工作流程:

在init_mian()中完成inittab解析后,组成init_action[],然后顺序阻塞执行:

SYSINIT -> WAIT -> ONCE ->  循环RESPAWN|ASKFIRST

命令执行通过run_actions:

阻塞执行SYSINIT|WAIT|ONCE|CTRLALTDEL|SHUTDOWN -> RESPAWN|ASKFIRST仅执行一次

中间接受到信号(CTRLALTDEL)执行信号处理,一般重启设备。

原文地址:https://www.cnblogs.com/embedded-linux/p/4821814.html