我们知道,kernel成功启动之后,在init/main.c中调用execve执行程序/sbin/init。init进程被称为初始化进程,因为它负责系统的启动。
我以我的slackware10为例(不光因为它是我用的套件,而且启动脚本十分清晰明了),讲一讲启动的具体过程:
(史前时期)loadlin,grub,lilo把内核参数传给kernel,如(BOOT_IMAGE=Linux ro root=307),,存储在/proc/cmdline中。
内核启动成功后,把它的参数传给1号进程(init),因为也许有一些参数应被用户程序解释。
init进程将从上到下的读取/etc/inittab文件,只要状态符合当前运行级就会去执行脚本。
inittab由几行组成,每行被三个冒号分隔成四个部分,每个部分具有不同的含义。格式如下:
行标识符:状态:动作:命令
行标识符是你的运行级脚本的名字,不能使用重复的行标识符。
状态是表示运行级脚本何时应该执行的数字。状态由0,1,2,3,4,5,6和S一个或多个数字字母组成。如果状态为空,就是系统启动必须执行的脚本。
下面是slackware的状态定义:
0 = halt
1 = single user mode
2 = unused (but configured the same as runlevel 3)
3 = multiuser mode (default Slackware runlevel)
4 = X11 with KDM/GDM/XDM (session managers)
5 = unused (but configured the same as runlevel 3)
6 = reboot
S同状态1相同。
动作有once, wait, respawn, sysinit, crtlaltdel, initdefault组成,说明了init执行脚本的方式。
once:init在进入后只执行一次。init不等待命令的结束。
wait:和once不同的是,init等待命令的结束。
respawn:命令结束后会被重起。
sysinit:init最先执行的运行级脚本,状态被忽略。说穿了就是无论何是都优先执行的脚本,应指向系统初始化脚本。
ctrlaltdel:当“三指禅”被按下时,该运行级被启动,一般是指向重启脚本。
initdefault:指定系统启动时的缺省运行级。在sysinit后执行。
对于slackware的inittab:
id:3:initdefault:
id指出缺省为多用户字符界面(3),不要把它设置成0或6!注意没有命令。
si:S:sysinit:/etc/rc.d/rc.S
si指出系统初始化运行级,其中S等同于状态1,它指向/etc/rc.d/rc.S,也就是说init第一个去执行的shell脚本。
rc:2345:wait:/etc/rc.d/rc.M
rc指出多用户启动运行级,当状态为2,3,4,5时被执行,init等待命令的结束,这也是为什么启动时没有shell可用的原因。
c1:1235:respawn:/sbin/agetty 38400 tty1 linux
c1指出控制台1,当它被杀死时init将重启它。它打开一个终端tty1供你使用。
x1:4:wait:/etc/rc.d/rc.4
x1指出多用户GUI运行级,指向脚本rc.4。
rc.S(系统初始化运行级脚本)做的事:
rc.modules:
rc.S执行完成后,slackware将执行缺省的运行级(3),也就是先执行rc.M(多用户进程级)。
rc.inet1:
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/14102/viewspace-116599/ ,如需转载,请注明出处,否则将追究法律责任。