在linux学习过程中, 我们绝大数时间都用来去学习命令的使用或则是服务的搭建, 因为这些操作性的东西会让我们有一种成就感, 而很少有同学去学习底层的一些东西, 比如说操作系统, 其实任何一门技术当你学到一定高度的时候,你就会发现,很难再往上爬, 其中一个很大的原因就是基础知识的掌握不牢固。 写这段话,告诫自己与他人, 你可能会用你的一生去学习一门技术,长路漫漫, 何不从一开始就把基础打好。 

废话就不多说了, 下面介绍rhel6系统的启动流程.


下面是centos6系统的启动流程图:

rhel6系统的启动流程


下面具体分析每个步骤的过程:

1>.POST 加电自检

加电自检是BIOS 功能的一个主要部分 。负责完成对CPU 、主板、内存 、硬盘子系统、显示子系统、 串并行接口、键盘、CD-ROM 光驱等硬件情况的检测


2>.选择启动项

通过BIOS, 选择系统引导的设备, 比如光盘、USB、磁盘。


3>.(MBR分区的磁盘引导为例)MBR引导:

0磁盘0扇区的前446bytes, 存放的是bootloader引导程序。

446bytes显然太小了, 要想利用这446bytes做一个启动项显然有点困难, 为了解决这个问题, Linux将Boot Loader的程序运行与配置项加载分成三个阶段来运行:

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

stage1.5: 在MBR随后的扇区中存放,主要用于与stage2所在分区的文件系统进行交互。

stage2: 通过Boot Loader加载所有配置文件及相关的坏境参数信息, 这些配置文件及相关的坏境参数都存放于磁盘分区上的/boot目录下。


4>. 经过bootloader引导程序只是将核心内核文件vmlinuz-2.6.32-642.el6.x86_64加载起来, 把系统控制权移交给内核。


5>. 加载/usr/modules下模块驱动和挂载真正的/文件系统

想要加载/文件系统, 首先要加载/分区的驱动程序,而/分区的驱动程序却在/lib/modules/中,而/lib/modules这个目录却在/下, 显然无法去加载/lib/modules中的模块程序, 这时就需要ramdisk这个虚拟的/文件系统, 这个虚拟的/文件系统是在你安装操作系统内的时候, 系统会自动检测出你的磁盘驱动,创建一个虚拟的/文件系统中去。内核启动后, 首先会将虚拟的根文件系统加载起来, 通过虚拟根文件系统,去加载/lib/modules中的模块程序。将这些模块程序加载起来后, 真正的/系统就可以挂载起来了, 这时虚拟的/文件系统ramdisk退出系统了。


6>.启动init进程读取/etc/inittab文件和/etc/init/*.conf文件

a>. 使用/etc/rc.d/rc.sysinit初始化脚本

b>. 执行/etc/rc.d/rc脚本, 会自动加载/etc/rc#.d/下的所有脚本, #号为默认级别。#号为默认级别。

c>.执行/etc/rc.d/rc.local脚本

d>.执行/bin/login程序,进入登录状态。


rhel5的启动其实和rhel6差不多。 原理上都是这个样子的,但是还是有稍许的不同,比如在rhel5中,只去执行/etc/inittab的命令就OK了,而在rhel6中,将/etc/inittab分布在/etc/inittab和/etc/init.d/目录下。

rhel7的启动和rhel5、6可以说是发生了很大的变化,但是整个启动的思想还是可以参考rhel6的启动过程。