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之后版本引导顺序

  1. UEFI或BIOS初始化,运行POST开机自检
  2. 选择启动设备
  3. 引导bootloader, CentOS 7使用【grub2】
    加载bootloader的【配置文件】:
/etc/grub.d/    
/etc/default/grub     
/boot/grub2/grub.cfg
  1. 加载initramfs驱动模块
  2. 加载【内核】选项
  3. 内核【初始化】,centos7使用 systemd代替init
  4. 执行initrd.target所有单元,包括挂载/etc/fstab
  5. 从initramfs根文件系统切换到磁盘根目录
  6. systemd执行默认target配置,配置文件 /etc/systemd/system/default.target
  7. systemd执行 sysinit.target初始化系统及basic.target准备操作系统
  8. systemd启动multi-user.target下的本机与服务器服务
  9. systemd执行multi-user.target下的/etc/rc.d/rc.local
  10. Systemd执行multi-user.target下的 getty.target 及登录服务
  11. 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文件中