CentOS 6 启动流程概述
硬件启动BIOS
- POST加电自检
- 加载BIOS的硬件信息,确定第一个启动设备
GRUB引导
读取第一个启动设备的 MBR的 引导加载程序(grub)的 启动信息:
注:MBR为 启动盘的前512字节(MBR = grub + 分区表)
- stage1:读取MBR的前446字节,即为grub,将其加载至内存并启动
- stage1.5:读取MBR之后的扇区,加载
/boot
目录所在分区的文件系统驱动 - stage2:读取文件
/boot/grub/grub.conf
内核引导与初始化
- 核心开始解压缩,并尝试驱动所有的硬件设备
- 核心执行
/sbin/init
程序,读取/etc/inittab
获得运行级别 -
init
程序执行初始化脚本/etc/rc.d/rc.sysinit
,重新挂载根文件系统 - 加载内核模块:依据
/etc/modules.conf
或者/etc/modules.d目录
下的文件来装载内核模块 - 根据选定的运行级别,
init
程序执行rc0.d到rc6.d
中的各个脚本(scripts)
-
init
程序执行/etc/rc.d/rc.local
(启动系统进程)
启动终端
- 执行
/bin/login
程序,等待用户登录 - 默认执行
/sbin/mingetty
打开纯文本终端
mingetty进程的作用:提供用户登录界面 - 登录之后开始以Shell控制主机
CentOS 7之后版本引导顺序
- UEFI或BIOS初始化,运行POST开机自检
- 选择启动设备
- 引导
bootloader
, CentOS 7使用【grub2】
加载bootloader
的【配置文件】:
/etc/grub.d/
/etc/default/grub
/boot/grub2/grub.cfg
- 加载
initramfs
驱动模块 - 加载【内核】选项
- 内核【初始化】,centos7使用
systemd
代替init
- 执行
initrd.target
所有单元,包括挂载/etc/fstab
- 从initramfs根文件系统切换到磁盘根目录
- systemd执行默认
target
配置,配置文件/etc/systemd/system/default.target
- systemd执行
sysinit.target
初始化系统及basic.target
准备操作系统 - systemd启动
multi-user.target
下的本机与服务器服务 - systemd执行
multi-user.target
下的/etc/rc.d/rc.local
- Systemd执行
multi-user.target
下的getty.target
及登录服务 - systemd执行
graphical
需要的服务
补充概念
BIOS
主板的ROM:BIOS,Basic Input and Output System
保存着有关计算机系统最重要的基本输入输出程序,系统信息设置、开机加电自检程序和系统启动自举程序等
UEFI
UEFI (Unified Extensible Firmware Interface) 统一可扩展固件接口
用来定义操作系统与系统固件之间的软件界面,作为BIOS的替代方案
POST
POST:Power-On-Self-Test,加电自检
是BIOS功能的一个主要部分。负责完成对CPU、主板、内存、硬盘子系统、显示子系统、串并行接口、键盘等硬件情况的检测
bootloader
启动加载器 ,是连接【硬件BIOS】与【OS】的桥梁
对于Linux系统,bootloader功能丰富,提供菜单,允许用户选择要启动系统或不同的内核版本;
把用户选定的内核装载到内存中的特定空间中,解压、展开,并把系统控制权移交给内核
GRUB
GRUB: GRand Unified Bootloader,高性能统一引导加载程序
顾名思义,GRUB是一种高级的bootloader!!!
MBR
主引导记录MBR是装有LINUX系统硬盘的第一个扇区,大小为512bytes
- 446 主引导程序(grub)
- 64 分区表(16 x 4)
- 2 结束标志55AA
补充原理
1.grub引导第1.5阶段的作用
grub引导第一阶段,读取MBR中的grub并启动,第二阶段需要读取/boot/grub/
目录下的文件,但此时内核还未加载,无论该目录所在分区使用的是哪种文件系统,都没有对应的驱动,因此无法访问
于是就需要1.5阶段,进行读取MBR之后的27个扇区,用于加载/boot
目录所在分区的文件系统驱动,使得在第二阶段能够访问/boot/grub/
目录下的文件
2.文件/boot/grub/grub.conf
最后三行的作用
grub引导第二阶段中,读取文件/boot/grub/grub.conf
【 root (hd0,0) 】表示启动盘的第一个分区,实际上就是/boot目录所在的分区,为接下来的两行内容指明当前所谓的根目录即为/boot目录
【 kernel 】指明了内核文件的路径,本行还写明了之后操作系统的实际根目录需要挂载到哪个分区(用UUID指明),但是此时内核还未加载,因此没有任何文件系统的驱动,也就无法根据UUID识别实际根目录的位置,从而无法加载操作系统。
因此在下一行补充【 initrd 】,指明了一个辅助文件,此文件包含了解决上述问题所需要的所有程序
3./etc/rc.d/rc.local
文件的作用
正常运行级别下,最后启动的一个服务【S99local】没有链接至/etc/rc.d/init.d
的一个服务脚本,而是指向了/etc/rc.d/rc.local
脚本
因此,此文件在指定运行级别脚本执行之后运行
对于【不便或不需】写成服务脚本放置于/etc/rc.d/init.d/
目录的,且【又想开机自启】的命令,可直接放置于/etc/rc.d/rc.local
文件中