zoukankan      html  css  js  c++  java
  • CentOS系统启动流程

    CentOS系统启动流程

     POST --> Boot Sequence(BIOS) --> Boot Loader(MBR) --> kernel(ramdisk) --> rootfs(readonly) --> switchroot --> /sbin/init(CentOS 5,6,7不同) --> 设置默认运行级别 --> 运行系统初始化脚本,完成系统初始化 --> 关闭启动对应级别下需要停止的服务,启动对应级别下需要开启的服务 --> 设置登录终端(启动终端图形终端)--> 操作系统启动完成

     

    CentOS系统启动流程(内核级别)

    1、POST:加电自检

      开 机加电后,系统自检硬件设备包括cpu、内存、硬盘、显示设备等,这个过程叫加电自检POST;一旦通电会自动读取ROM有个带电芯片CMOS程序并运行 即按次序查找可引导设备,第一个有引导程序的设备即为本次启动要用到的设备;引导程序叫bootloader引导加载器。

    2.BIOS:第一顺序启动的设备(基本输入输出系统 Basic Input and Cutput System)

       ROM中的信息一旦写入就不能进行修改,其信息断电之后也仍然保留。而CMOS是微机主板上的一块可读写的RAM芯片断电以后保存在上面的数据会自动消 失,需要主板电池供电;对CMOS中各项参数的设定要通过专门的程序,现在厂家将CMOS设置程序做到了BIOS芯片中,因此CMOS设置又通常叫做 BIOS设置。BIOS(基本输入输出系统)也是固化在当前主机ROM芯片中的代码,实现按次序查找各引导设备,第一个有引导程序的设备即为本次启动要用 到的设备。

    3.Boot Squence:引导加载程序启动内核

       按次序查找引导设备,第一个有引导程序的设备即为本次启动要用到的设备;

        bootloader引导加载器、程序:

         Windows:由ntlader引导加载器

         Linux:

          (1)LTLO:Linux Loder(无法支持大磁盘,1024后不能加载)

          (2)GRUB: Grand Uniform Bootloder(统一引导加载器)

               GRUB 0.X:Grub Legacy(传统版本)

               GRUB 1.X:Grub2 (第二版本)

       功能:提供一个菜单,允许用户选择要启动的系统或不同的内核版本,把用户选定多内核装载到RAM(内存)中的特点空间中,解压、展开,而后把整个系统控制权移交给内核,即完成把内核加载到内存空间中。

       Bootloader引导加载器是安装在硬盘或光盘甚至是U盘上的程序,系统加电后运行的第一段软件代码。  

       Bootloader引导加载程序位于磁盘中的MBR中,每个磁盘或每个磁盘中的分区中都有MBRMBR是磁盘上的第一个扇区又叫做主引导扇区,是计算机开机后访问硬盘时所必须要读取的首个扇区,分三部分:

      MBR:Master Boot Record(主引导记录)

       512bytes:

         446bytes:bootloader(引导程序LTLO或GRUB)

         64bytes:fat(分区表,文件系统分配表)

         2bytes:55AA(标记MBR有效)

       MBR是由分区程序(如Fdisk,Parted)所产生的,它不依赖任何操作系统,而且硬盘引导程序也是可以改变的,从而能够实现多系统引导。仅仅包 含一个64个字节的硬盘分区表。由于每个分区信息需要16个字节,所以对于采用MBR型分区结构的硬盘(其磁盘卷标类型为MS-DOS),最多只能识别4 个主要分区。所以对于一个采用此种分区结构的硬盘来说,想要得到4个以上的主要分区是不可能的。这里就需要引出扩展分区,扩展分区也是主分区 (Primary partition)的一种,但它与主分区的不同在于理论上可以划分为无数个逻辑分区,每一个逻辑分区都有一个和MBR结构类似的扩展引导记录 (EBR)。

     Linux中有多种引导加载程,常见的有最早的LILO,缺点:LILO无法支持大硬盘,如果内核或加载的系统位于1024 柱面以后的分区上,LILO是加载不了,但在安卓手机上应用较广泛;后来被GRUB取代,GRUB有两个版本GRUB 0.x(Grub Legacy)和GRUB 1.x(Grub2)两者从设计理念上完全不同。

      Linux中的引导加载程Bootloader有多种实现方式:

        LILO:LIinux LOader

        GRUB:Grand Uniform Bootloader

            GRUB 0.x:Grub Legacy

             GRUB 1.x:Grub2

      GRUB(Boot Lloader):

        bootloader:1st stage(对MBR而言bootloader是加载其第二阶段,不是加载内核)

        Partiton:filesystem driver,1.5 stage

        Partition:/boot/grub,2nd stage

        加载后可在操作系统之前提供一个操作系统(即一个接口),然后加载内核;

      Grub Legacy:分三阶段

        stage1:存放在MBR上

        stage1_5:存放在MBR之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统;

        stage2:磁盘分区(/boot/grub/)

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

      注意:当前硬件平台,主板BIOS必须能识别硬盘,然后BIOS才能加载硬盘中的Bootloader,磁盘中的Bootloader自身加载完以后,就能够识别当前主机上的硬盘设备了。

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

     stage2一般是挂载至/boot/grub/目录下;grub也有自己的配置文件:/boot/grub/grub.conf且通常有个符号链接文件:/etc/grub.conf;

     stage2的功用:

     (1)提供菜单或交互式接口;

     (2)能加载用户选择的内核或操作系统;

     (3)为菜单通过了保护机制。

    4.加载 kernel

    (1)通过grub加载到内核后,就在内存中解压并展开就可完成后续操作即内核自身初始化;分为四步:

       第一:探测可识别的所有硬件设备

       第二:加载硬件驱动程序;(有可能会借助于randisk加载驱动)

       第三:以只读方式挂载根文件系统

       第四:运行用户空间的第一个应用程序:/sbin/init

     (其中有可能会借助于randisk加载驱动,ramdisk:是基于内存的磁盘设备;以只读方式挂载根文件原因是防止内核中有bug,确保无问题后再改为读写方式;)

    (2)如果内核把已知根文件系统所在的磁盘设备驱动程序编译进内核(一般自己编译内核含此驱动),此时就不需要这个ramdisk,所以发行商提供的安装系统文件不可能包含所有驱动在内核中。

    这样,要想加载根文件系统,就要先加载根文件系统所在的磁盘设备驱动,而驱动就在根上因此,就不能依赖于根上的驱动程序来加载根文件系统;要借助于ramdisk临时根文件系统来加载根文件系统所在的磁盘设备驱动,从而加载根文件系统;

       ramdisk临时根文件系统不是操作系统发行商直接在光盘上自带的,而是在安装操作系统后临时生成的,它在安装操作系统后,能扫描当前主机硬盘设备的型号,并找到相关驱动做成一个临时根;所以这个临时根是为每个用户安装过程生成以后动态创建的。

       ramdisk临时根是把内存某段空间当做磁盘使用,而Linux内核特性是使用缓冲和缓存来加速对磁盘上的文件访问,这就是为什么在centos5上 使用ramdisk(initrd),在后来的centos6,7上使用的ramfs的原因,避免了在内存中的双缓冲和双缓存。

    spacer.gif

    5.挂载根文件系统

      一旦内核借助于ramdisk提供的临时根完成加载真正的根文件系统所在的设备,下一步就装载根文件系统,内核会自动把根文件系统所在的设备挂载至根上,所以说根是在内核中就是这个原因所在。

    6.根切换

      在挂载根文件系统时为了避免内核中有bug或操作过程中有bug导致根文件系统被损坏,先只读挂载根文件系统,加载完成后才读写挂载,完成整个挂载根文件系统后,直接去找/sbin/init程序,即开始运行用户空间的第一个程序。

    用户空间启动流程

    7./sbin/init程序

      init程序主要依赖于配置文件:/etc/inittab,大体分为:设定默认启动级别 --> 设定系统初始化脚本 --> 启动对应级别的服务 --> 打印各终端登录界面(如果级别为3处理提供文本登录界面,如果级别为5还提供图形登录界面)

    8. 设置默认运行级别

      (1)运行级别:为了系统的运行或维护等目的而设定的机制;

        0-6:共7个级别;

         0:关机,shutdown

         1:单用户模式(single user),root用户,无须认证,维护模式;

         2:多用户模式(multi user),会启动网络功能,但不会启动NFS,维护模式;

         3:多用户模式(multi user),完全功能模式,文本界面;

         4:预留级别:目前无特别使用目的,但习惯以同3级别功能使用;

         5:多用户模式(multi user),完全功能模式,图形界面;

         6:重启,reboot

      (2)配置文件:/etc/inittab定义了很多功能,每一行定义一种操作(action)以及与之对应的process(仅适用于CentOS 5),一行就定义了init要执行的任务,甚至是一堆任务,每一行的语法格式为:                                                             id:runlevels:action:process

      id为一个任务的标识符;

      runlevels:在哪些运行级别下启动此任务;例:3,2345,也可为空表示所有级别;

      action:在什么条件下启动此任务;

        wait:等待切换至此任务所在的级别时执行一次(刚刚切换进来时);

        respawn:一旦此任务终止时,就自动重启;(如:登录终端执行logout登出后会再次启动)

        initdefault:设定默认允许级别;此时process省略为空;

        sysinit:设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit脚本;(CentOS 5,6都用到此脚本,CentOS 7是靠systemd完成的),在CentOS 6中仅保留此配置文件中设定启动运行级别的功能。

        process:具体任务;通常为应用程序,或脚本,或二进制的程序,取决于自定义。

    9.系统初始化脚本

    系统初始化脚本:/etc/rc.d/rc.sysinit

    (1)设置主机名;

    (2)设置欢迎信息;

    (3)激活udev和selinux;

    (4)挂载/etc/fstab文件中定义的所有文件系统;

    (5)检测根文件系统,并以读写方式重新挂载根文件系统;(重新挂载是指根文件检测完之后)

    (6)设置系统时钟;

    (7)根据/etc/sysctl.conf文件来设置内核参数;

    (8)激活lvm即软raid设备;

    (9)激活swap设备;

    (10)加载额外设备的驱动程序;(内核加载驱动只加载根文件系统的)

    (11)清理操作;

    注意:在init配置文件:/etc/inittab中,有一行内容是定义/etc/rc.d/rc.sysinit,此脚本文件是负责完成系统初始化的脚本文件。

    10.关闭/启动对应级别下的服务

      脚本文件/etc/rc.d/rc作用为当级别切换时启动或停止服务;此脚本接受传递的参数给脚本中$runlevel变量,然后,读取/etc /rc$runlevel.d/K*和/etc/rc$runlevel.d/S*所有文件,这些文件就是为什么开机启动后,有些服务会自动启动,有些服 务没有启动的原因。

    K*:要停止的服务,K##*,优先级,数字越小,越优先关闭,依赖的服务先关闭,然后再关闭被依赖的。

    S*:要启动的服务,S##*,优先级,数字越小,越是优先启动,被依赖的服务先启动,而依赖的服务后启动。

    /etc/rc.d/init.d目录还有个链接目录为/etc/init.d目录,这两目录下文件相同。

    11.启动终端(图形终端)

     操作系统启动完成

    相关概念:

       Linux系统的组成部分:内核+根文件系统

       内核:进程管理、内存管理、网络协议栈、文件系统、驱动程序。

       IPC(Inter-Process Communication进程间通信):就是指多个进程之间相互通信,交换信息的方法。Linux IPC基本上都是从Unix平台上继承而来的。主要包括最初的Unix IPC,System V IPC以及基于Socket的IPC。另外,Linux也支持POSIX IPC。

       运行中的系统环境可分为两层:内核空间、用户空间;

          内核空间:内核代码(系统调用)

          用户空间:应用程序(进程或线程)

       内核设计流派:

          单内核设计:把所有的功能集成于同一个程序;(Linux)

          微内核设计:每种功能都使用一个单独的子系统实现;(Windows solarls)

       Linux内核特点:

         (1)支持模块化:.KO(kernel object)

         (2)支持模块运动时动态装载或卸载

       组成部分:

          核心文件:/boot/Vmliuz-VERSION-release

            ramdirk:

               CentOS5:/boot/initrd-VERSION-release.img

               CentOS6,7:/boot/initramfs-VERSION-release.img

          

  • 相关阅读:
    dedecms内容管理系统使用心得
    flex>样式和主题 小强斋
    flex>样式和主题 小强斋
    flex>HttpService 小强斋
    Flex>连接WebService 小强斋
    flex>HttpService 小强斋
    Struts2>Cannot find the tag library descriptor for /strutstags 小强斋
    flex>HttpService 小强斋
    Flex>连接WebService 小强斋
    Flex>连接WebService 小强斋
  • 原文地址:https://www.cnblogs.com/swordxia/p/5476551.html
Copyright © 2011-2022 走看看