当我们在平常的工作学习的环境中使用linux时,我们只需要按一下开机键,系统就会自动为我们加
载好相关配置,然后为我们打开操作界面,那么在这个过程中究竟都发生了什么,如果系统突然起不来
了,那么到底是启动时的哪一部分发生了错误呢,下面,我们就来看看linux中的centos6启动的具体流
程。
centos6启动流程大致分为以下这些步骤:
1.加电自检,得到BIOS的硬件信息,获取第一个启动设备
2.读取第一个启动设备MBR的引导加载程序(grub)的启动信息
3.加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备
4.运行init程序
5.运行系统初始化脚本 /etc/rc.d/rc.sysinit
6.启动核心的外挂模块
7.init执行运行各个批处理文件
8.init执行/etc/rc.d/rc.local
9.执行/bin/login程序,等待用户登录
10.登陆之后,打印登陆提示符,并开始shell控制主机
下面我们来分别解释下每一步的具体细节
1.加电自检
当我们按下电源键后,rom芯片中的CMOS程序开始执行并检测CPU,内存等设备是否存在并正常运
行,CMOS中的程序叫做BIOS,可以设置硬盘接口,网卡声卡开关之类的简单设置。一般PC主机板上会有
一个纽扣电池,它的主要作用就是给BIOS供电,当系统由于突然停电或者其其他原因意外断电的时候,
这个纽扣电池可以保证主板在断电后BIOS的一些基本设置不会被重置。
2.读取MBR的启动信息
计算机不是人类,他的所有操作都是认为的事先设定好的,所以当启动计算机的时候,它并不知道
系统放在哪里,我们需要告诉它,怎么告诉它呢,就是用程序引导它,这个程序叫做bootloader,不同
的操作系统的bootloader是不同的,windos使用的bootloader是ntloader,只能对windos系统进行引
导,而在linux中的bootloader叫做GRUB,它不仅可以对linux进行引导,也可以对windos进行引导,所
以在装windos和linux双系统的电脑的时候,要先装windos再装linux。
MBR记录一般在磁盘0磁道1扇区,一共512个字节,前446个字节是Bootloder,后64个字节是存放
分区信息的,一共四个分区,每个分区占用16个字节,最后两个字节是分区结束信息,一般是55AA.
所以,当加点自检完成后,会启动bootloader也就是grub程序,他会引导计算机到磁盘的第一个扇
区并加载MBR记录,然后按照MBR记录启动系统。
3.加载核心信息,尝试驱动所有的硬件设备
当加载完MBR的启动信息后,系统会进行自身初始化,首先它会侦测所有可识别到的
硬件设备,然后会借助于ramdisk加载硬件驱动程序,接着以只读方式挂载根文件系统,最
后运行用户空间的第一个程序/sbin/init。那么,什么是ramdisk呢?
ramdisk是内核中的特性之一,它使用缓冲和缓冲加速来对硬盘上的文件进行访问,并
且加载相应的硬件驱动程序。
4.运行init程序
init程序是系统启动的时候,第一个运行的程序,我们都知道任何程序都有自己的父程序,一旦父程
序被关闭,那么该程序也将无法运行,而init程序就是系统中所有程序的祖宗程序。
5.运行系统初始化脚本
当init程序启动后,它做的第一件事就是运行 /etc/rc.d/rc.sysinit,也就是系统初始化脚本,那么运行这个脚本能做什么呢?
(1) 设置主机名
(2) 设置欢迎信息
(3) 激活udev和selinux
(4) 挂载/etc/fstab文件中定义的文件系统
(5) 检测根文件系统,并以读写方式重新挂载根文件系统
(6) 设置系统时钟
(7) 激活swap设备
(8) 根据/etc/sysctl.conf文件设置内核参数
(9) 激活lvm及software raid设备
(10) 加载额外设备的驱动程序
(11) 清理操作
6.启动核心的外挂模块
7.init执行运行各个批处理文件
当核心的外挂模块被启动后,init会执行各个批处理文件,这些批处理文件位于如下目录中
这些文件夹分别对应级别0到级别6,我们进入rc5.d中查看有哪些文件
而如果我们使用ls -al命令查看,可以发现这些文件其实都是软连接
他们其实都指向一个一个的服务脚本,其中K代表此服务开机不自动启动,S代表开机自动启动,
后面的数字代表了启动的顺序。
8.执行rc.local文件
rc.local也是一个脚本。该脚本是在系统初始化级别脚本运行之后再执行的,因此我们可以安全地在里面添加在
系统启动之后执行的脚本。例如的我们可以在里面添加fstab挂载脚本。此外,我们可以在里面添加一些调试用的脚
本命令。
rc.local脚本是在启动过程中较后执行的,在正常级别下,最后一个启动服务S99local是指向lrc.local脚本,我们
可以将不方便或者不需要写为服务脚本的脚本放置于rc.local文件中,他是用户自定义的一些设置。
9.执行/bin/login程序,等待用户登录
出现登陆界面,选择用户后,输入登录密码即可登录
10.登陆之后,打印登陆提示符,并开始shell控制主机