Linux 系统启动流程与 GRUB 引导配置完全指南

Linux 系统启动流程与 GRUB 引导配置完全指南

Someone Lv5

理解 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 BIOSUEFI
磁盘分区表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
# 检查 /sys 文件系统
[ -d /sys/firmware/efi ] && echo "UEFI" || echo "Legacy BIOS"

# 或通过 efibootmgr 确认(仅 UEFI 下有输出)
which efibootmgr && efibootmgr || echo "Not UEFI"

# 查看 dmesg 启动日志
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.cfggrub-mkconfig 命令自动生成,切勿直接编辑。修改引导参数应在 /etc/default/grub 中进行,然后执行 update-grubgrub-mkconfig 重新生成。

3.2 核心配置参数详解

参数默认值说明
GRUB_DEFAULT0默认启动项(数字索引或菜单名)
GRUB_TIMEOUT5倒计时秒数(设为 -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
# 编辑 /etc/default/grub
GRUB_DEFAULT=saved # 记住上次选择
GRUB_SAVEDEFAULT=true
GRUB_TIMEOUT=10 # 等待 10 秒
GRUB_TIMEOUT_STYLE=menu # 始终显示菜单
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash" # 保留引导画面

# 应用配置
update-grub

场景二:调试模式(详细启动日志)

1
2
3
4
5
6
# 去除 quiet splash,添加详细日志参数
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
# 输入密码后得到类似如下哈希串
# grub.pbkdf2.sha512.10000.HEX...

# 编辑 /etc/grub.d/40_custom,添加:
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禁用 ACPIACPI 相关内核崩溃
mem=4G限制可用内存内存测试
ro以只读方式挂载根文件系统默认设置
rw以读写方式挂载根文件系统单用户修复
systemd.unit=rescue.target启动到 rescue 目标服务级别故障排查
systemd.unit=emergency.target启动到 emergency 目标极简环境修复
ip=dhcp网络启动时使用 DHCPPXE 网络引导

五、initramfs 与内核初始化

5.1 initramfs 的作用

initramfs(initial RAM filesystem)是一个临时的根文件系统,在真正的根文件系统挂载前提供最小运行环境。它的核心任务:

  1. 加载必要的存储控制器驱动(SCSI/NVMe/SATA)
  2. 加载文件系统驱动(ext4/xfs/btrfs)
  3. 解密 LUKS 加密分区
  4. 激活 LVM 卷组和 RAID 阵列
  5. 挂载真正的根文件系统并切换到它(pivot_root)

5.2 重建 initramfs

1
2
3
4
5
6
7
8
9
10
11
# Ubuntu/Debian
update-initramfs -u -k all # 更新所有内核的 initramfs
update-initramfs -c -k 5.15.0-86-generic # 为指定内核创建

# RHEL/CentOS
dracut -f # 强制更新当前内核的 initramfs
dracut -f --kver 5.14.0-362.el9.x86_64 # 指定内核版本

# 添加自定义驱动到 initramfs
echo "nvme_core" >> /etc/initramfs-tools/modules
update-initramfs -u

5.3 排查 initramfs 问题

1
2
3
4
5
6
7
8
9
10
# 查看 initramfs 内容
lsinitramfs /boot/initrd.img-$(uname -r) | head -30

# 解压并浏览 initramfs(通过 zcat 或 unmkinitramfs)
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
# 确保 EFI 分区已挂载
mount /dev/sda1 /boot/efi

# 安装 GRUB 到 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
# 安装到 MBR(设备本身,不是分区)
grub-install --target=i386-pc /dev/sda

# 或者使用 --boot-directory 指定 /boot 路径
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
# 1. 用 Live USB 启动系统
# 2. 挂载根分区和 EFI 分区
mount /dev/sda2 /mnt # 根分区
mount /dev/sda1 /mnt/boot/efi # EFI 分区

# 3. 挂载必要的虚拟文件系统
mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys

# 4. chroot 到目标系统
chroot /mnt /bin/bash

# 5. 根据启动模式重新安装 GRUB
# UEFI:
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=Ubuntu
# Legacy:
grub-install --target=i386-pc /dev/sda

update-grub
exit
reboot

七、自定义高级 GRUB 配置

7.1 自定义菜单主题

1
2
3
4
5
6
7
8
9
10
# 安装 GRUB 主题(以 VIMIX 为例)
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

# 在 /etc/default/grub 中启用主题
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
# 编辑 /etc/grub.d/40_custom 添加自定义启动项
cat >> /etc/grub.d/40_custom << 'EOF'
#!/bin/sh
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
# 检查 Secure Boot 状态
mokutil --sb-state

# 注册自定义 MOK(Machine Owner Key)
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 initinit 进程崩溃、/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 # 总启动时间
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"

启动优化建议:

  1. 减少内核模块:编辑 /etc/initramfs-tools/modules,只包含必要驱动
  2. 并行化服务:检查服务依赖,确保没有不必要的 After= 阻塞
  3. 禁用不必要的服务systemctl disable 不用的服务
  4. 使用 systemd-timer 替代 crontab 延迟非关键定时任务
  5. 精简 GRUB 配置:去除不需要的内核或恢复菜单项
1
2
3
# 查看当前内核列表,删除旧内核
dpkg --list | grep linux-image
apt-get autoremove --purge # 自动清理旧内核

十、生产环境启动配置清单

以下清单适用于服务器部署场景的 Linux 启动配置:

  • GRUB 密码保护已启用(防止物理访问篡改启动项)
  • GRUB_TIMEOUT 设置为 10 秒以上(远程管理时保留选择窗口)
  • 已删除旧内核(节省 /boot 空间)
  • GRUB_CMDLINE_LINUX 包含 console=tty0 console=ttyS0,115200n8(支持串口控制台)
  • 定期备份 /boot 目录(尤其 EFI 分区)
  • Secure Boot 已正确配置(如启用)
  • 测试过 rescue 模式和 single 模式可正常进入
  • 已配置串口 GRUB 终端(用于无头服务器)
  • 记录启动时长基线(systemd-analyze),以便对比异常

总结

Linux 系统启动是一个多阶段协作的过程,从固件到引导加载器、从内核到 init 系统,每个环节都值得深入理解。掌握 GRUB2 的配置文件层级和参数含义,能够在系统无法启动时从容应对,也能在日常运维中优化启动体验。

特别是对于服务器运维来说,GRUB 的密码保护、串口控制台配置、内核参数调优等技能,是保障远程服务器可靠性的关键。建议在测试环境中多练习 Live CD 修复 GRUB 和重建 initramfs 的操作,做到有备无患。


本文由AI辅助生成,内容仅供参考

  • 标题: Linux 系统启动流程与 GRUB 引导配置完全指南
  • 作者: Someone
  • 创建于 : 2026-06-11 09:27:00
  • 更新于 : 2026-06-18 08:39:57
  • 链接: https://demo-blog.qusite.cn/2026-06-11-linux-boot-process-grub-guide/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。