前言:当我们了解了系统的启动过程,那么系统启动出问题时,我们就能知道什么地方出错了,就能哪里出错修哪里,不需要重装系统。

CentOS6和CentOS7启动流程类似,不过CentOS6和7在启动后期不一样,CentOS6后期是init,CentOS7是systemd,那么细节之处呢,跟着我一块看看吧!


linux启动流程(如下图)


上图大概介绍了过程,现在来让我详细介绍一下:

Centos6启动流程

一、POST加电自检

按下电源键首先要检测硬件设备是否能正常运行,如:cpu、内存、硬盘等硬件设备。当然POST不是由硬件去检测(因为硬件也不会啊!),而是依靠一个软件来完成的,这个软件就是BIOS(Basic Input Output System)基本输入输出系统,它安装在CMOS芯片上,上电就是给CMOS加电,然后启动BIOS程序,BIOS会根据CMOS上记录的硬件信息去读取硬件并检测是否能正常运行,之后初始化硬件设备。

二、MBR引导

MBR是存储在硬盘上的0磁道第一扇区中,其大小为512字节;自检硬件没有问题时候,这里以BIOS为例,BIOS将会直接去找硬盘的第一个扇区,找到前446字节,将MBR加载到内存中,MBR将告诉程序下一阶段去×××系统grub引导。此阶段属于grub的第一阶段。grub还有1_5阶段和2阶段。

1、stage 1阶段

上图中从地址0000000到000001b0标记的内容便是BootLoader所在的位置,共446字节,即stage1阶段,这一阶段的任务比较简单,就是初始化环境,为后面的阶段做准备,存放在MBR上。

2、stage1_5阶段

由于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文件。另外grub也有自己的配置文件:/boot/grub/grub.conf且通常有个符号链接文件:/etc/grub.conf

[ root@localhost boot ]#vim 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的顺数是不能交换的。如果顺序颠倒,系统将不能启动。

三、加载Kernel(初始化)

/boot目录下包含vmlinuz,initramfs等内核相关的文件,Boot Loader读取/boot目录下所有文件、配置文件与环境参数信息后,会把内核解压加载到内存中,根据内核提供的功能开始检测,加载各个设备,此次检测与BIOS自检不同,执行到此,后续工作都由内核来完成(因为Boot Loader已把vmlinuz,initramfs加载到内存中),此时的内核还没有加载磁盘,因为还没有磁盘驱动程序,内核需要通过/boot目录下的虚拟文件系统,也就是initramfs,模拟一个rootfs(根文件系统),然后加载启动过程中所需要的核心模块,加载后释放rootfs(根文件系统),然后进行根挂载,在挂载根文件系统时为了避免内核中有bug或操作过程中有bug导致根文件系统被损坏,先只读挂载根文件系统,加载完成后才读写挂载,完成整个挂载根文件系统后,直接去找/sbin/init程序,即开始运行用户空间的第一个程序。

四、启动init进程

grub中默认指定init=/sbin/init程序,可以在grub.conf中kernel行自定义执行程序init=/bin/bash,此时可以绕过下面步骤直接进入bash界面。

(1)读取/etc/inittab文件

inittab文件里面定义了系统默认运行级别,这一步做了一些工作如下:

a)初始运行级别(RUN LEVEL)

b)系统初始化脚本

c)对应运行级别的脚本目录

d)定义UPS电源终端/恢复脚本

e)在虚拟控制台生成getty,以生成终端

f)在运行级别5初始化X

(2)执行/etc/rc.d/rc.sysinit程序

系统初始化一些脚本,主要完成以下工作:

a)设置主机名

b)设置欢迎信息

c)激活udev和selinux可以在grub.conf中,kernel行添加selinux=0以关闭selinux

d)挂载/etc/fstab文件中定义的文件系统

e)检测根文件系统,并以读写方式重新挂载根文件系统

f)设置系统时钟

g)激活swap设备

h)根据/etc/sysctl.conf文件来设置内核参数

i)激活lvm及software raid设备

j)加载额外设备的驱动程序

k)执行清理操作

注意:正常级别下,最后启动一个服务S99local没有链接至/etc/rc.d/init.d一个服务脚本,而是指向 了/etc/rc.d/rc.local脚本。

不便或不需写为服务脚本放置于/etc/rc.d/init.d/目录,且又想开机时自动运行的命令,可直接放置于/etc/rc.d/rc.local文件中,/etc/rc.d/rc.local在指定运行级别脚本后运行。

(3)执行/etc/rc#.d/文件(各种服务)

里面定义的是各种服务的启动脚本,可以ls查看,S开头代表开机启动的服务,K开头的是关机要执行的任务。#代表数字,一个数字代表一个运行级别,共7个运行级别,这里就不多说了。

centos 6中服务命令:chkconfig --lidt rpcbind

注意:run level 的切换:

与run level有关的启动是在/etc/rc.d/rc.sysinit执行完毕后。run level的不同仅是/etc/rc[0-6].d里面启动服务不同而已。

1,要每次启动都执行某个默认的 run level ,则需修改/etc/inittab 内的设置选项,即是 "id:5:initdefault:里面的数字

2,如果仅是暂时更改系统的 run level 时,则使用 inint[0-6] 来进行 run level 的更改,但下次重启时,依旧会是以 /etc/ininttab 的设置为准

当执行 init3 时,系统会:

1),先比较/etc/rc3.d 及 /etc/rc5.d 内的K与S开头的文件

2),在新的 run level 即是 /etc/rc3.d 内有多的K开头的文件,则给予关闭

3),在新的 run level 即是 /etc/rc3.d 内有多的S开头的文件,则给予开启

(4)执行/etc/rc.d/rc.local文件

这里面可以自定义开机启动的命令,是Linux留给用户进行个性化的地方。

五、执行/bin/login程序

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

CentOS7启动流程

CentOS7和CentOS6启动流程差不多,只不过到init程序时候,改为了systemd,因此详细解释一下systemd后的启动流程

1.uefi或BIOS初始化,开始post开机自检

2.加载MBR到内存

3.GRUB阶段

4.加载内核和inintamfs模块

5.内核开始初始化,使用systemd来代替centos6以前的init程序

(1)执行initrd.target  包括挂载/etc/fstab文件中的系统,此时挂载后,就可以切换到根目录了

(2)从initramfs根文件系统切换到磁盘根目录

(3)systemd执行默认target配置

centos7表面是有“运行级别”这个概念,实际上是为了兼容以前的系统,每个所谓的“运行级别”都有对应的软连接指向,默认的启动级别时/etc/systemd/system/default.target,根据它的指向可以找到系统要进入哪个模式。

模式:

0 ==> runlevel0.target, poweroff.target

1 ==> runlevel1.target, rescue.target

2 ==> runlevel2.target, multi-user.target

3 ==> runlevel3.target, multi-user.target

4 ==> runlevel4.target, multi-user.target

5 ==> runlevel5.target, graphical.target

6 ==> runlevel6.target, reboot.target

(4)systemd执行sysinit.target

有没有很眼熟?是的,在CentOS6上是被叫做rc.sysint程序,初始化系统及basic.target准备操作系统,所以他们两个还是有相似之处。

(5)systemd启动multi-user.target下的本机与服务器服务

(6)systemd执行multi-user.target下的/etc/rc.d/rc.local

6.systemd执行multi-user.target下的getty.target及登录服务

getty.target我们也眼熟,它是启动终端的systemd对象。如果到此步骤,系统没有被指定启动图形桌面,到此就可以结束了,如果要启动图形界面,需要在此基础上启动桌面程序。

7.systemd执行graphical需要的服务

介绍个chkconfig命令:

查看服务在所有级别的启动或关闭设定情形:

chkconfig [–list] [name]

例:查看所有服务: chkconfig --list

例:更改服务权限: chkconfig --level 3 network off

添加:chkconfig –add name

删除:chkconfig –del name

修改指定的链接类型:chkconfig [–level levels] name

|off|reset>

–level LLLL:指定要设置的级别;省略时表示2345;

结束:结尾了,我再给大家看一张更加详细的图,使你们能更清楚的了解启动流程。