第一部分:内核的引导(核内引导)
第二部分:运行init及系统初始化
init程序 需要读取配置文件/etc/inittab。inittab是一个不可执行的文本文件,它有若干行指令所组成。
该文件决定了系统的启动级别(1,2,3,4,5)。
inittab中有这样一行si::sysinit:/etc/rc.d/rc.sysinit(调用执行/etc/rc.d/rc.sysinit,这个脚本中有很多小功能)。
第三部分:启动对应运行级别的守护进程
在rc.sysinit执行后,将返回init继续其它的动作,通常接下来会执行到/etc/rc.d/rc程序。
根据启动级别执行相应的脚本rcx.d:
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
rc执行完毕后,返回init。这时基本系统环境已经设置好了,各种守护进程也已经启动了。init接下来会打开6个终端,以便用户登录系统。通过按Alt+Fn(n对应1-6)可以在这6个终端中切换。在inittab中的以下6行就是定义了6个终端:
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
从上面可以看出在2、3、4、5的运行级别中都将以respawn方式运行mingetty程序(其实mingetty也可以调login程序来实现登陆界面,具体见下文),mingetty程序能打开终端、设置模式。同时它会 显示一个文本登录界面,这个界面就是我们经常看到的登录界面,在这个登录界面中会提示用户输入用户名,而用户输入的用户将作为参数传给login程序来验 证用户的身份。
下面来分析mingetty如何实现登陆界面附部分源码
//autologin 自动登陆
if (autologin) {
do_prompt (0);//
printf ("login: %s (automatic login)\n", autologin);
logname = autologin;
} else//否则调用get_logname()获取用户名,get_logname会调do_prompt()提示输入Login:get_logname没有别处源码
while ((logname = get_logname ()) == 0)
/* do nothing */ ;
·
·//省略部分源码
·
execl (loginprog, loginprog, autologin? "-f" : "--", logname, NULL);/*此处替换login程序来实现验证用户名密码
注意:全局变量static char *loginprog = "/bin/login";
*/
static void do_prompt (int showlogin)
{
FILE *fd;
int c;
if (nonewline == 0)
putchar (‘\n‘);
if (noissue == 0 && (fd = fopen ("/etc/issue", "r"))) {
while ((c = getc (fd)) != EOF) {
if (c == ‘\\‘)
output_special_char (getc (fd));
else
putchar (c);
}
fclose (fd);
}
if (loginpause) {
puts ("[press ENTER to login]");
getc (stdin);
}
if (nohostname == 0)
printf ("%s ", hn);
if (showlogin)//autologin==0,跳过
printf ("login: ");
fflush (stdout);
}
**验证成功后会执行/etc/profile(如果存在)文件完成相关环境初始化**
例:终端输入 :mingetty将提示入户输入程序(以login为例),调用login程序,login验证通过后将执行配置文件/etc/profile(如果存在)
到此整个启动过程就结束了。
参考:http://www.51ou.com/browse/linuxml/mingetty.html