LINUX 操作系统启动过程


        通过一段时间的学习已经对linux有了一定的了解,接下来就开始研究一下linux 操作系统的启动过程吧。当然这是为了让大家比较容易发现linux启动过程中容易发生问题的地方以及解决办法。


    目录

    一、简述

    二、详解

      1、BIOS加电自检

       2、读取MBR

    三、加载内核

       1、Grub引导分为三个阶段

       2、Stage1.5阶段存在的原因

       3、详解三阶段引导过程

    四、调用init进程

      1、init的功能作用

      2、init初始化流程

      3、init 执行 run-level 的各个服务启动

      4、init 执行 /etc/rc.d/rc.local

      5、init 执行终端机仿真程序mingetty来启动程序

                五、linux系统启动流程图        


    一、简述

      简单的说linux的启动过程如下:

    1.加载BIOS的硬件信息及自检,并根据bios设置读取第一启动设备。

    2.读取并执行第一启动设备内MBR的boot loader (即grub、等程序)

    3.根据boot loader的设置加载你kernel,kernel会开始检测硬件与加载驱动程序

    4.在硬件驱动成功后,内核会调用init进程,init进程会取得runlevel信息(启动级别)

    5.init 执行 /etc/rc.d/rc.sysinit 档案来准备软件执行的作业环境 (如网络、时区等)

    6.init 执行 run-level 的各个服务启动 (script 方式)

    7.init 执行 /etc/rc.d/rc.local 档案

    8.init 执行终端机仿真程序mingetty来启动程序,最后就等待用户登入

                        图示:

                    浅谈-LINUX 操作系统启动过程_第1张图片 

                    上图来自chunaunix博客http://blog.chinaunix.net/uid-26495963-id-3066282.html



    二、详解

    1、BIOS加电自检

        Bios(base input/output system )基本输入输出系统,基本上有点计算机基础的同学多少都是有些了解的。其实是一组固化在计算机ROM芯片上的程序,它保存着计算机最重要的基本输入输出程序、开机后自检程序和系统自启动程序,它可以从cmos读取计算机的硬件信息。

    BIOS主要分为三部分:

        第一部分:对刚开机加电的计算机硬件进行检测,称为加电自检(POST power on self test)

主要功能检查计算机各硬件部分,对于计算机硬盘、主板、各接口、及键盘等作出检查并对检测给予相关提示及报警信息。

        第二部分:初始化,主要对硬件设备参数的设置和检测,当计算机启动时读取这些参数并与实际硬件设置比对。

        第三部分:引导程序,功能是引导操作系统。Bios从第一启动设备读取扇区MBR(主引导记录),如果没有找到MBR,则显示没有引导设备。如果找到会把电脑控制权转给MBR,有引导记录启动操作系统,bios的任务就完成了。

    2、读取MBR

        MBR(Master Boot Record)主引导记录。硬盘的0柱面0磁头0扇区称为主引导扇区。它有三部分组成,主引导程序(boot loader)、硬盘分区表DPT(disk partition table) 和硬盘有效标志(55AA)【hexdump  –C  -n 512 /dev/sda(硬盘) 可以查看】其结构如下:

          浅谈-LINUX 操作系统启动过程_第2张图片

硬盘分区表主要包含partitionID(5:延伸 82:swap  83:linux  8e:lvm fd:RAID)





三、加载内核

1、Grub引导分为三个阶段

            通常大家认为是两个阶段这里给大家分享一下linux启动中1.5阶段

    stage1:stage1阶段是直接被写入MBR中的(也就是大家说的bootloader)

    stage1.5:存放在磁盘mbr之后的扇区中,让stage1中bootloader能识别stage2所在的分区的文件系统;

    stage2:磁盘分区(/boot/grub/stage2)删除时候系统无法启动。

        注意:根据stage2阶段文件定义内容找grub.conf文件然后根据这个文件里定义的内容找boot下的内核vmlinuz..与驱动模块initamfs..,至此有bootloader到grub加载内核文件与模块系统引导启动。

2、Stage1.5阶段存在的原因

        Stage:通常大家都认为grub放在mbr里,但mbr太小了前面只有446个字节,所以分为2段引导,第一段存放在MBR中,第二段存放于内核文件系统中,第一段引导完成可以找到第二段。但是,第二段是存放在内核文件中的,此时还没有挂载文件系统,那么如何让可以访问到第二段的引导配置文件,就需要借助1.5阶段,有它来协助stage1段来访问stage2阶段。Stage1.5通常位于stage1后的扇区(或理解为mbr后的扇区内)由于stage2

在内存中存放可以使用文件系统不确定,所以这就是有多个1.5阶段的原因。

3、详解三阶段引导过程

        详细说明:引导加载程序先读取MBR上的gurb第一阶段,由于MBR很小只有512字节采用grub这种方式引导程序,随后读取扇区中的stage1.5阶段,读取1.5阶段以后从而就能驱动第二阶段stage2所在的磁盘分区,stage2是存放在磁盘分区上的还包括了内核文件及ramdisk等都在这个分区上存放的;这就是为什么通过Bootloader之grub就能够加载内核文件的原因。

        当然硬盘设备能识别,并不代表硬盘上的文件系统能识别,因为文件系统是额外附加的一层软件组织的文件结构,所以要能够对接一种文件系统,必须要用到文件系统驱动;对应的应用程序必须能识别和理解这样的文件系统才可以,这种程序就称为文件系统驱动;grub的1.5阶段就是给gurb提供了文件系统驱动的,从而就能够访问对应的第二阶段和内核所在的分区了,这通常是一个基本磁盘分区;所以grub第二阶段以及内核和ramdisk文件通常都会放在一个基本磁盘分区上;因为grub驱动不了逻辑卷这种高级接口(所以在给boot分区的时候不要使用逻辑卷当然绝大多数的生产环境也不会去使用逻辑卷的)。


四、调用init进程

1、init的功能作用

        在核心加载完毕、进行完硬件侦测与驱动程序加载后,此时你的主机硬件应该已经准备就绪了(ready) , 此时内核会主动调用第一个程序,那就是 /sbin/init (记得进程管理那章说过init的PID为1)。 /sbin/init 最主要的功能就是准备软件执行环境,包括系统的主机名、网络设定、语言处理、文件系统格式及其它服务等。 而所有的动作都会通过init 的配置文件,亦即是 /etc/inittab 来进行,而 inittab 内还有一个很重要的作用,那就是默认的runlevel(开机执行级别)

    0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动

    1:单用户工作状态,root权限,用于系统维护,禁止远程登陆

    2:多用户状态(没有NFS)

    3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式

    4:系统未使用,保留

    5:X11控制台,登陆后进入图形GUI模式

    6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动

2、init初始化流程

        在整个linux开始各项服务之前应该先设置后系统环境。主要利用/etc/init.d/sysinit这个脚本来这是系统环境。下面就是init初始化linux系统环境的流程(不同的linux发行版也用不同之处)。

        (1)获取网络环境与主机类型。首先会读取网络环境设置文件"/etc/sysconfig/network",获取主机名称与默认网关等网络环境。

    (2)测试与股灾内存设备/proc及usb设备/sys。

        除了/proc外,系统会主动检测是否有usb设备,并主动加载usb驱动,尝试载入usb文件系统。

    (3)决定是否启动SELinux。

    (4)启动系统随机数设备(产生随机数功能)。

    (5)设置终端的控制台的字体。

    (6)设置显示与启动过程中的欢迎界面

    (7)设置系统时间(clock)读取/etc/sysconfig/clock的。

    (8)接口设备的检测与即插即用(pnp)参数的测试。

    (9)用户自定义模块的加载。

        通过"/etc/sysconfig/modules/*.modules"加入自定义的模块,此时会加载到系统中。

    (10)加载内核的相关设置

         系统会主动读取/etc/sysctl.conf文件的设置值

    (11)设置主机名与初始化电源模块管理(ACPI)

    (12)初始化软件磁盘阵列:主要通过/etc/mdadm.conf来设置好的

    (13)初始化LVM的文件系统功能。

    (14)以fsck检验磁盘文件系统:会对filesystem check

    (15)进行磁盘配额quota的转换(非必要)。

    (16)重新以读取模式载入系统磁盘。

    (17)启动quota功能。

    (18)启动系统伪随机数生成器(pseudo-random)

    (19)清楚启动过程中的临时文件

    (20)将启动相关信息加载/var/log/dmesg文件中

3、init 执行 run-level 的各个服务启动

        内核加载完成并通过/etc/rc.d/rc.sysinit加载系统模块和初始化相关硬件设备信息后,centos已经可以正常工作了。但再次之前系统还需要启动各项服务已满足需求。

        系统会根据/etc/inittab文件里的run-level设置(上文提到过)来设置启动项。

        假如你的系统级别现在为5那系统就会调用/etc/rc.5.d/内的脚本程序:

        找到/ect/rc.5.d/K##* 开头的文件,并进行/ect/rc.5.d/K##* stop操作。

        找到/ect/rc.5.d/S##* 开头的文件,并进行/ect/rc.5.d/S##* start操作。

        (## 代表数字    * 文件名)

4、init 执行 /etc/rc.d/rc.local

        /etc.rc.d/rc.local 用户自定义开机启动程序配置文件。如果将脚本或程序写入/etc.rc.d/rc.local配置文件中那系统启动时会直接启动。系统在加载内核初始化环境之后调用run-level启动开机启动程序,最后调用/etc.rc.d/rc.local文件查看是否有需要开机启动的脚本等。

5、init 执行终端机仿真程序mingetty来启动程序

        mingetty程序能打开终端、设置模式。同时它会 显示一个文本登录界面,这个界面就是我们经常看到的登录界面,在这个登录界面中会提示用户输入用户名,而用户输入的用户将作为参数传给login程序来验 证用户的身份。

mingetty将提示入户输入程序(以login为例),调用login程序,login验证通过后将执行配置文件/etc/profile(如果存在),由于mingetty是用来调用login进行身份验证的所有这是个守护进程杀死后自动重生。

系统启动时init调用mingety程序等待用户登录。


五、linux系统启动流程图


浅谈-LINUX 操作系统启动过程_第3张图片