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 17:47
下一篇 2015-05-18 17:50

相关推荐

  • shell编程之函数

    函数:函数function是由若干条shell命令组成的语句块,实现代码 重用和模块化编程      1)函数的定义: 可在 命令行,脚本的一部分,只有函数的单独文件 中定义        两部分组成:函数名和函数体;函…

    Linux干货 2016-08-21
  • vim文本编辑器

    Vim文本编辑器不能单独编写二进制文件,但是可以配合xxd命令编辑二进制文件 1、文本编辑种类: 行编辑器: sed 全屏编辑器:nano, vi、vim(其是改进的vi) 其他编辑器: Gedit,一个简单的图形编辑器 Gvim,一个Vim编辑器的图形版本 2、打开文件 用法#vim  [OPTION]… FILE… +#…

    Linux干货 2016-08-15
  • 在马哥学习linux第一天的感受

         来马哥教育好几天了,昨天算是正式开始,在昨天早上,举行了开班典礼,各位老师助教为我们介绍了在马哥教育进行培训的相关注意事项,下午进行了两场测试,首先有一个摸底测试,不得不说我真的是太菜了,除了一些比较简单的题目我还有些把握,相当一部分我都是似曾相识,但是也不是很确定,还有很大一部分我根本听都没听说过,看到别人都写的满满…

    Linux干货 2017-07-11
  • bash的特性总结

    什么是bash:       shell作为用户与计算机内核交互的接口,是用户与计算机沟通的桥梁,而bash(borne again shell)是众多shell里面最为流行一种,bash作为众多shell里面的一种有着众多的特性,掌握bash的众多特性将会是我们今后学习linux必经之路。&nbs…

    Linux干货 2015-10-27
  • 救援模式安装RPM

    救援模式安装RPM 步骤如下: (1)先让RPM“自杀”掉,必须要使用忽略依赖选项—nodeps,否则卸载不了RPM程序。 (2)卸载完成后,将机器重启,按F2键进入机器的BIOS模式,如下图选择CD-ROM启动,最后按F10保存退出。 (3)机器将会从光驱上使用光盘文件做引导启动,如下图界面,相信大家都非常熟悉,该界面在我们安装新系统的时候,也会见到。啰嗦…

    Linux干货 2016-08-26
  • 轻松实现源码打包安装[原创]

    通常我们在Linux/Unix下安装一平台时往往需要十几甚至更多安装包,这些源码包来源于网络、本地硬盘、移动设备。有时碰到网络不畅通或下载地址失效会带来很多麻烦,一个好方法便是将常用的软件包下载到本地硬盘存放。问题是久而久之连自己都不晓得哪些包才是适用的。现用makeself来实现自解压倒安装倒是一个很好的解决方案,下面以制作Func客户端安装包为例。 一、…

    Linux干货 2015-03-27

评论列表(1条)

  • stanley
    stanley 2015-05-18 17:49

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