前言:当我们了解了系统的启动过程,那么系统启动出问题时,我们就能知道什么地方出错了,就能哪里出错修哪里,不需要重装系统。
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;
结束:结尾了,我再给大家看一张更加详细的图,使你们能更清楚的了解启动流程。