前言
事物总是遵循某种规律而发展演变,我们无论是在公司还是在家庭,办一件事总是按照某种流程,某
种规则来做,如果这种规则被打破,不管是公司还是家庭都将乱成一锅粥。对于富有哲学思想的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 来查看其数据,如下图:
1)stage 1阶段
上图中从地址0000000到000001b0标记的内容便是BootLoader所在的位置,共446字节,即stage1
阶段,这一阶段的任务比较简单,就是初始化环境,为后面的阶段做准备。
×××线之后的位置一直到红色方框之间的内容为分区表信息,这段数据异常重要,如果破坏,也就宣
告你这个操作系统将不能工作,最后面红色方框内的内容是磁盘的检验位,如果该数据被破坏了,系统
将认为你这块磁盘不可用,那么系统也将不可使用。
2)stage1_5阶段
这一阶段,是存储在第一扇区之后的扇区中,大概有27个扇区的大小(还有待考证),共计
512X27=13824个字节。由于stage1阶段并不加载文件系统的驱动,所以stage1_5的作用主要是加载
/boot所在分区文件系统类型的驱动,是系统能够找到/boot。这些数据最后以*stage1_5这种格式的文
件存放在/boot/grub目录下。
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文件了。
initrd功能说明
其实说白了initrd就是一个虚拟的文件系统,里面有/、lib、bin、sbin、usr、proc、sys、var、
dev、boot等一些目录,其实你会发现里面的目录有点像真的/对吧,所以我们称之为虚拟的根文件系
统,作用就是将kernel和真的根文件系统建立关联关系,让kernel去initrd中加载根文件系统所需要的驱
动程序,并以读写的方式挂载根文件系统,并让执行用户当中第一个进程init
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中定义的运行级别,启动相应的服务(其实:运行级别就是不同服务的组合)。
执行完/etc/rc.d/rc$.d中的服务之后,系统还会读取rc.local中的文件,此文件中定义的内容(不管是服
务,还是脚本)每次开机启动都将执行。
5)执行/bin/login
最后系统会执行/bin/login文件,等待用户登录,如果用户输入密码,登录之后以shell控制主机。
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