文章目录
一、固件初始化阶段(BIOS/UEFI)
启动流程始于计算机硬件初始化,根据硬件架构分为两种模式:
1. BIOS(基本输入输出系统)模式
- 步骤1:Power On Self Test(POST)
开机后主板BIOS执行硬件自检,检查CPU、内存、硬盘等设备是否正常,完成后加载BIOS设置程序(按Del/F2等键进入)。 - 步骤2:引导设备搜索
BIOS按预设顺序(如硬盘、U盘、光驱)查找可引导设备,读取设备首个扇区(MBR,主引导记录)。
2. UEFI(统一可扩展固件接口)模式
- 优势:支持更大硬盘(>2TB)、更快启动速度、安全启动(Secure Boot)等特性。
- 步骤1:UEFI固件初始化
加载UEFI驱动程序,验证硬件兼容性,读取UEFI系统分区(ESP,通常位于FAT32格式分区)。 - 步骤2:引导加载程序定位
在ESP分区中查找引导加载程序(如/EFI/ubuntu/shimx64.efi
),并验证其签名(若启用Secure Boot)。
二、引导加载程序阶段(GRUB2)
Ubuntu默认使用GRUB2(GNU GRUB) 作为引导加载程序,负责加载内核和初始化参数。
1. GRUB2的加载过程
- BIOS模式:从MBR读取GRUB的第一阶段引导程序(
stage1
),再从硬盘读取后续阶段(stage2
)及配置文件。 - UEFI模式:直接从ESP分区加载GRUB的UEFI可执行文件(如
grubx64.efi
)。
2. GRUB配置解析
- 主配置文件:
/boot/grub/grub.cfg
(自动生成,基于/etc/grub.d/
和/etc/default/grub
)。 - 启动菜单生成:显示可用内核版本、恢复模式、Ubuntu高级选项等(默认等待10秒,可按ESC键中断)。
3. 内核参数传递
- 用户选择启动项后,GRUB加载内核文件(如
/boot/vmlinuz-5.19.0-32-generic
)和初始内存磁盘(initramfs
),并传递引导参数(如root=UUID=xxx
、ro
只读模式)。 - 关键参数示例:
linux /boot/vmlinuz-5.19.0-32-generic root=UUID=12345678-abcdef kernel_params initrd /boot/initramfs-5.19.0-32-generic.img
三、内核加载与初始化
1. 内核解压缩与启动
- 内核文件(
vmlinuz
)被加载到内存并解压缩,初始化CPU、内存、中断等底层硬件。 - 内核读取GRUB传递的参数,确定根文件系统位置(如通过UUID或设备名)。
2. initramfs(初始内存文件系统)加载
initramfs
是一个压缩的临时文件系统,包含驱动程序和启动脚本,用于挂载真正的根文件系统。- 主要作用:
- 加载存储设备驱动(如SATA、NVMe控制器驱动)。
- 执行磁盘检测(
fsck
)和文件系统挂载脚本。 - 切换到真正的根文件系统(
switch_root
)。
3. 根文件系统切换
- initramfs中的
init
脚本负责:- 检测并挂载根文件系统(如
/dev/sda2
)。 - 执行
pivot_root
命令,将根目录从initramfs切换到实际根文件系统。 - 启动真正的init进程(Ubuntu 15.04+为
systemd
)。
- 检测并挂载根文件系统(如
四、系统初始化阶段(systemd)
Ubuntu自15.04版本起使用systemd作为init系统(PID=1),替代传统的SysV init,负责系统服务启动和管理。
1. systemd启动流程
- 步骤1:加载配置
systemd读取内核参数和/etc/inittab
(兼容旧配置),确定默认运行目标(如graphical.target
图形界面)。 - 步骤2:目标依赖解析
运行目标(如graphical.target
)依赖于多个服务单元(如network.target
、multi-user.target
),systemd通过依赖关系并行启动服务。
2. 关键目标与服务启动顺序
- 核心目标链:
default.target(默认目标) → graphical.target → multi-user.target → basic.target → sysinit.target
- 重要服务阶段:
- sysinit.target:启动系统初始化服务(如磁盘加密、文件系统挂载、网络接口初始化)。
- basic.target:启动基础服务(如日志服务
systemd-journald
、用户认证pam
)。 - multi-user.target:启动多用户服务(如SSH、NFS客户端)。
- graphical.target:启动图形界面服务(如显示管理器
lightdm
、桌面环境)。
3. 服务管理机制
- 并行启动:systemd支持同时启动无依赖关系的服务,大幅缩短启动时间。
- 单元文件:服务配置位于
/usr/lib/systemd/system/
和/etc/systemd/system/
,如network-manager.service
。 - 状态监控:systemd持续监控服务状态,异常时自动重启(如
Restart=on-failure
参数)。
五、用户空间初始化与登录
1. 登录管理
- 图形界面:显示管理器(如
lightdm
)加载登录界面,验证用户凭证后启动桌面环境(如GNOME、KDE)。 - 命令行界面:启动
getty
进程,显示登录提示符(如Ubuntu 22.04 LTS tty1
)。
2. 用户会话初始化
- 登录后执行用户配置文件(如
~/.bash_profile
、~/.profile
),加载环境变量、启动终端模拟器等。
六、启动过程优化与故障排查
1. 启动时间分析
- 使用
systemd-analyze
命令查看启动耗时:systemd-analyze # 总耗时 systemd-analyze blame # 各服务耗时排序 systemd-analyze plot > boot.svg # 生成可视化图表
2. 常见故障场景
- GRUB损坏:通过Live CD进入修复模式,执行
grub-install
和update-grub
重建引导。 - 内核加载失败:在GRUB菜单中选择旧版本内核,或修改内核参数(如添加
nomodeset
解决显卡驱动问题)。 - systemd服务故障:通过
systemctl status [服务名]
查看错误日志,或进入单用户模式(systemd.unit=rescue.target
)修复。
总结:启动流程时间线
BIOS/UEFI初始化 → GRUB加载与内核选择 → 内核与initramfs启动 → 根文件系统切换 → systemd启动 → 服务并行启动 → 登录界面显示
Ubuntu的启动流程通过模块化设计和systemd的并行机制,在保证稳定性的同时,大幅提升了启动效率。理解各阶段的功能和依赖关系,有助于系统管理员进行性能优化和故障定位。