背景
系统开机其实是一项非常复杂的程序,理解Linux开机的原理,将有助于在系统出问题时候能够很快速的修复系统,而且还能够顺利的配置多重引导系统!
第一阶段:硬件引导启动
- Power On 开机上电
- BIOS(Basic Input Output System)
(1)BIOS读取硬件的配置的信息
BIOS是写入到主板上的一个软件程序,是电脑系统主动执行的第一个程序。BIOS主动读取CMOS中的硬件配置信息。
(2)BIOS开机自我测试
BIOS读取完配置信息后,开始执行硬件检测并且初始化硬件。
(3)BIOS读取MBR(Master Boot Record,主要开机记录区)
BIOS主动分析电脑里面的存储设备,根据使用者的设定去取得能够开机的存储设备,并且到该设备里面去读取第一个扇区的位置。MBR共有512字节(其中446bytes放置最基本的开机的引导程序 boot.img)。那么为什么需要这个MBR,主要因为BIOS大小太小,功能真的有限!
至此,BIOS将MBR加载到内存中,并且控制权限移交给MBR内的引导镜像(boot.img)。
备注:MBR中包含引导镜像boot.img(可以称为grub2的第一阶段部分) ,分区表等信息。
第二阶段:Grub2启动引导
1. stage1
Grub2的第一阶段主要保存在MBR中,用汇编语言编写,也就是MBR中的引导镜像部分。其中包括基本的硬件设备初始化,定位并加载1.5阶段的代码。
主要作用:加载1.5阶段代码到内存后,将控制权移交给1.5阶段
2. stage1.5
主引导记录跟磁盘的第一分区的开始位置之间遗留下62个512字节,该区域用于存储stage1.5的代码镜像core.img文件。该文件大小为49个512字节,故此区域有足够大小的空间存储core.img。因为有更大的存储空间,足够容纳一些通用的文件系统驱动程序,比如EXT,FAT和NTFS等。GRUB2的stage2能够放在标准的EXT文件系统内,即在/boot/grub2目录下。
主要的作用:为stage2阶段准备环境,并且引导位于文件系统中stage2
3. stage2
stage2所有的文件都已经存放于/boot/grub2目录以及子目录之下。该阶段需要从/boot/grub2/i386-pc目录下加载一些内核运行时模块(*.mod模块),同时加载/boot目录下的内核文件以及/boot/grub2/grub.cfg配置文件。
主要的作用:定位和加载Linux内核和虚拟文件系统/boot/initramfs到内存中,并转移控制权到内核。
备注:配置文件详情
总结:
GRUB的功能:
1.选择需要启动的内核或者系统,加载内核参数
2.提供交互式接口
3.基于密码保护
4.加载自定义选项
第三阶段:内核引导
Grub2加载内核,核心开始解压,启动一些最核心的程序。为了让内核足够的轻小,硬件驱动并没有放在内核文件里面。kernel借助内存中的initramfs虚拟根目录加载适当的驱动程序,最终释放虚拟文件系统,并挂
载实际的根目录文件系统,就能够开始后续的开机流程。
主要作用:硬件检测,卸载虚拟文件系统,挂载真实的根文件系统
权限移交:内核将控制权限移交给systemd服务
第四阶段:systemd初始化阶段
命令:
[root@centos01 boot]# systemctl list-dependencies multi-user.target # 查看依赖关系
multi-user.target
├─basic.target # 准备系统,加载主要的周边硬件驱动程序与防火墙任务
├─sysinit.target # 初始化系统,侦测硬件,加载所需要的核心模块
├─local-fs.target # 挂载fstab定义的分区
└─swap.target # 挂载swap分区
├─getty.target
└─getty@tty1.service # 提供终端登录服务,包括systemd-logind.service, systemd-user-sessions.service等服务
├─xxx.services
第五阶段:运行mingetty进程,显示登录界面