第一部分:内核的引导(核内引导)
第二部分:运行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

Logo

更多推荐