目录
加载初始 RAM 文件系统 (initramfs/initrd)
Linux 系统的启动过程是一个复杂但有序的过程,它涉及到硬件初始化、内核加载、系统初始化等多个阶段。了解这个过程有助于更好地理解 Linux 系统是如何从开机状态过渡到可用的操作系统环境的。下面详细介绍 Linux 系统启动的各个阶段:
1. BIOS/UEFI 启动
加电自检 (POST)
当计算机通电后,BIOS 或 UEFI 固件首先进行加电自检(Power-On Self Test, POST),检测计算机的主要硬件组件是否正常工作,如 CPU、内存、硬盘等。
设备初始化
BIOS/UEFI 初始化系统中的硬件设备,如键盘、鼠标、显示适配器等。
加载启动引导程序
BIOS/UEFI 根据预设的启动顺序查找并加载启动引导程序(Bootloader),如 GRUB(GNU GRand Unified Bootloader)或 LILO(LInux LOader)。
2. 启动引导程序 (Bootloader)
加载内核
启动引导程序负责加载 Linux 内核到内存中,并传递必要的启动参数。这些参数通常包含在内核命令行中,例如 root=/dev/sda1 ro quiet splash
。
传递控制权给内核
加载内核后,启动引导程序将控制权传递给内核,此时内核开始执行初始化过程。
3. Linux 内核初始化
解压缩内核(如果有)
如果使用了压缩内核(如 zImage),内核会先解压自身。
初始化硬件
内核初始化硬件设备,包括设置中断控制器、内存管理单元(MMU)、时钟等。
加载初始 RAM 文件系统 (initramfs/initrd)
如果存在 initramfs 或 initrd 文件系统,内核会加载它们。initramfs/initrd 包含了一些必要的工具和模块,用于在系统完全启动前执行一些初始化任务,如挂载根文件系统。
执行初始进程
内核启动初始进程 init
(PID 1),在 Systemd 中,这个进程是 systemd
。init
或 systemd
负责后续的系统初始化任务。
4. 系统初始化
Systemd 初始化
现代 Linux 系统大多使用 Systemd 进行初始化。Systemd 是一个系统和服务管理器,它负责启动系统服务、管理进程间依赖关系等。
加载 Systemd 配置
Systemd 加载配置文件,确定需要启动的服务和单元。
启动服务
Systemd 根据配置文件启动必要的服务和守护进程,如网络服务、系统日志服务等。
SysVinit 初始化
在 Systemd 之前的 Linux 系统通常使用 SysVinit 进行初始化。SysVinit 通过运行一系列脚本来启动系统服务。
运行 rc.sysinit
SysVinit 首先运行 /etc/rc.d/rc.sysinit
脚本,初始化一些全局配置。
运行 runlevel 脚本
SysVinit 根据当前的运行级别(runlevel)启动相应的脚本,如 /etc/rc.d/rcX.d
中的脚本(X 代表运行级别)。
5. 用户登录
系统初始化完成后,用户可以选择登录到系统。这可以通过图形登录管理器(如 GDM、LightDM)或文本终端进行。
6. 图形环境启动
如果选择了图形登录,登录管理器会在用户成功登录后启动相应的桌面环境(如 GNOME、KDE)。
关键概念解释
-
Runlevel:Linux 系统有不同的运行级别,每个级别对应不同的系统状态。例如,runlevel 3 通常表示字符模式下的多用户环境,runlevel 5 表示图形模式下的多用户环境。
-
Init System:Init System 负责系统初始化和管理服务。早期的 Linux 系统使用 SysVinit,现代 Linux 系统大多使用 Systemd。
-
Service Unit:在 Systemd 中,每个服务都有一个对应的 unit 文件,描述了服务的配置和依赖关系。
总结
Linux 系统的启动过程是一个从硬件初始化到系统服务启动的有序过程。了解这一过程不仅有助于解决启动过程中遇到的问题,还能更好地理解 Linux 系统的内部工作机制。随着技术的发展,Linux 系统的启动过程也在不断优化,以提高启动速度和系统的健壮性。