Linux系统从通电到进入可操作状态,整体分为5个明确的启动阶段,每个阶段都有对应的核心任务和相关组件支撑,共同完成系统的初始化工作。

第一阶段:BIOS/UEFI加电自检
用户按下电源键后,主板上的BIOS或者UEFI固件首先运行,执行硬件自检操作。这个阶段的目的是检查CPU、内存、硬盘、显卡等核心硬件是否正常工作,同时按照预设的启动顺序查找可引导设备。当找到包含引导程序的设备后,固件会将引导程序加载到内存中,随后把控制权交给引导程序。
常见的启动顺序配置可以在BIOS/UEFI设置界面中调整,一般默认优先从硬盘启动。如果硬件检测失败,系统会发出蜂鸣报警或者显示对应的错误提示,无法进入后续启动流程。
第二阶段:引导加载程序运行
引导加载程序的核心作用是加载Linux内核到内存中,常见的引导加载程序有GRUB、GRUB2、LILO等,目前大多数Linux发行版默认使用GRUB2。引导加载程序运行后会展示启动菜单,用户可以选择要启动的内核版本,也可以对启动参数进行调整。
引导加载程序会读取配置文件中的内核路径和初始化内存盘路径,将两者加载到内存后,把控制权交给Linux内核。以下是GRUB2的默认配置文件部分内容示例:
# GRUB2配置文件示例
set default=0
set timeout=5
menuentry 'Linux 5.4.0' {
linux /vmlinuz-5.4.0 root=/dev/sda1 ro
initrd /initramfs-5.4.0.img
}
第三阶段:Linux内核初始化
内核被加载到内存后,首先会进行自身的初始化操作,包括检测所有硬件设备、加载对应的驱动程序、挂载根文件系统。内核会先挂载初始化内存盘(initramfs),这是一个临时的根文件系统,包含了挂载真实根文件系统所需要的驱动和工具。
当真实的根文件系统挂载完成后,内核会释放初始化内存盘,切换到真实的根文件系统,随后启动第一个用户空间进程,在传统的SysVinit系统中这个进程是init,在systemd系统中是systemd,进程的PID始终为1。
可以通过以下命令查看当前系统的第一个进程:
# 查看PID为1的进程 ps -ef | grep -E "PID|1 "
第四阶段:用户空间初始化进程启动
PID为1的初始化进程会负责后续所有用户空间进程的启动和管理,不同的初始化系统有不同的工作流程。如果是SysVinit系统,init进程会读取/etc/inittab配置文件,确定系统的运行级别,然后按照运行级别对应的脚本顺序启动服务。
如果是systemd系统,会读取/etc/systemd/system/default.target文件,确定默认的目标(相当于运行级别),然后按照依赖关系启动对应的服务单元。以下是systemd查看默认目标的命令示例:
# 查看systemd默认启动目标 systemctl get-default
常见的运行级别和systemd目标对应关系如下:
| 运行级别 | systemd目标 | 含义 |
|---|---|---|
| 0 | poweroff.target | 关机 |
| 1 | rescue.target | 单用户模式 |
| 3 | multi-user.target | 多用户文本模式 |
| 5 | graphical.target | 多用户图形模式 |
| 6 | reboot.target | 重启 |
第五阶段:用户登录环境初始化
当所有系统服务启动完成后,系统会启动终端或者显示管理器,等待用户登录。如果是文本模式,会启动getty进程监听终端,用户输入用户名和密码后,系统会验证身份信息,验证通过后会加载用户的shell配置文件,比如~/.bashrc、~/.profile等,完成用户环境的初始化。
如果是图形模式,显示管理器会展示登录界面,用户登录后启动桌面环境,同样会加载对应的用户配置文件,最终进入用户可操作的界面。整个启动流程到此全部完成。
可以通过查看/var/log/boot.log文件了解系统启动过程中的详细日志,方便排查启动阶段出现的问题:
# 查看启动日志 cat /var/log/boot.log