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。
总结
- BIOS/UEFI阶段:进行硬件自检和初始化,加载引导加载器。
- 引导加载器阶段:加载并启动Linux内核。
- 内核引导阶段:内核初始化硬件,挂载初始RAM盘,并启动第一个用户空间进程。
- 用户空间初始化阶段:init系统(systemd或SysV init)启动各种系统服务,完成系统准备工作。
通过上述各个阶段的协同工作,Linux系统能够从上电启动一直到进入多用户、多任务的操作系统环境。