6月3日 00:11

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 到内存:

shell
GRUB 菜单 ├── Ubuntu, Linux 6.5.0-generic ├── Ubuntu, Linux 6.5.0-generic (recovery) └── Advanced options

GRUB 的配置在 /boot/grub/grub.cfg。修改用 update-grub 命令,不要直接编辑。

3. 内核阶段

内核加载后:

  1. 解压 initramfs(临时根文件系统,包含基本驱动)
  2. 检测硬件,加载驱动模块
  3. 挂载真正的根文件系统(/)
  4. 执行 /sbin/init(PID 1)

内核启动时的日志用 dmesg 查看。如果卡在某个驱动加载,dmesg 能看到最后一条。

4. init 系统:systemd

现代 Linux 都用 systemd(取代了旧的 SysV init)。systemd 按 target(目标单元)组织启动流程:

shell
sysinit.target # 基础系统初始化 multi-user.target # 多用户模式(无图形界面) graphical.target # 图形界面

每个 target 下有多个 service 并行启动(不像旧 init 串行),启动速度更快。

查看启动耗时:

bash
systemd-analyze # 总耗时 systemd-analyze blame # 各服务耗时排序

5. 用户登录

  • 文本模式:getty 进程在 tty1-6 显示登录提示
  • 图形模式:GDM/LightDM/SDDM 显示管理器显示登录界面

登录后:

  1. 验证用户密码(/etc/shadow)
  2. 启动用户 shell(/bin/bash 或 /bin/zsh)
  3. 执行 shell 配置文件(.bashrc/.zshrc)
  4. 用户进入系统

常见启动故障

卡在 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 修改密码。

标签:Linux