Linux 系统启动流程是理解系统工作原理的重要知识,掌握启动流程有助于故障排查和系统优化。
BIOS/UEFI 启动阶段:
- BIOS(Basic Input/Output System):
- 传统固件接口
- 执行 POST(Power-On Self-Test)自检
- 检测硬件设备
- 查找可启动设备
- 加载 MBR(Master Boot Record)
- UEFI(Unified Extensible Firmware Interface):
- 现代固件接口
- 支持 GPT 分区表
- 启动速度更快
- 支持安全启动
- 加载 EFI 应用程序
引导加载程序阶段:
- GRUB(Grand Unified Bootloader):
- 最常用的 Linux 引导加载程序
- 支持 GRUB Legacy(0.97)和 GRUB 2
- 配置文件:/boot/grub/grub.cfg(GRUB 2)、/boot/grub/menu.lst(GRUB Legacy)
- 支持 Linux、Windows 等多系统引导
- 提供命令行界面进行故障恢复
- LILO(Linux Loader):
- 传统的 Linux 引导加载程序
- 配置文件:/etc/lilo.conf
- 已被 GRUB 取代
- systemd-boot:
- 简单的 UEFI 引导加载程序
- 配置文件:/boot/loader/entries/*.conf
- 适合简单的启动场景
内核加载阶段:
- 加载内核镜像:/boot/vmlinuz-*
- 加载 initramfs(初始 RAM 文件系统):/boot/initrd.img-*
- 内核解压缩并初始化
- 检测和初始化硬件设备
- 挂载根文件系统
- 启动 init 进程(PID 1)
init 进程阶段:
- SysVinit(传统 init 系统):
- 配置文件:/etc/inittab
- 运行级别(runlevel):0-6
- 0:关机
- 1:单用户模式
- 2:多用户模式(无网络)
- 3:多用户模式(有网络)
- 4:未使用
- 5:图形界面模式
- 6:重启
- 启动脚本:/etc/rc.d/rc*.d/ 或 /etc/rc*.d/
- 使用 chkconfig 管理服务
- systemd(现代 init 系统):
- 配置文件:/etc/systemd/system/
- 目标(target):类似于运行级别
- poweroff.target:关机
- rescue.target:救援模式
- multi-user.target:多用户模式
- graphical.target:图形界面模式
- reboot.target:重启
- 使用 systemctl 管理服务
- 支持并行启动,启动速度更快
- 更好的日志集成(journalctl)
系统服务启动阶段:
- SysVinit:
- 按 runlevel 顺序启动服务
- 执行 /etc/rc.d/rcN.d/ 目录下的脚本
- S 开头的脚本表示启动(Start)
- K 开头的脚本表示停止(Kill)
- systemd:
- 并行启动服务
- 根据依赖关系确定启动顺序
- 执行 .service 文件定义的服务
登录阶段:
- 显示登录提示符
- 用户输入用户名和密码
- 验证用户凭据
- 启动用户 shell
- 执行用户配置文件:
/.bash_profile、/.bashrc
启动过程的关键文件:
- /boot/grub/grub.cfg:GRUB 2 配置文件
- /boot/grub/menu.lst:GRUB Legacy 配置文件
- /etc/inittab:SysVinit 配置文件
- /etc/systemd/system/default.target:systemd 默认启动目标
- /etc/fstab:文件系统挂载配置
- /etc/hostname:主机名配置
- /etc/hosts:主机名到 IP 映射
启动故障排查:
- GRUB 故障:
- 修复 GRUB:grub-install /dev/sda
- 重建 GRUB 配置:update-grub 或 grub2-mkconfig -o /boot/grub2/grub.cfg
- 进入 GRUB 命令行:按 'c' 键
- 内核故障:
- 查看内核日志:dmesg、journalctl -k
- 尝试恢复模式:在 GRUB 菜单选择 recovery mode
- 使用旧内核启动
- 文件系统故障:
- 修复文件系统:fsck /dev/sda1
- 检查 /etc/fstab 配置
- 服务启动故障:
- 查看服务状态:systemctl status service
- 查看服务日志:journalctl -u service
- 禁用故障服务:systemctl disable service
启动优化:
- 减少 GRUB 等待时间:修改 /etc/default/grub 中的 GRUB_TIMEOUT
- 禁用不必要的启动服务:systemctl disable service
- 使用 systemd-analyze 分析启动时间:
- systemd-analyze:查看总启动时间
- systemd-analyze blame:查看各服务启动时间
- systemd-analyze critical-chain:查看关键启动链
- 使用并行启动:systemd 默认支持
- 优化内核参数:修改 /etc/default/grub 中的 GRUB_CMDLINE_LINUX