前言


    事物总是遵循某种规律而发展演变,我们无论是在公司还是在家庭,办一件事总是按照某种流程,某

种规则来做,如果这种规则被打破,不管是公司还是家庭都将乱成一锅粥。对于富有哲学思想的Linux操

作系统而言,这种规律也必须遵循,今天就带大家去一窥CentOS 6 的启动过程。


Linux启动流程


    Linux的启动流程从大的方向来说可以分解为四个阶段段:首先,加载硬件信息即BIOS阶段;其次便

是MBR阶段,这一阶段包括MBR中的statege1阶段的BootLoader、MBR之后的stage1_5阶段以及在之

后的stage2阶段即读取/boot/grub/grub.conf文件。第三阶段是:内核开始工作,初始化相应的配置;

最后便是为用户登录做准备的阶段,加载各种配置文件,提供用户登录终端。


1 BIOS


    BIOS是基本输入输出系统(Basic Input Output System)的简称,是计算机中最基础,最重要的程

序,存储在主板上的Flash ROM中。

    BIOS加电自检中会检查内存、CPU、主板等硬件中是否存在错误,出现错误后会有两种处理情况:对

于严重故障(致命性故障)则停机,此时由于各种初始化操作还没完成,不能给出然后提示或信号;对

于非严重故障则给出提示或声音警报信号,等待用户处理。引导操作系统:BIOS会先从软盘或硬盘的开

始扇区读取引导记录,如果没有找到,则会在显示器上显示没有引导设备,如果找到就把电脑的控制交

给引导记录处理。


2 MBR


    MBR,是Master Boot Record的简称,即主引导记录。对于不同的分区类型来说,相应的叫法不一样,在MBR的分区类型中称为MBR,而在GPT分区中称为UEFI,本文主要以MBR分区类型加以说明。MBR是存储在硬盘上的0磁道第一扇区中,其大小为512字节;这段数据不属于任何分区。我们可以通过

hexdump -C 来查看其数据,如下图:

Linux系统启动流程_第1张图片

1)stage 1阶段

    上图中从地址0000000到000001b0标记的内容便是BootLoader所在的位置,共446字节,即stage1

阶段,这一阶段的任务比较简单,就是初始化环境,为后面的阶段做准备。

    ×××线之后的位置一直到红色方框之间的内容为分区表信息,这段数据异常重要,如果破坏,也就宣

告你这个操作系统将不能工作,最后面红色方框内的内容是磁盘的检验位,如果该数据被破坏了,系统

将认为你这块磁盘不可用,那么系统也将不可使用。

2)stage1_5阶段

    这一阶段,是存储在第一扇区之后的扇区中,大概有27个扇区的大小(还有待考证),共计

512X27=13824个字节。由于stage1阶段并不加载文件系统的驱动,所以stage1_5的作用主要是加载

/boot所在分区文件系统类型的驱动,是系统能够找到/boot。这些数据最后以*stage1_5这种格式的文

件存放在/boot/grub目录下。

Linux系统启动流程_第2张图片

3)stage2阶段

    有了stage1_5阶段的引导,系统临时以/boot为根,此时系统将去找/boot/grub/grub.conf(针对

CentOS 7之前的系统,CentOS 7采用的grub2),这个文件在系统的启动流程中占据这重要的作用;在

进入系统读秒结束后进入的菜单就是由它来定义的(正常启动可在读秒时按任意键进入该菜单)。而且

在这个文件中定义了系统的内核文件,以及虚拟根文件系统文件。

grub.conf文件:使用vim打开grub.conf文件。

[ root@localhost boot ]#cat grub/grub.conf  # 由于该系统文件是我自己修改过的,系统给的更全一些
default=0
timeout=5
hiddenmenu
title  linux
root (hd0,0)
kernel /vmlinuz root=/dev/sda2 init=/sbin/init 
initrd /initramfs-2.6.32-696.el6.x86_64.img

default=0:表示默认以哪个内核启动启动

timeout=N:表示默认启动倒计时,如果你不选择启动项,倒计时N秒将以默认内核启动

hiddenmenu:表示显示菜单,如果你不写这一项,启动时将隐藏菜单

root (hd0,0):指定根所在的分区

kernel:指定启动的内核文件;root所在的分区,以及初始化第一个进程等信息

initrd :指定initramfs文件,即虚拟根文件系统

注意:上述kernel和initrd的顺数是不能交换的。如果顺序颠倒,系统将不能启动


3 Kernel(初始化)


    我们知道kernel是完成探索硬件及加载硬件驱动程序,并以读写的方式挂载根文件系统。那么这里就

出现一个比较诡异的问题,是什么问题呢?我们又知道,要想访问真正的根文件系统(rootfs)的话,就

必须加载根文件系统中的设备,这时根文件系统又没有挂载,要挂载根文件系统又得加载根文件系统中

的驱动程序哪怎么办呢?这是就用到了initrd文件了。

Linux系统启动流程_第3张图片

initrd功能说明

    其实说白了initrd就是一个虚拟的文件系统,里面有/、lib、bin、sbin、usr、proc、sys、var、

dev、boot等一些目录,其实你会发现里面的目录有点像真的/对吧,所以我们称之为虚拟的根文件系

统,作用就是将kernel和真的根文件系统建立关联关系,让kernel去initrd中加载根文件系统所需要的驱

动程序,并以读写的方式挂载根文件系统,并让执行用户当中第一个进程init

Linux系统启动流程_第4张图片


4 init阶段


    init,顾名思义即初始化,这里的初始与kernel的初始化不同,由于用户不能直接与内核进行交互,所

以我们必须要有一个程序或者服务来供用户使用。init初始化相当于用户空间的初始化过程,为用户的登

录做初始化操作。

1)运行/sbin/init

    内核在引导完成之后会执行系统的第一个进程init。这时也就正式进入了sysVinit的引导环境。Init之

后的所有进程都是由init派生出来,它的PID永远为1。

2)读取/etc/inittab文件

[ root@localhost / ]#vim /etc/inittab 

# inittab is only used by upstart for the default runlevel.
#
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# System initialization is started by /etc/init/rcS.conf
#
# Individual runlevels are started by /etc/init/rc.conf
#
# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
#
# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,
# with configuration in /etc/sysconfig/init.
#
# For information on how to write upstart event handlers, or how
# upstart works, see init(5), init(8), and initctl(8).
#
# Default runlevel. The runlevels used are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
# 
id:3:initdefault:         # 定义默认启动级别为3

    由该文件的说明信息可知:这是一个用来定义用户默认启动级别的文件,如果你修改了最后一行的数

值你将进入相应的运行级别(例如:id:5:initdefault: 默认开机进入图形化级别)。使用who -r可以查看

你当前的运行级别。

3)读取/etc/rc.sysinit

    Init在得到运行级别之后并不会立即执行该运行级别的一组服务程序,而执行的第一个程序是/etc/rc.d

/rc.sysinit脚本程序。该程序的在centos5的inittab文件中有如下一行: si:sysinit:/etc/rc.d/rc.sysinit 这

个脚本所做的工作有很多,包括主机名,文件系统,swap,SELinux,udev,内核参数,系统钟,Raid

和LVM等服务的开启。为后续服务启动准备基础环境。

4)加载服务/etc/rc.d/rc$.d

    根据你/etc/inittab中定义的运行级别,启动相应的服务(其实:运行级别就是不同服务的组合)。

Linux系统启动流程_第5张图片

执行完/etc/rc.d/rc$.d中的服务之后,系统还会读取rc.local中的文件,此文件中定义的内容(不管是服

务,还是脚本)每次开机启动都将执行。

5)执行/bin/login

最后系统会执行/bin/login文件,等待用户登录,如果用户输入密码,登录之后以shell控制主机。


Linux系统启动流程_第6张图片


5 本篇小结



本篇文章主要介绍了Linux的启动流程,重BIOS到MBR,再到内核的启动,最后介绍的配置文件的加

载。通过上述的讲解,我想大家应该能对Linux的启动流程有所了解了,不过时间匆忙,有些许地方说明

的不够详细,还望见谅!最后谢谢大家的阅读。在这里给大家提供几个大神写的启动流程,可以去看

看:

xiaosuaigege:http://www.pojun.tech/blog/2017/08/30/linux-basic-command-12

jeffary:https://jeffary.cn/linux%e4%b9%8b%e5%90%af%e5%8a%a8%e9%a1%b9%e8%af%a6%e8%a7%a3.html

zhyang:http://zhyang.top/articles/2017/09/01/Boot.html