Linux 系统启动流程与 GRUB 引导配置完全指南
理解 Linux 系统从按下电源键到登录界面的完整启动链路,是每一位运维人员的基础功。本文深入剖析 BIOS/UEFI 启动流程、GRUB2 引导加载器配置、内核初始化过程,并提供大量实战配置与故障排查方法。
一、Linux 系统启动全景图
Linux 系统从通电到用户登录,经历了多个阶段。掌握每个阶段的职责和可配置点,才能精准定位启动故障。
| 阶段 | 主要组件 | 作用 | 常见问题 |
| 1. 通电 | 主板固件 (BIOS/UEFI) | 硬件自检 (POST)、选择启动设备 | 硬件故障、CMOS 电池耗尽 |
| 2. 引导加载器 | GRUB2 | 加载内核和 initramfs 到内存 | GRUB 配置错误、MBR/GPT 损坏 |
| 3. 内核初始化 | vmlinuz + initramfs | 解压内核、加载驱动、挂载根文件系统 | 驱动缺失、根分区 UUID 错误 |
| 4. init 进程 | systemd | 执行 default.target 启动服务 | 服务依赖冲突、关键服务启动失败 |
| 5. 登录 | getty / display manager | 提供登录提示符或图形界面 | getty 配置错误、图形驱动问题 |
二、BIOS 与 UEFI:传统与新时代
2.1 核心区别
| 特性 | Legacy BIOS | UEFI |
| 磁盘分区表 | MBR(最大 2TB) | GPT(最大 9.4ZB) |
| 引导代码位置 | MBR(第1扇区,512 字节) | EFI 系统分区(ESP,FAT32) |
| 引导程序文件 | /boot/grub2/i386-pc/ | /boot/efi/EFI/ubuntu/grubx64.efi |
| 用户界面 | 纯文本、无图形能力 | 支持图形、鼠标、网络协议栈 |
| 安全启动 | 不支持 | 支持 Secure Boot |
| 启动速度 | 较慢(逐扇区读取) | 较快(直接执行 EFI 程序) |
2.2 检查当前启动模式
1 2 3 4 5 6 7 8
| [ -d /sys/firmware/efi ] && echo "UEFI" || echo "Legacy BIOS"
which efibootmgr && efibootmgr || echo "Not UEFI"
dmesg | grep -i "efi\|bios"
|
三、GRUB2 深度配置
GRUB(Grand Unified Bootloader)是目前 Linux 发行版最主流的引导加载器。了解其配置文件结构是修改引导行为的前提。
3.1 配置文件层级
1 2 3 4 5 6 7 8
| /etc/default/grub /etc/grub.d/ ├── 00_header ├── 10_linux ├── 30_os-prober ├── 40_custom └── 41_custom /boot/grub/grub.cfg
|
重要:/boot/grub/grub.cfg 由 grub-mkconfig 命令自动生成,切勿直接编辑。修改引导参数应在 /etc/default/grub 中进行,然后执行 update-grub 或 grub-mkconfig 重新生成。
3.2 核心配置参数详解
| 参数 | 默认值 | 说明 |
| GRUB_DEFAULT | 0 | 默认启动项(数字索引或菜单名) |
| GRUB_TIMEOUT | 5 | 倒计时秒数(设为 -1 取消倒计时) |
| GRUB_CMDLINE_LINUX | "" | 所有内核项追加的内核参数 |
| GRUB_CMDLINE_LINUX_DEFAULT | "quiet splash" | 仅默认内核项追加的参数 |
| GRUB_GFXMODE | "auto" | GRUB 图形分辨率(如 1920x1080) |
| GRUB_DISABLE_RECOVERY | "false" | 是否隐藏恢复模式菜单 |
| GRUB_DISABLE_OS_PROBER | "false" | 是否禁用其他系统检测 |
| GRUB_SAVEDEFAULT | "false" | 是否记住上次选择的启动项 |
| GRUB_HIDDEN_TIMEOUT | "" | 隐藏菜单的等待时间(配合 GRUB_TIMEOUT) |
3.3 常见配置场景
场景一:显示 GRUB 菜单并延长等待时间
1 2 3 4 5 6 7 8 9
| GRUB_DEFAULT=saved GRUB_SAVEDEFAULT=true GRUB_TIMEOUT=10 GRUB_TIMEOUT_STYLE=menu GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
update-grub
|
场景二:调试模式(详细启动日志)
1 2 3 4 5 6
| GRUB_CMDLINE_LINUX_DEFAULT="" GRUB_CMDLINE_LINUX="debug ignore_loglevel log_buf_len=10M" GRUB_TIMEOUT=-1
update-grub
|
场景三:设置 GRUB 密码保护
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| grub-mkpasswd-pbkdf2
set superusers="admin" password_pbkdf2 admin grub.pbkdf2.sha512.10000.<完整哈希>
cat <<EOF menuentry "Ubuntu (受保护)" --users admin { linux /vmlinuz-... root=UUID=... ro initrd /initrd.img-... } EOF
update-grub
|
四、内核启动参数详解
在内核命令行 (GRUB_CMDLINE_LINUX) 中传递参数,可以控制内核启动行为。以下是最实用的参数:
| 参数 | 作用 | 使用场景 |
| quiet | 减少内核日志输出 | 正常启动 |
| splash | 显示启动画面 | 桌面环境 |
| single | 单用户模式 | 密码恢复、文件系统修复 |
| init=/bin/bash | 直接启动到 bash | 紧急救援 |
| nomodeset | 禁用内核模式设置 | 显卡驱动问题 |
| acpi=off | 禁用 ACPI | ACPI 相关内核崩溃 |
| mem=4G | 限制可用内存 | 内存测试 |
| ro | 以只读方式挂载根文件系统 | 默认设置 |
| rw | 以读写方式挂载根文件系统 | 单用户修复 |
| systemd.unit=rescue.target | 启动到 rescue 目标 | 服务级别故障排查 |
| systemd.unit=emergency.target | 启动到 emergency 目标 | 极简环境修复 |
| ip=dhcp | 网络启动时使用 DHCP | PXE 网络引导 |
五、initramfs 与内核初始化
5.1 initramfs 的作用
initramfs(initial RAM filesystem)是一个临时的根文件系统,在真正的根文件系统挂载前提供最小运行环境。它的核心任务:
- 加载必要的存储控制器驱动(SCSI/NVMe/SATA)
- 加载文件系统驱动(ext4/xfs/btrfs)
- 解密 LUKS 加密分区
- 激活 LVM 卷组和 RAID 阵列
- 挂载真正的根文件系统并切换到它(pivot_root)
5.2 重建 initramfs
1 2 3 4 5 6 7 8 9 10 11
| update-initramfs -u -k all update-initramfs -c -k 5.15.0-86-generic
dracut -f dracut -f --kver 5.14.0-362.el9.x86_64
echo "nvme_core" >> /etc/initramfs-tools/modules update-initramfs -u
|
5.3 排查 initramfs 问题
1 2 3 4 5 6 7 8 9 10
| lsinitramfs /boot/initrd.img-$(uname -r) | head -30
mkdir /tmp/initrd-check && cd /tmp/initrd-check zcat /boot/initrd.img-$(uname -r) | cpio -idmv ls -la
lsinitramfs /boot/initrd.img-$(uname -r) | grep -i "nvme\|xfs"
|
六、GRUB 安装与修复
6.1 在 UEFI 模式下安装/重装 GRUB
1 2 3 4 5 6 7 8 9
| mount /dev/sda1 /boot/efi
grub-install --target=x86_64-efi --efi-directory=/boot/efi \ --bootloader-id=Ubuntu --recheck
update-grub
|
6.2 在 Legacy BIOS 模式下安装/重装 GRUB
1 2 3 4 5 6 7
| grub-install --target=i386-pc /dev/sda
grub-install --target=i386-pc --boot-directory=/boot /dev/sda
update-grub
|
6.3 从 Live CD 修复 GRUB
当系统无法启动时,使用 Live USB 修复:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
mount /dev/sda2 /mnt mount /dev/sda1 /mnt/boot/efi
mount --bind /dev /mnt/dev mount --bind /proc /mnt/proc mount --bind /sys /mnt/sys
chroot /mnt /bin/bash
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=Ubuntu
grub-install --target=i386-pc /dev/sda
update-grub exit reboot
|
七、自定义高级 GRUB 配置
7.1 自定义菜单主题
1 2 3 4 5 6 7 8 9 10
| mkdir -p /boot/grub/themes/vimix wget -O /tmp/vimix.tar.gz https://github.com/vinceliuice/grub2-themes/raw/master/vimix.tar.gz tar xzf /tmp/vimix.tar.gz -C /boot/grub/themes/vimix
GRUB_THEME="/boot/grub/themes/vimix/theme.txt" GRUB_GFXMODE="1920x1080x32"
update-grub
|
7.2 自定义启动项(40_custom)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| cat >> /etc/grub.d/40_custom << 'EOF'
exec tail -n +3 $0
menuentry "Memtest86+ (内存测试)" { linux16 /boot/memtest86+.bin }
menuentry "System Rescue (从备份恢复)" { linux /boot/rescue-kernel root=UUID=... ro single initrd /boot/rescue-initrd.img }
menuentry "Network PXE Boot" { linux16 /boot/ipxe.pxe } EOF
chmod +x /etc/grub.d/40_custom update-grub
|
7.3 UEFI Secure Boot 配置
1 2 3 4 5 6 7 8 9
| mokutil --sb-state
mokutil --import /path/to/MOK.der
/usr/src/linux-headers-$(uname -r)/scripts/sign-file \ sha256 /path/to/MOK.priv /path/to/MOK.der /lib/modules/$(uname -r)/kernel/drivers/...
|
八、启动故障排查速查表
| 故障现象 | 可能原因 | 解决方案 |
| GRUB Rescue 提示符 | GRUB 配置损坏或 /boot 分区不可读 | 使用 Live CD 修复 GRUB |
| Kernel Panic - not syncing: VFS | 根文件系统未找到 (UUID 错误或驱动缺失) | 检查 root= 参数,重建 initramfs |
| Kernel Panic - Attempted to kill init | init 进程崩溃、/sbin/init 缺失 | 添加 init=/bin/bash 进入恢复模式 |
| 黑屏,光标闪烁 | 显卡驱动问题或 nomodeset 未设置 | 在 GRUB 编辑模式添加 nomodeset 参数 |
| 启动卡在 "A start job is running" | 挂载某个分区超时(如 NFS、加密卷) | 按 Esc 查看具体任务,检查对应服务 |
| GRUB 菜单不显示 | GRUB_TIMEOUT_STYLE=hidden 或 GRUB_HIDDEN_TIMEOUT 设置 | 启动时持续按 Shift (BIOS) 或 Esc (UEFI) |
| Secure Boot 导致 GRUB 无法启动 | GRUB 签名无效 | 进入 BIOS 禁用 Secure Boot 或注册 MOK |
| initramfs 解压失败 | initramfs 文件损坏 | 使用 Live CD 重建 initramfs |
九、启动性能分析
测量和优化启动时间,可以帮助诊断哪些阶段拖慢了速度。
1 2 3 4 5 6 7 8 9 10
| systemd-analyze systemd-analyze blame systemd-analyze critical-chain systemd-analyze plot > boot.svg
dmesg | grep "Command line" dmesg | grep "Freeing kernel" dmesg | grep "Run /init as"
|
启动优化建议:
- 减少内核模块:编辑
/etc/initramfs-tools/modules,只包含必要驱动
- 并行化服务:检查服务依赖,确保没有不必要的
After= 阻塞
- 禁用不必要的服务:
systemctl disable 不用的服务
- 使用 systemd-timer 替代 crontab 延迟非关键定时任务
- 精简 GRUB 配置:去除不需要的内核或恢复菜单项
1 2 3
| dpkg --list | grep linux-image apt-get autoremove --purge
|
十、生产环境启动配置清单
以下清单适用于服务器部署场景的 Linux 启动配置:
总结
Linux 系统启动是一个多阶段协作的过程,从固件到引导加载器、从内核到 init 系统,每个环节都值得深入理解。掌握 GRUB2 的配置文件层级和参数含义,能够在系统无法启动时从容应对,也能在日常运维中优化启动体验。
特别是对于服务器运维来说,GRUB 的密码保护、串口控制台配置、内核参数调优等技能,是保障远程服务器可靠性的关键。建议在测试环境中多练习 Live CD 修复 GRUB 和重建 initramfs 的操作,做到有备无患。
本文由AI辅助生成,内容仅供参考