开机启动流程

Centos的开机启动流程

开机流程图.png


具体步骤解释: 

第一步:加电自检:POST

        加电自检是检测硬件设备是否正常运行,以及一些外围设备的输入输出是否存在。

自检功能的实现是依靠BIOS软件程序实现的

BIOS即基本输入输出系统,它是装载在一个硬件芯片COMS上的,加电过程就是给硬件COMS通电,使其启动BIOS程序,然后BIOS会根据CMOS上面的配置信息去读取其他的硬件设备信息并检测是否存在,能够正常运行,之后进行硬件设备的初始化。

第二步:加载MBR

     按次序查找各引导设备(引导设备为自定义),第一个有引导程序的设备即为本次启动要用到的设备。这里以mbr为例

     在硬件设备初始化之后,BIOS会列出一些可启动的装置顺序,接下来就去读取第一个可以启动的设备中操作系统的核心文件,由于不同的系统的文件系统格式不同,为了避免不兼容的问题,就需要一个管理程序来处理这些核心文件的加载问题,即Boot Loader(引导加载程序) ,Boot Loader是一个程序,它存放于硬盘中的第一个扇区内,就是MBR(主引导记录)中。

     MBR:主引导记录

        总字节数:512bytes

               446bytes:存储BootLoader,引导加载器

               中间64bytes:分区表,每16bytes标识一个分区

               最后2bytes:前面信息的有效性标识,55AA表示前面510bytes有效

      加载MBR主引导记录

第三步:GRUB菜单

GRUB:统一引导加载器

Centos56:GRUB0.X Grub legacy

Centos7:GRUB1.X Grub2

查看grub版本信息:grub –version

由于MBR446字节太小,不足以提供Grub的功能实现,所以Grub就把其功能分为三段

Bood Loader:1阶段 功能:运行主程序,这个程序必须要被安装在启动区,即MBR中,因为MBR的空间有限,因此在MBR中仅安装Boot Loader的最小程序,并没有安装Boot Loader的相关配置文件

Partition:filesystem driver 1.5阶段 功能:在MBR随后的扇区中存放,主要用于与第二阶段所在分区的文件系统进行交互

Partition:/boot/grub 2阶段 功能:通过Boot Loader加载所有配置文件及相关的环境参数信息,这些配置文件及相关的环境参数都存放与磁盘分区上的/boot目录中。该阶段提供了Grub启动菜单和交互式的grubshell

Boot Loader原本是用来加载内核的,这里让Bood Loader去加载Grub的第二个阶段,第二阶段完成后,由它完成加载内核。

    Boot Loader的第一个功能是去识别、加载操作系统中的核心文件,并提交到内存中,从而启动操作系统。不同的操作系统的文件格式不同,因此每一个操作系统都有自己的Boot loader程序

      Boot Loader的第二个功能是提供一个菜单,允许用户选择要启动的系统或不同的内核版本,把用户选定的内核装载到MBR中的特定空间,解压、展开,而后把系统的控制权移交给内核;

第四步:加载系统内核 Kernel

      Bood Loader开始读取炒作系统内核文件后,接下来就会将内核文件解压后装在到内存当中,然后根据内核提供的功能开始测试与加载各个设备,这里的设备检查与之前的BIOS自检不同,此时内核程已经完全接管了BIOS的工作,之后的操作都是由内核来完成的。内核文件通常放置在/boot/目录中,并且是一个以vmlinuz开头的文件。

       此时内核程序还没有加载到磁盘,又如何去读取文件系统上的内核文件呢? 为了解决这个问题,我们采用了一种叫做虚拟文件系统来解决这个问题,虚拟文件系统(Initial RAM DISK,同样它也放置在/boot/目录下面

       Centos5的虚拟文件系统是基于ramdisk

           文件为:/boot/initrd-VERSION-release.img

        制作此文件工具:mkinitrd

       Centos67的虚拟文件系统是基于ramfs

            文件为:/boot/initramfs-VERSION-erlease.img

        制作此文件工具:dracutmkinitrd

    Linux内核的特征之一:使用缓冲和缓存来加速对磁盘上的文件访问

        ramdisk:把内存当作磁盘

        ramdiskàramfs

      这两种文件的特点是:能够通过Bood Loader程序将其加载到内存中,然后此种文件会被解压缩并且在内存中模拟一个根文件系统,这个根文件系统能够提供一个可以运行的程序,通过该程序可以加载在启动过程中所需要的核心模块(如:RAIDLVMSCSI等文件系统与磁盘的驱动程序),加载完成后,会协助内核重新呼叫/sbin/init来执行后续的正常启动

    内核的功能:

  探测可识别到的所有硬件设备(CPU、硬盘、网卡等)

  加载硬件驱动程序(有可能会借助于ramdisk加载驱动)

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

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

第四步:启动第一个进程 /sbin/init

      在内核、硬件及驱动信息加载完毕后,内核会呼叫用户控件的第一个执行程序/sbin/init,init程序的主要功能是准备软件运行环境,包括系统的主机名称、网络配置、文件系统格式等其他服务的启动管理。而这些都是通过init的配置文件来定义的。

  Init的配置文件:

       Centos5:采用SysV init方式

             特点:启动用户空间的服务程序,通常通过脚本进行,有依赖关系的服务将串行启动,所以,就导致了centos5的系统启动非常缓慢。

             配置文件为:/etc/inittab

       Centos6:采用Upstart方式

             特点:守护进程间的通信依赖于D-Bus进行,因此,可以基本实现类似并行的方式启动

             配置文件:/etc/inittab /etc/init/*.conf

       Centos7:采用Systemd方式

             特点:服务只有在第一次被访问时才会真正启动起来,centos7系统的启动过程非常快。

             配置文件:/usr/lib/system/* /etc/system/system/*

init的配置文件中有一个非常重要的配置项,就是默认的系统启动级别,分为一下几种:

10:关闭所有服务; 关机

21:维护模式,单用户模式,root用户直接登陆,多用于系统维护

32:维护模式,多用户模式,需要用户认证,会启动网络服务,但不支持FNS

43:正常级别,完全的多用户模式,文本界面

54:预留级别,默认与3级别相同

65:正常级别,完整的图形界面多用户模式

76:关闭所有服务;重启

36级别用的比较多

切换模式的方式为:init[0-6]

查看当前运行级别:runlevel who –r

Centos5的配置文为/etc/inittab

打开配置文件:

id:runlevel:action:process     //默认runlevel配置

解释:id:一个任务的标识符

      runlevels:在哪些级别启动此任务,#####代表上述的级别) 也可以为空,表示所有级别

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

           wait:等待切换至此任务所在的级别时执行一次

           respawn:此任务终止时,就自动重新启动

           initdefault:设定默认运行级别;此时process省略

           sysinit:设定系统初始化方式,此处一般指定/etc/rc.d/rc.sysinit脚本

si:sysinit:/etc/rc.d/rc.sysinit    //系统软件运行环境的脚本

/etc/rc.d/rc.sysinit为初始化用户空间环境,会执行许多系统初始化任务,在完成初始化脚本后,系统还会启动对应级别下折定为要启动的服务,关闭那些设定为要停止的服务。

7个不同的runlevel 需要启动的服务的scripts放置位置:

l0:0wait/etc/rc.d/rc 0 <=runlevel 0/etc/rc.d/rc0.d

l1:1wait/etc/rc.d/rc 1 <=runlevel 1/etc/rc.d/rc1.d

l2:2wait/etc/rc.d/rc 2 <=runlevel 2/etc/rc.d/rc2.d

l3:3wait/etc/rc.d/rc 3 <=runlevel 3/etc/rc.d/rc3.d

l4:4wait/etc/rc.d/rc 4 <=runlevel 4/etc/rc.d/rc4.d

l5:5wait/etc/rc.d/rc 5 <=runlevel 5/etc/rc.d/rc5.d

l6:6wait/etc/rc.d/rc 6 <=runlevel 6/etc/rc.d/rc6.d

/etc/rc.d/rc#.d/下的所有链接文件来决定如何启动关闭服务,所有以S开头的链接文件,都会被传递start参数以启动;所有以K开头的链接文件;都会被传递stop参数以停止

Init的处理流程

Init是通过自上而下的读取inittab文件来一次执行的,因此init的处理流程是:

1、 读取默认的runlevel,这里使用的是默认级别3

2、 使用/etc/rc.d/rc.sysinit进行系统的初始化

3、 由于采用的是3级别,因此只能进行l3:3:wait:/etc/rc.d/rc3 其他的忽略

4、 配合好[ctrl]+[alt]+[del]组合键的功能

5、 配置不断电系统pfpr两种机制

6、 启动mingetty6个终端

7、 如果是5级别,则会以/etc/X11/prefdm-nodaemon启动图形化界面

如果不想启用6个终端,可以将多余的注释掉 #即可

init执行的第二步执行系统初始化过程,init是根据/etc/rc.d/rc.sysinit中定义的内容进行系统初始化,做一下事情:

1、  根据配置文件中的设定来设定主机名(读取/etc/sysconfig/network文件中的HOSTNAM进行)

2、  打印文本欢迎信息

3、  激活SELinuxudev

4、  挂载所有定义在/etc/fstab文件中的文件系统

5、  激活swap设备

6、  检测根文件系统,并以读写的方式挂载

7、  设置系统时钟

8、  根据/etc/sysctl.conf文件设定内核参数值

9、  激活LVMRAID设备

10、            加载额外的设备驱动程序

11、            清理操作

服务的启动

       服务的启动停止是通过inittab里面提到的l3:3wait:/etc/rc.d/rc 3配置,实际上是通过/etc/rc.d/rc3.d/下的所有链接文件来决定如何启动或关闭服务的。

       /etc/rc.d/rc3.d下的所有链接文件其实都是在/etc/init.d/下面的所有脚本,这些脚本遵循LSB服务脚本的定义规范,接受至少四个基本参数:{start|stop|restart|status}

start:启动服务

stop:停止服务

restart:重启服务

status:查看服务状态

  脚本在指定级别启停的控制方法:

      脚本开头添加这些项:

#chkconfig: 哪些级别 启动数 停止数  例如: #chkconfig: 234 25 85

#description: 脚本描述 centos5中必须填写,centos6可写可不写)

可通过chkconfig命令来管理服务脚本

chkconfitg –level 级别 脚本 on|off

–level:指明级别为onoff,其余的保持原状,默认级别为2345

chkconfig –list 脚本

 查看服务在对应级别的状态

chkconfig –add | –del 脚本

 –add :添加服务 为某存放在/etc/init.d的服务在对应的/etc/rc.d/rc0-6.d目录添加符号链接

 –del :删除服务  把指定脚本在7个符号链接中都删除

注意:有一个S99local的符号链接,指向的是/etc/rc.local脚本,其功能为:那些不便定义为服务脚本,设定开机自动运行的脚本,  可直接把命令写入次脚本中,以实现开机即运行。

Linux系统启动后,一般会开启6tty终端,每个中端启动后,会立即通过此终端附加一个应用程序——-lofin,如果运行级别为5还会启动一个图形虚拟终端。

Centos6的配置文件及其功能:

 

/etc/inittab

设置系统默认的运行级别

id:3:initdefault:

 /etc/init/control-alt-delete.conf     //设置ctrl+alt+del三键操作

 /etc/init/tty.conf                 //控制tty终端的开启

/etc/init/start-ttys.conf             //配置tty终端的开启数量,设备文件

 /etc/init/rc.conf                  //兼容脚本,负责个运行级别的调用处理/

/etc/init/rcS.conf                  //加载rc.sysinit脚本,完成系统初始化任务

/etc/rcS-sulogin.cong               //为单用户模式启动/sbin/sushell环境          

 

centos6的启动过程:

1. 加载BIOS 的硬件信息,获取第一个启动设备。

2. 读取第一个启动设备MBR 的引导加载程序(grub) 的启动信息

3. 加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备。

4. 核型执行init 程序并获取运行信息。

5.Init 执行/etc/rc.d/rc.sysinit 文件。

6. 启动核心的外挂模块(/etc/modprobe.conf)

7.Init 执行运行的各个批处理文件(scripts).

8.Init 执行/etc/rc.d/rc.local.

9. 执行/bin/login 程序,等待用户登录。

10. 登录之后开始以Shell 控制主机。

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