Linux 启动流程是怎样的?从 BIOS 到 login 的完整过程
Linux 启动分五个阶段:固件(BIOS/UEFI)→ 引导加载器(GRUB)→ 内核 → init 系统(systemd)→ 用户登录。每个阶段接力完成,任一阶段失败系统就无法启动。
1. 固件阶段:BIOS/UEFI
按下电源键后,CPU 执行固件(烧在主板 ROM 里的程序):
- BIOS(传统):POST 自检 → 扫描启动设备 → 读取第一个扇区(MBR,512 字节)
- UEFI(现代):POST 自检 → 读取 EFI 系统分区(ESP)里的 .efi 引导程序
UEFI 比 BIOS 快(跳过 MBR 扫描),支持 GPT 分区(超过 2TB 磁盘),支持安全启动(Secure Boot)。新机器都是 UEFI。
2. 引导加载器:GRUB2
GRUB2 显示启动菜单(如果有多个内核或系统),然后加载 Linux 内核和 initramfs 到内存:
shellGRUB 菜单 ├── Ubuntu, Linux 6.5.0-generic ├── Ubuntu, Linux 6.5.0-generic (recovery) └── Advanced options
GRUB 的配置在 /boot/grub/grub.cfg。修改用 update-grub 命令,不要直接编辑。
3. 内核阶段
内核加载后:
- 解压 initramfs(临时根文件系统,包含基本驱动)
- 检测硬件,加载驱动模块
- 挂载真正的根文件系统(/)
- 执行 /sbin/init(PID 1)
内核启动时的日志用 dmesg 查看。如果卡在某个驱动加载,dmesg 能看到最后一条。
4. init 系统:systemd
现代 Linux 都用 systemd(取代了旧的 SysV init)。systemd 按 target(目标单元)组织启动流程:
shellsysinit.target # 基础系统初始化 ↓ multi-user.target # 多用户模式(无图形界面) ↓ graphical.target # 图形界面
每个 target 下有多个 service 并行启动(不像旧 init 串行),启动速度更快。
查看启动耗时:
bashsystemd-analyze # 总耗时 systemd-analyze blame # 各服务耗时排序
5. 用户登录
- 文本模式:getty 进程在 tty1-6 显示登录提示
- 图形模式:GDM/LightDM/SDDM 显示管理器显示登录界面
登录后:
- 验证用户密码(/etc/shadow)
- 启动用户 shell(/bin/bash 或 /bin/zsh)
- 执行 shell 配置文件(.bashrc/.zshrc)
- 用户进入系统
常见启动故障
卡在 GRUB:内核或 initramfs 损坏。用 Live USB chroot 修复:grub-install + update-grub。
卡在内核阶段:驱动问题。启动时在 GRUB 菜单按 e 编辑,在 linux 行末加 nomodeset 禁用图形驱动。
卡在 systemd:某个服务启动失败。systemctl status 查看失败服务,systemctl disable 暂时禁用。
忘记密码:GRUB 菜单按 e,linux 行末加 init=/bin/bash,Ctrl+X 启动到 root shell,passwd 修改密码。