操作系统的启动分为两个过程:boot(引导)和startup(启动)。
boot阶段开始于打开电源开关,结束于内核初始化完成和systemd进程成功。启动阶段接管了剩余工作,直到操作系统进入可操作状态。
因此,linux系统的启动过程如下:
POST(BIOS上电自检)->GRUB(引导装载程序)->kernel init(内核初始化)->start systemd(启动systemd进程)
1.BIOS上电自检(POST(Power On Self Test))
该阶段linux其实并没有做什么,POST主要由硬件的部分来完成,这对于所有操作系统来说都一样。当电脑启动电源,电脑开始执行BIOS(Basic I/O System)的POST过程。
BIOS上电自检确认硬件的基本功能正常,然后产生一个BIOS中断INT13H,该中断指向某个接入的可引导设备的引导扇区。它所找到的包含有效的引导记录的第一个引导扇区将被装载到内存中,并且控制权也将从引导区转移到此段代码。
引导扇区是引导加载器的真正的第一阶段,引导加载器有GRUB/GRUB2/LILO。
2.GRUB2
GRUB2, Grand Unified Bootloader,version 2.第二版大一统引导装载程序。
这是一个用于计算机寻找操作系统内核并加载到内存的智能程序。
2.1阶段
在POST阶段结束时,BIOS将查找在接入的磁盘中查找引导记录,通常位于MBR(Master Boot Record,主引导记录),它加载它找到的第一个引导记录到内存中,并开始执行这段代码。引导代码(及2.1代码)必须非常小,因为它必须连同分区表放到硬盘的第一个512字节的扇区中。在传统的常规MBR中,实际占用的空间为446字节。这个阶段2.1的446字节的文件通常被叫做引导镜像(boot img),其中不包含设备的分区信息,分区是一般单独添加到引导记录中的。
2.1.5阶段
如上所述,阶段 1.5 的代码必须位于引导记录与设备第一个分区之间的位置。该空间由于历史上的技术原因而空闲。第一个分区的开始位置在扇区 63 和 MBR(扇区 0)之间遗留下 62 个 512 字节的扇区(共 31744 字节),该区域用于存储阶段 1.5 的代码镜像 core.img 文件。该文件大小为 25389 字节,故此区域有足够大小的空间用来存储 core.img。
因为有更大的存储空间用于阶段 1.5,且该空间足够容纳一些通用的文件系统驱动程序,如标准的 EXT 和其它的 Linux 文件系统,如 FAT 和 NTFS 等。GRUB2 的 core.img 远比更老的 GRUB1 阶段 1.5 更复杂且更强大。这意味着 GRUB2 的阶段 2 能够放在标准的 EXT 文件系统内,但是不能放在逻辑卷内。故阶段 2 的文件可以存放于 /boot
文件系统中,一般在 /boot/grub2
目录下。
注意 /boot
目录必须放在一个 GRUB 所支持的文件系统(并不是所有的文件系统均可)。阶段 1.5 的功能是开始执行存放阶段 2 文件的 /boot
文件系统的驱动程序,并加载相关的驱动程序。
2.2阶段
GRUB 阶段 2 所有的文件都已存放于 /boot/grub2
目录及其几个子目录之下。该阶段没有一个类似于阶段 1 与阶段 1.5 的镜像文件。相应地,该阶段主要需要从 /boot/grub2/i386-pc
目录下加载一些内核运行时模块。
GRUB 阶段 2 的主要功能是定位和加载 Linux 内核到内存中,并转移控制权到内核。内核的相关文件位于 /boot
目录下,这些内核文件可以通过其文件名进行识别,其文件名均带有前缀 vmlinuz。你可以列出 /boot
目录中的内容来查看操作系统中当前已经安装的内核。
GRUB2 跟 GRUB1 类似,支持从 Linux 内核选择之一引导启动。Red Hat 包管理器(DNF)支持保留多个内核版本,以防最新版本内核发生问题而无法启动时,可以恢复老版本的内核。默认情况下,GRUB 提供了一个已安装内核的预引导菜单,其中包括问题诊断菜单(recuse)以及恢复菜单(如果配置已经设置恢复镜像)。
阶段 2 加载选定的内核到内存中,并转移控制权到内核代码。
内核
内核文件都是以一种自解压的压缩格式存储以节省空间,它与一个初始化的内存映像和存储设备映射表都存储于 /boot
目录之下。
在选定的内核加载到内存中并开始执行后,在其进行任何工作之前,内核文件首先必须从压缩格式解压自身。一旦内核自解压完成,则加载 systemd 进程(其是老式 System V 系统的 init 程序的替代品),并转移控制权到 systemd。
这就是引导过程的结束。此刻,Linux 内核和 systemd 处于运行状态,但是由于没有其他任何程序在执行,故其不能执行任何有关用户的功能性任务。
启动过程
启动过程紧随引导过程之后,启动过程使 Linux 系统进入可操作状态,并能够执行用户功能性任务。
开发Systemd的主要目的就是减少系统引导时间和计算开销。Systemd(系统管理守护进程),最开始以GNU GPL协议授权开发,现在已转为使用GNU LGPL协议,它是如今讨论最热烈的引导和服务管理程序。如果你的Linux系统配置为使用Systemd引导程序,它取替传统的SysV init,启动过程将交给systemd处理。Systemd的一个核心功能是它同时支持SysV init的后开机启动脚本。
Systemd引入了并行启动的概念,它会为每个需要启动的守护进程建立一个套接字,这些套接字对于使用它们的进程来说是抽象的,这样它们可以允许 不同守护进程之间进行交互。Systemd会创建新进程并为每个进程分配一个控制组(cgroup)。处于不同控制组的进程之间可以通过内核来互相通信。systemd处理开机启动进程的方式非常漂亮,和传统基于init的系统比起来优化了太多。让我们看下Systemd的一些核心功能。
- 和init比起来引导过程简化了很多
- Systemd支持并发引导过程从而可以更快启动
- 通过控制组来追踪进程,而不是PID
- 优化了处理引导过程和服务之间依赖的方式
- 支持系统快照和恢复
- 监控已启动的服务;也支持重启已崩溃服务
- 包含了systemd-login模块用于控制用户登录
- 支持加载和卸载组件
- 低内存使用痕迹以及任务调度能力
- 记录事件的Journald模块和记录系统日志的syslogd模块
参考:
https://linux.cn/article-8807-1.html
https://www.cnblogs.com/swordxia/p/4521428.html