Linux系统启动流程

对于linux系统的初学者来说,理解并掌握linux系统启动流程能够使你够深入的理解linux系统,还可以通过系统的启动过程来分析问题解决问题。

  Linux系统的启动流程


  关于linux系统的启动流程可以分为以下步骤:

    POST(加电自检)–>加载BIOS(Basic Input/Outpu System)–>确定启动设备(Boot sequence)、加载Boot Loader–>加载内核(kernel)初始化initrd–>运行/sbin/init初始化系统–>打印用户登录提示符

   下面让我们逐步剖析说明系统启动过程:

   1、POST开机自检

      linux开机加电后,系统开始开机自检,该过程主要对计算机各种硬件设备进行检测,如CPU、内存、主板、硬盘、CMOS芯片等,如果出现致命故障则停机,并且由于初始化过程还没完成,所以不会出现任何提示信号;如果出现一般故障则会发出声音等提示信号,等待故障清除;若未出现故障,加电自检完成。

   2、开机自检完成,查找可启动设备,加载主引导目录(MBR)

      开机自检完成后,CPU首先读取位于CMOS中的BIOS程序,按照BIOS中设定的启动次序(Boot Sequence)逐一查找可启动设备,找到可启动的设备后,去该设备的第一个扇区 中读取MBR,那么MBR是什么哪?它又有什么作用哪?

       MBR存在于可启动磁盘的0磁道0扇区,占用512字节,它主要用来告诉计算机从选定的可启动设备的哪个分区来加载引导加载程序(Boot loader),MBR中存在如下内容:

           (1) Boot Loader 占用446字节,存储有操作系统(OS)相关信息,如操作系统名称,操作系统内核位置等,它的主要功能是加载内核到内存中运行。

           (2) Partition Table 分区表,占用64字节,每个主分区占用16字节(这就是为啥一块硬盘只能有4个主分区啦^_^)

           (3)分区表有效性标记占用2字节 

       CPU将MBR读取至内存,运行GRUB(Boot Loader常用的有GRUB和LILO两种,现在常用的是GRUB),GRUB会把内核加载到内存去执行。

       blob.png

       由上图可以看出,内核文件存在于/boot目录下,但是在GRUB加载内核时,连/还没有被加载,它是怎么在磁盘上找到内核的哪?我们来查看一下GRUB的配置文件可以找到答案。

       blob.png

       在/boot/grub/grub.conf中可以看到 root (hd0,0)这一行实际上是指定了/目录的所在的位置,但这个根并不是真正的根,而是/所在的位置,可以理解成/boot是处在(hd0,0)/boot,而这里的(hd0,0)指的是第一个磁盘的第一个分区,GRUB不是通过文件系统来访问内核的,以因为此时内核还没有启动,不存在文件系统,而是直接访问      第一个磁盘的第一个分区(通过MBR中的分区表来识别分区),而识别MBR中的分区的文件系统,则是由GRUB通过加载自身携带的系统文件来实现的,这些文件在/boot/grub目录中

      blob.png

    大家可以看到,红色标出的地方就是GRUB可以识别的文件系统的类型了。事实上,总结一下,grub启动过程可以分为两个步骤:

      第1阶段   BIOS加载MBR中的GRUB(GRUB第一阶段的文件),而GRUB只有446字节,无法实现太多功能,所以利用该阶段的文件去加载1.5阶段的文件(/boot/grub/下的文      件)

      第1.5阶段 用来加载识别文件系统的文件,识别完系统后才可以找到/boot目录。

      第2阶段  寻找内核并加载到内存中。

     下图是GRUB启动过程中所用的的文件

     blob.png 

   3、加载内核,初始化initrd

     GRUB把内核加载到内存后展开并运行,此时GRUB的任务已经完成,接下来内核将会接管并完成 探测硬件–>加载驱动–>挂载根文件系统–>切换至根文件系统(rootfs)–>运行/sbin/init完成系统初始化。但是,问题来了,要访问根文件系统必须要加载根文件系统所在的设备,而这时根文件系统又没有挂载,要挂载根文件系统有需要根文件系统的驱动程序,这是一个典型的先有鸡先有蛋的问题啊!为解决这个问题,GRUB在加载内核同时,也把initrd加载到内存中并运行,那么initr又起到了什么作用哪?

     blob.png

   initrd展开后的文件

     blob.png  

   linux中/下的文件 

     blob.png  

   我们可以看到,其实initrd文件其实是一个虚拟的根文件系统,里面有bin、lib、lib64、sys、var、etc、sysroot、dev、proc、tmp等根目录,它的功能就是讲内核与真正的根建立联系,内核通过它加载根文件系统的驱动程序,然后以读写方式挂载根文件系统,至此,内核加载完成。

    4、运行/sbin/init,进行系统初始化 

    内核并加载进内存运行并以读写方式挂载完根文件系统后,执行第一个用户进程init,init首先运行/etc/init/rcS.conf脚本,如下图

   blob.png

   可以看到,init进程通过执行/etc/rc.d/rcS.conf首先调用了/etc/rc.d/rc.sysinit,对系统做初始化设置,我们来看看这个脚本都是做了些什么哪?

  blob.png

   事实上init执行/etc/rc.d/rc.sysinit的初始化将会做很多设置:

        1、获得网络环境 

       2、挂载设备 

       3、开机启动画面Plymouth(取替了过往的 RHGB) 

       4、判断是否启用SELinux 

       5、显示于开机过程中的欢迎画面 

       6、初始化硬件 

       7、用户自定义模块的加载 

       8、配置内核的参数 

       9、设置主机名 

       10、同步存储器 

       11、设备映射器及相关的初始化 

       12、初始化软件磁盘阵列(RAID) 

       13、初始化 LVM 的文件系统功能 

       14、检验磁盘文件系统(fsck) 

       15、设置磁盘配额(quota) 

       16、重新以可读写模式挂载系统磁盘 

       17、更新quota(非必要) 

       18、启动系统虚拟随机数生成器 

       19、配置机器(非必要) 

       20、清除开机过程当中的临时文件 

       21、创建ICE目录 

       22、启动交换分区(swap) 

       23、将开机信息写入/var/log/dmesg文件中

       init执行完/etc/rc.d/rc.sysinit后,将会执行/etc/inittab来设定系统运行的默认级别:

       blob.png

       如上图,linux中共有[0-6]七个运行级别,而我自己系统的默认运行级别是3.

              设定玩系统默认运行级别以后,接着调用/etc/rc.d/rc脚本,这个脚本接收默认运行级别参数后,依脚本设置启用或停止/etc/rc.d/rc[0-6].d/中相应的程序,如下图,看一下我系统运行默认级别(级别)3下的内容吧

    blob.png

    如图示,/etc/rc.d/rc[0-6].d/下的文件在系统初始化阶段,以S开头的将被启动,以K开头的将被关闭,文件名K/S 后面的的数字代表优先级,数字越小优先级越高,优先执行。

    最后,将执行/etc/rc.d/rc.local脚本,可以根据自己的需求将一些执行命令或者脚本写到其中,当开机时就可以加载。

    5、打印登录提示符

      系统初始化完成后,init给出用户登录提示符(login)或者图形化登录界面,用户输入用户和密码登陆后,系统会为用户分配一个用户ID(uid)和组ID(gid),这两个ID是用户的身份标识,用于检测用户运行程序时的身份验证。登录成功后,整个系统启动流程运行完毕!

 

原创文章,作者:Silently,如若转载,请注明出处:http://www.178linux.com/4457

(0)
SilentlySilently
上一篇 2015-05-18
下一篇 2015-05-18

相关推荐

  • 马哥教育网络班20期+第五周博客作业

    1、显示/boot/grub/grub.conf中以至少一个空白字符开头的行; ]# grep  "^[[:space:]]\+" /boot/grub/grub.conf 2、显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行; ]#…

    Linux干货 2016-07-12
  • Linux网络属性配置(三)修改配置文件&& CentOS 7 网络配置

    Linux网络属性配置(三)&& CentOS 7网络配置 Linux网络属性配置(三)修改配置文件&& CentOS 7 网络配置 Linux网络属性配置(三)修改配置文件 IP、MASK、GW、DNS相关配置文件: /etc/sysconfig/network-scripts/ifcfg-IFACE 路由相关配置文件: /…

    Linux干货 2016-07-07
  • 显示列表和复制文件的各种实例

    显示/var目录下所有以l开头,以一个小写字母结尾,且中间至少出现一位数字(可以有其它字符)的文件或目录。 [root@localhost tmp]# ls -d /var/l*[[:lower:]] 显示/etc目录下,以任意一个数字开头,且以非数字结尾的文件或目录。 [root@localhost tmp]# ls -d /etc/[0-9]*[^0-9…

    Linux干货 2018-03-01
  • 计算机基础

    计算机组成 计算机发展史 采用电子管的第一代计算机(1946~1959年) 第一代计算机的内部元件使用的是电子管。第一代计算机主要用于科学研究和工程计算。 采用晶体管的第二代计算机(1960~1964年) 第二代计算机的内部元件使用的是晶体管,晶体管比电子管小得多,处理更迅速、更可靠。第二代计算机主要用于商业、大学教学和政府机关。 采用集成电路的第三代计算机…

    Linux干货 2017-12-03
  • Linux基础入门1

    Linux基础入门1 目录 计算机组成及其功能 简述Linux发行版 Liunx哲学思想 Linux命令格式 Linux系统获取命令帮助信息 Linux基础目录简述 1. 计算机组成及其功能 ENIARC:埃尼阿克,世界上第一台通用计算机,诞生于1946年美国宾夕法尼亚大学。 冯诺依曼体系-计算机五大基础部件:运算器、控制器、存储器、输入设备和输出设备。 1…

    2017-12-19
  • N25-第9周博客作业

    1、写一个脚本,判断当前系统上所有用户的shell是否为可登录shell(即用户的shell不是/sbin/nologin);分别这两类用户的个数;通过字符串比较来实现; #!/bin/bash # 统计登录用户和非登陆用户的个数 # author: han declare -i loginnum=0 declare -i nologinnum=0 whil…

    Linux干货 2017-03-10

评论列表(1条)

  • stanley
    stanley 2015-05-18 17:49

    哇哦,专业!只是标签需要加下哦