本节概要
Linux 启动过程详解
Linux 启动相关配置文件
Centos6.5和Centos7.2启动区别
Linux 常见系统启动问题
环境准备
Centos6.5、Centos7.2。
一、启动过程
启动过程是面试中经常考察的问题。
了解启动过程流程,在启动过程中遇到问题时可以判断出问题时出在启动中的哪个阶段,进而进行处理,避免反复的系统重装。
Centos6和Centos7的启动过称类似,主要区别是Centos6后期启动的是init进程,Centos7后期启动的是systemd进程。其他细节的区别可以查看下文。
1. Centos6启动流程
启动流程图:
POST加电自检
开机后BIOS或UEFI进行硬件检查的阶段。
以BIOS为例,记载BIOS的硬件信息,第一引导可以为光盘、硬盘、USB、网络,以硬盘为例,虚拟机进入BIOS方法如下:
Vmvare中 “电源” -> ”打开电源时进入固件(F)”
Removable Devices :可移动设备引导,如U盘
Hard Drive:硬盘引导
CD-ROM Drive:光盘引导
Network boot from Intel E1000:网络引导
MBR 引导
MBR即主引导记录,为硬盘的0柱面、0磁头、1扇区。
硬件自检过程正常,BIOS 会找到磁盘的第一个扇区的前446字节,将MBR加载到内存中,MBR会告知程序接下来去哪里找系统grub引导。
GRUB引导
GRUB为GNUI项目的一个多操作系统的启动程序。
此过程会读取grub.conf文件,确定内核启动参数,准备启动内核。
启动内核
加载内核,启动一些最核心的程序。
加载ramdisk
Ramdisk为伪文件系统。
内核起来后会调用ramdisk,尝试驱动所有的硬件设备,所有的驱动安装完成后后面的启动就交由程序进行。
启动init进程
a. 读取/etc/inittab文件:
硬件驱动完成后,内核会执行Init程序,init程序根据/etc/inittab文件中的配置获取到运行级别。
b. 执行/etc/rc.d/rc.sysinit程序。
c. 执行/etc/rc#.d/,即各种服务的启动脚本。
S 开头代表开机需要启动的服务。
K 开头代表关机需要执行的任务。
# 代表运行级别,共7个运行级别,运行级别的具体信息可以查看前面的课程讲解。
d. 执行/etc/rc.d/rc.local中自定义的开启启动命令。
执行/bin/login程序,等待用户登录
2. Centos7启动流程
Cnetos7.2的启动过程和centos6.5的启动过称基本一样,区别主要为Centos6.5的init进程在centos7.2中为systemd进程。
Centos7.2 启动流程如下:
(1) POST加电自检
(2) 加载MBR到内存
(3) GRUB引导
(4) 加载内核和inintamfs模块
(5) 开始内核的初始化,使用systemd代替init程序
a. 执行initrd.target
包括挂载/etc/fstab文件中的系统。
b. 从initramfs根文件系统切换到磁盘根目录
c. systemd执行默认target配置
Centos7中的运行级别是为了兼容Centos6,在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
d. systemd 执行sysinit.target
sysinit.target进程对应centos6中的rc.sysint进程。
e. systemd 启动multi-user-target下的本机与服务器服务
f. systemd执行multi-user.target下的/etc/rc.d/rc.local,即开机启动命令
g. systemd执行multi-user.target下的getty.target及登录服务
getty.target用于启动终端。
如果开机进入文本界面则此时启动流程结束,如果进入图形化的界面则systemd还需要执行graphical需要的服务。
二、启动相关配置文件
以Centos6.5为例。
1. GRUB配置文件
/etc/grub.conf
软链接到/boot/grub/grub.conf
内容如下:
2. 默认启动级别
/etc/inittab
内容如下:
3. 系统初始化
/etc/rc.d/rc.sysinit
主机名和/etc/fstab中的分区自动挂载都在此文件中进行制定。
Rc.sysinit可以完成mount分区、swap分区的激活,modules加载等
操作。
4. 不同运行级别启动的服务
rcx.d,x对应运行级别1-6,S开头表示开机启动,K开头的表示开机不启动,S和K后面的数字代表优先级,数值越小优先级越高。
这些文件软链接到/etc/rc.d/init.d下的一些文件,如:
vim /etc/rc.d/init.d/sshd
查看sshd在不同优先级下开机自启设置:
2345表示sshd会在运行级别为2、3、4、5时启动,55为开机时启动的优先级,25为关机时关闭的优先级。
一些被其他服务依赖的服务的启动优先级一般较高,如network服务:
我们修改服务的开机启动脚本一般是直接修改/etc/init.d/xxx,而不是修改/etc/rc.d/init.d/xxx,是因为/etc/init.d/下的文件是软链到/etc/rc.d/init.d/下的:
Linux 下服务的开机自启方式:
chkconfig, Centos7下为systemctl enable xxxsss
/etc/init.d/路径下加入服务器的开机启动脚本
/etc/rc.local 开机启动命令中加入服务启动命令
三、Centos6和Centos7启动区别
Centos7相对于Centos6的最大区别即systemd替换SysVinit。
systemd可以更好的进行服务管理,可以使存在依赖的服务之间更好的并行化,对比如下:
sysv init:程序顺序执行,即使他们之间没有依赖关系:
systemd:程序并行执行: