Linux启动流程
Linux 启动是一条逐级交接的引导链:固件自检 → 引导加载器 → 内核 → 临时根文件系统 → systemd 接管用户空间。每一级只负责把下一级加载起来,理解这条链是排查开机故障的前提。
各阶段的职责
| 阶段 | 职责 | 关键产物 |
|---|---|---|
| BIOS/UEFI | 硬件自检(POST),按启动顺序找到引导设备 | UEFI 还会把启动项存在 NVRAM |
| GRUB2 | 显示菜单,加载内核与 initramfs,传启动参数 | 配置在 /boot/grub2/grub.cfg |
| 内核 | 初始化硬件、内存管理、调度器 | /boot/vmlinuz-* |
| initramfs | 临时根文件系统:加载磁盘驱动、组装 RAID/LVM、解锁加密盘,找到真实根分区后切换过去 | /boot/initramfs-*.img |
| systemd | PID 1,按依赖关系并行拉起所有服务 | /etc/systemd/system/ |
为什么需要 initramfs:内核镜像不可能内置所有硬件的驱动和文件系统支持,否则体积失控。initramfs 是一个按需裁剪的小根文件系统,先用通用能力启动,再加载真正磁盘所需的模块,完成"从内存根切换到磁盘根"的交接。
systemd 的 target
systemd 用 target 表示启动目标状态,是传统 runlevel 的替代。target 之间有依赖链,multi-user.target 相当于"命令行可用",graphical.target 在其之上再拉起图形界面。
| target | 等价 runlevel | 含义 |
|---|---|---|
rescue.target | 1 | 单用户/救援模式,只挂根文件系统 |
multi-user.target | 3 | 多用户命令行,服务器的日常状态 |
graphical.target | 5 | 图形界面 |
reboot.target / poweroff.target | 6 / 0 | 重启 / 关机 |
systemctl get-default # 查看默认 target
systemctl set-default multi-user.target # 修改默认
systemctl isolate rescue.target # 临时切换(不持久)服务的开机自启本质是把 unit 挂进某个 target 的依赖树:systemctl enable nginx 即在 multi-user.target.wants/ 下创建软链接。
启动故障排查入口
先看日志再动手
启动类问题第一步永远是 journalctl -b(本次启动日志)或 journalctl -b -1(上次启动),加 -p err 过滤错误。瞎猜重启只会丢失现场。
| 症状 | 排查方向 |
|---|---|
| 卡在 GRUB 菜单前 | 固件启动顺序、引导记录损坏(UEFI 启动项 / grub 重装) |
| 内核 panic,提示找不到根 | /etc/fstab UUID 变更、initramfs 缺驱动(重建:dracut -f) |
| 某服务起不来 | systemctl status xxx + journalctl -u xxx,见 Linux系统管理 服务管理章节 |
| 进不了系统 | GRUB 菜单按 e 编辑启动项,加 systemd.unit=rescue.target 进救援模式 |
日志系统的原理与 journalctl 的完整用法见 Linux日志系统。