Linux从按下电源到屏幕出现命令行究竟做了什么——linux mingetty命令

第一部分:内核的引导(核内引导)

第二部分:运行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

时间: 2024-10-07 02:28:40

Linux从按下电源到屏幕出现命令行究竟做了什么——linux mingetty命令的相关文章

Windows命令行中使用SSH连接Linux

转自 http://www.linuxidc.com/Linux/2014-02/96625.htm 1.下载: openssh for Winodws: 免费下载地址在 http://linux.linuxidc.com/ 用户名与密码都是www.linuxidc.com 具体下载目录在 /2014年资料/2月/14日/Windows 7命令行下使用SSH通过秘钥登录Linux 下载方法见 http://www.linuxidc.com/Linux/2013-07/87684.htm 2.安装

php在cli模式下取得命令行中的参数的方法-getopt命令行可传递数组-简单自定义方法取命令行参数

在cli模式下执行PHP时,自动给脚本文件传递了一个变量$argv,其值即是一个命令中所有值组成的数组(以空格区分),在PHP程序中接收参数有3种方法1.直接使用argv变量数组. 2.使用$_SERVER['argv']全局变量来获取,其值和1是一样的. 3.使用getopt方法 #getopt方法格式 array getopt ( string $options [, array $longopts ] ) options:该字符串中的每个字符会被当做选项字符,匹配传入脚本的选项以单个连字符

北航面试之计算机从按下电源键到出现桌面是怎样的过程(linux)

开机过程指的是从打开计算机电源直到LINUX显示用户登录画面的全过程.分析LINUX开机过程也是深入了解LINUX核心工作原理的一个很好的途径. 启动第一步--加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它.这是因为BIOS中包含了CPU的相关信息.设备启动顺序信息.硬盘信息.内存信息.时钟信息.PnP特性等等.在此之后,计算机心里就有谱了,知道应该去读取哪个硬件设备了.在BIOS将系统的控制权交给硬盘第一个扇区之后,就

windows安装pscp工具,通过命令行上传文件到linux服务器

三步完成:下载pscp工具http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html 拷贝到C:\Windows\System32 打开CMD运行pscp命令D:\>pscp dnsmasq.hosts [email protected]:/tmp

Linux命令行下编辑常用的快捷键

Linux命令行编辑快捷键: history                                   显示命令历史列表 ↑(Ctrl+p)                               显示上一条命令 ↓(Ctrl+n)                               显示下一条命令 !num                                     执行命令历史列表的第num条命令 !!                            

linux 查询目录下包含关键字的所有文件

linux查找目录下的所有文件中是否含有某个字符串 查找目录下的所有文件中是否含有某个字符串 find .|xargs grep -ri "IBM" 查找目录下的所有文件中是否含有某个字符串,并且只打印出文件名 find .|xargs grep -ri "IBM" -l 1.正则表达式    (1)正则表达式一般用来描述文本模式的特殊用法,由普通字符(例如字符a-z)以及特殊字符(称为元字符,如/.*.?等)组成.   (2)基本元字符集及其含义       ^

Linux shell 命令行下查询外网IP

查询IP在网页上打开网址就可以显示,但是在命令行下可以安装w3m/Links/Lynx这些命令行浏览器,但是为了这个又感觉不方便,所以很多查IP网站提供了UNIX/LINUX的. 命令行查询(详细): UNIX/Linux: #curl cip.cc Windows:    >telnet cip.cc             >ftp cip.cc              命令行查询(纯ip): UNIX/Linux:    #curl ip.cip.cc 参考: http://www.c

linux ubuntu系统下,adb不是内部命令 (如何才能让adb命令可以使用)

linux ubuntu系统下,adb不是内部命令 解决方法: 1.sudo gedit ~/.bashrc 2.将下面的两句加到上面打开的文件里 export ANDROID_HOME=/home/jason/Develop_SDK/android-sdk-linux_86 export PATH=$PATH:$ANDROID_HOME/tools 最新的SDK要改为:$PATH:$ANDROID_HOMOE/platform-tools 注意:“/home/jason/Develop_SDK

linux查找目录下的所有文件中是否含有某个字符串

查找目录下的所有文件中是否含有某个字符串 find .|xargs grep -ri "IBM" find .|xargs grep -ri "IBM" -l \ :只用来屏蔽一个元字符的特殊含义. 如\*,\',\",\|,\+,\^,\. 等       .:(点)只匹配任意单字符.       pattern\{n\}:只用来匹配前面pattern出现的次数.n为次数.如a\{2\}匹配aa.       pattern\{n,\}:含义同上,但次数