Linux系统启动流程

17 阅读3分钟

Linux系统的启动流程可以概括为以下几个主要阶段:BIOS/UEFI阶段、引导加载器阶段、内核引导阶段和用户空间初始化阶段。每个阶段都有其特定的任务和作用。下面是对每个阶段的详细描述:

1. BIOS/UEFI 阶段

BIOS(Basic Input/Output System)

  • 加电自检(POST):系统上电后,BIOS会执行加电自检(Power-On Self Test),检查硬件是否正常工作。
  • 引导设备选择:BIOS根据预设的启动顺序,选择合适的引导设备(如HDD、SSD、CD-ROM、USB等)。
  • 加载引导加载器:BIOS读取引导设备的主引导记录(MBR,位于磁盘的第一个扇区),并将控制权交给MBR中的引导加载器。

UEFI(Unified Extensible Firmware Interface)

  • 加电自检(POST):与BIOS相同,进行硬件自检。
  • 引导管理器:UEFI固件包含一个引导管理器,它可以直接从指定的文件系统中加载引导加载器(通常位于ESP分区)。
  • 加载引导加载器:根据配置,从EFI系统分区(ESP)加载EFI引导加载程序。

2. 引导加载器阶段

引导加载器的任务是加载并启动Linux内核。常见的引导加载器有GRUB(GRand Unified Bootloader)、LILO(Linux Loader)等。

GRUB 引导过程

  • 阶段1:BIOS/UEFI将控制权交给GRUB Stage 1,这个阶段代码通常很小,位于MBR或UEFI引导项中。
  • 阶段1.5:在某些情况下,GRUB Stage 1.5会被加载,用于识别文件系统。这一阶段通常位于磁盘的特定扇区中。
  • 阶段2:GRUB Stage 2加载GRUB配置文件(如grub.cfg),并展示引导菜单。用户可以选择不同的内核或操作系统。
  • 加载内核和initrd:根据用户选择或默认选项,GRUB加载Linux内核镜像(如vmlinuz)和初始RAM盘(initrd或initramfs)到内存中,并启动内核。

3. 内核引导阶段

  • 内核解压缩:GRUB将控制权交给内核后,内核首先解压缩自身。
  • 硬件初始化:内核开始初始化硬件设备,检测和配置系统资源。
  • 挂载初始RAM盘:内核挂载初始RAM盘(initrd/initramfs),该RAM盘包含了系统启动所需的临时文件系统和工具。
  • 启动init进程:内核查找并运行第一个用户空间进程,即init进程(PID 1)。传统上,这个进程是由/sbin/init提供,但现代系统中通常是systemd或其他init系统。

4. 用户空间初始化阶段

init 系统

最初的init系统是System V init,现在许多Linux发行版使用systemd作为init系统,以下分别介绍这两者:

System V init
  • 运行级别:init根据预设的运行级别(runlevel)执行相应的启动脚本,这些脚本位于/etc/rc.d//etc/init.d/目录下。
  • 启动服务:init启动各种系统服务和守护进程,比如网络服务、登录服务等。
systemd
  • Unit文件:systemd使用unit文件来定义和管理系统服务、挂载点、设备、Socket等。unit文件通常位于/etc/systemd/system//usr/lib/systemd/system/目录下。
  • 依赖关系:systemd并行启动服务,并根据服务之间的依赖关系来确定启动顺序,以加快系统启动速度。
  • 目标(target):systemd使用target来替代SysV init的运行级别,例如multi-user.target对应于运行级别3,graphical.target对应于运行级别5。

总结

  1. BIOS/UEFI阶段:进行硬件自检和初始化,加载引导加载器。
  2. 引导加载器阶段:加载并启动Linux内核。
  3. 内核引导阶段:内核初始化硬件,挂载初始RAM盘,并启动第一个用户空间进程。
  4. 用户空间初始化阶段:init系统(systemd或SysV init)启动各种系统服务,完成系统准备工作。

通过上述各个阶段的协同工作,Linux系统能够从上电启动一直到进入多用户、多任务的操作系统环境。