Linux系统启动流程详解

2019-04-14 20:58发布

Linux系统启动流程详解

一、linux系统启动流程

以下是centos6的启动流程
这里写图片描述

CentOS6启动流程:

Linux系统启动的大体流程,可以概括为: POST –> BIOS –> GRUB –> kernel –> init

POST(加电自检)

Linux系统在接通电源后,首先系统会启动POST加电自检程序来对内部的各个配件进行自检,
若在自检的过程中发现错误,这可能会出现以下两种情况: 1.若出现的严重错误,则系统会停机,无法开启 2.如果是普通错误,则系统会发出警报提示或声音提示,用户可根据相关提示判断错误类型

BIOS(基本输入输出系统)

加电自检过后,系统会进入BIOS阶段,此阶段系统会启动Boot Sequence 来查找各引导设备,
当查到第一个有引导程序的设备时,改设备即为本次启动要用到的设备.
随后BIOS会读取改引导设备的MBR来进行系统启动的下一阶段. MBR通常为硬盘的第一个扇区
大小为512字节
前446个字节为bootloader
接着64个字节为分区表
剩下2个字节为结束标识

GRUB(多重操作系统启动管理器)

BIOS读取MBR后,系统来到了GRUB启动引导阶段.
GRUB引导阶段大致分为三个阶段
1. 1st stage: 启动Boot loader来加载2nd stage的内容至内存中
2. 1.5 stage: 位于MBR的分区表中,能够之别出2nd stage所在分区上的文件系统
3. 2nd stage: 读取配置文件/etc/grub/grub.conf,该文件为grub启动提供了菜单及加载的kernel位置,当kernel被成功加载到内存中时,系统进入到kernel启动阶段

Kernel(内核)

当系统启动过后来到kernel阶段,kernel为Linux系统的核心程序.
进入kernel阶段后,系统会先探测可识别的所有硬件设备
随后系统会加载硬件驱动程序,并生成一个临时只读rootfs系统
在运行了临时的rootfs系统后,系统将开始运行第一个初始化程序
CentOS6 的初始化程序为: /sbin/init
CentOS7 的初始化程序为: systemd
tisp: rootfs系统是initrd文件生成的,该文件在GRUP阶段的2nd stage时被复制进内存,该文件包含了必要的驱动模块,当挂载了真正的rootfs文件后,initrd才会从内存中被移除.

init(初始化)

到了这个阶段,系统开始进行完成启动前的初始化操作,其实际上是根据 /etc/inittab 的设置进行脚本执行.
第一个执行的脚本为/ect/rc.d/rc.sysinit , 这是系统的初始化脚本
其中完成的操作有:
1. 设置主机名
2. 设置欢迎信息
3. 激活 udev 和 selinux
4. 挂载 /etc/fstab 文件中定义的所有文件系统
5. 检测根文件系统,并以读写的方式重新挂载根文件系统
6. 设置系统时间
7. 根据 /etc/sysctl.conf 文件来设置内核参数
8. 激活 lvm 及 raid 设备
9. 激活 swap 设备
10. 加载额外设备的驱动程序
11. 清理过期的锁和进程文件 执行完成后,根据配置/etc/inittab文件中定义启动级别执行对应级别的目录下的脚本,
最后执行 /etc/rc.d/rc.local 脚本文件完成系统启动

Runlevel

runlevel运行级别,不同的运行级别对应的运行级别的服务不一样,init程序会根据相应的级别去执行相应目录下的脚本.
Linux的启动级别分别为:
这里写图片描述
以上对应目录包含着各种以K和S开头的脚本 K*:要停止的服务;K##*,优先级,数字越小,越是优先关闭;依赖的服务先关闭,而后关闭被依赖的; S*:要启动的服务;S##*,优先级,数字越小,越是优先启动;被依赖的服务先启动,而依赖的服务后启动;