一、GRUB 基础概念

1.1 什么是 GRUB?

GRUB 是 Linux 系统最常用的启动引导程序,负责:

阶段 功能 存储位置
Stage 1 BIOS/UEFI 加载 GRUB 核心 MBR(主引导记录)或 EFI 分区
Stage 1.5 文件系统驱动,加载 Stage 2 /boot/grub 附近
Stage 2 完整功能:菜单、命令行、加载内核 /boot/grub/

1.2 GRUB 版本对比

特性 GRUB Legacy (GRUB 0.97) GRUB 2 (推荐)
配置文件 /boot/grub/menu.lst /boot/grub/grub.cfg(自动生成)
配置源 直接编辑 /etc/default/grub + /etc/grub.d/
脚本支持 有限 完整 Bash-like 语法
UEFI 支持
模块化 强(按需加载驱动)

现代发行版(Ubuntu 20.04+、RHEL 8+、Debian 11+)全部使用 GRUB 2


二、GRUB 界面详解

2.1 启动菜单界面

┌─────────────────────────────────────────────────────────┐
│  GNU GRUB  version 2.06                                 │
│                                                         │
│  ┌─────────────────────────────────────────────────┐   │
│  │ * Ubuntu                                        │   │
│  │   Advanced options for Ubuntu                   │   │
│  │   Windows Boot Manager (on /dev/nvme0n1p1)      │   │
│  │   UEFI Firmware Settings                        │   │
│  └─────────────────────────────────────────────────┘   │
│                                                         │
│  Use the ↑ and ↓ keys to select which entry is        │
│  highlighted. Press enter to boot the selected OS,    │
│  'e' to edit the commands before booting or 'c' for   │
│  a command-line.                                       │
│                                                         │
│  The highlighted entry will be executed automatically  │
│  in 10s.                                              │
│                                                         │
└─────────────────────────────────────────────────────────┘

按键功能

按键 功能
/ 选择启动项
Enter 启动选中项
e 编辑当前启动项(临时修改,不保存)
c 进入命令行模式(GRUB Shell)
Esc 返回上一级菜单
F10 / Ctrl+X 编辑后启动(在编辑界面)

2.2 编辑界面(按 e 进入)

┌─────────────────────────────────────────────────────────┐
│  setparams 'Ubuntu'                                     │
│                                                         │
│  recordfail                                             │
│  load_video                                             │
│  gfxmode $linux_gfx_mode                                │
│  insmod gzio                                            │
│  if [ x$grub_platform = xxen ]; then insmod xzio; fi    │
│  insmod part_gpt                                        │
│  insmod ext2                                            │
│  search --no-floppy --fs-uuid --set=root 1234-5678      │
│  linux   /vmlinuz-5.15.0-76-generic root=UUID=xxx ro    │
│  initrd  /initrd.img-5.15.0-76-generic                  │
│                                                         │
│  ┌─────────────────────────────────────────────────┐   │
│  │ Ctrl+X or F10: boot    Ctrl+C or F2: command   │   │
│  │ ESC: discard edits                              │   │
│  └─────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────┘

关键行解析

作用
linux /vmlinuz-... 指定内核镜像路径和启动参数
root=UUID=xxx 根文件系统位置
ro 以只读方式挂载根(后续 initramfs 会 remount rw)
initrd /initrd.img-... 指定初始化内存盘
quiet splash 静默启动+显示动画(删除可看到详细启动日志)

2.3 命令行模式(按 c 进入)

grub> ls                    # 列出所有设备和分区
grub> ls (hd0,gpt1)/        # 查看 (hd0,gpt1) 分区的根目录
grub> ls (hd0,gpt1)/boot/   # 查看 /boot 目录

grub> set root=(hd0,gpt2)   # 设置根分区
grub> linux /vmlinuz-5.15.0-76-generic root=/dev/nvme0n1p2 ro
grub> initrd /initrd.img-5.15.0-76-generic
grub> boot                  # 启动

常用命令

命令 功能
ls 列出设备、分区、文件
set root=(hdX,gptY) 设置根分区
linux /path/to/vmlinuz ... 加载内核
initrd /path/to/initrd 加载初始化内存盘
boot 启动系统
cat /etc/fstab 查看文件内容
help 查看帮助
reboot 重启
halt 关机

三、GRUB 配置定制

3.1 配置文件结构

/etc/grub.d/                    # 配置脚本目录(按数字顺序执行)
├── 00_header                   # 头部信息、环境设置
├── 05_debian_theme             # 主题/背景图(Ubuntu)
├── 10_linux                    # Linux 内核启动项(自动生成)
├── 20_linux_xen                # Xen 虚拟化支持
├── 30_os-prober                # 探测其他操作系统(Windows)
├── 30_uefi-firmware            # UEFI 固件设置入口
├── 40_custom                   # 用户自定义项(推荐在此添加)
└── 41_custom                   # 自定义项备份

/etc/default/grub               # 主配置文件(修改后需 update-grub)
/boot/grub/grub.cfg             # 生成的最终配置(不要直接编辑!)

3.2 常用配置修改

修改 /etc/default/grub
sudo nano /etc/default/grub

# 关键配置项:
GRUB_DEFAULT=0                    # 默认启动项(0=第一个)
GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 5.15.0-76-generic"  # 指定内核

GRUB_TIMEOUT=10                   # 菜单显示时间(秒),-1=无限等待
GRUB_TIMEOUT_STYLE=menu           # menu/countdown/hidden

GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"   # 默认启动参数
GRUB_CMDLINE_LINUX=""             # 附加到所有启动项的参数

# 显示/隐藏菜单
GRUB_HIDDEN_TIMEOUT=0             # 隐藏菜单,直接启动
GRUB_HIDDEN_TIMEOUT_QUIET=true

# 图形界面
GRUB_GFXMODE=1920x1080            # 分辨率
GRUB_GFXPAYLOAD_LINUX=keep        # 保持图形模式

# 主题
GRUB_THEME="/boot/grub/themes/starfield/theme.txt"

# 密码保护(生产环境推荐)
GRUB_PASSWORD="grub.pbkdf2.sha512.10000.xxx"
应用配置
# Debian/Ubuntu
sudo update-grub
# 或完整命令
sudo grub-mkconfig -o /boot/grub/grub.cfg

# RHEL/CentOS/Fedora
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
# UEFI 系统
sudo grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg

3.3 添加自定义启动项

编辑 /etc/grub.d/40_custom

#!/bin/sh
exec tail -n +3 $0

# 启动 Windows(手动指定)
menuentry "Windows 10" {
    insmod part_gpt
    insmod fat
    insmod chain
    search --fs-uuid --set=root 1234-5678
    chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}

# 启动 ISO 镜像(Live CD)
menuentry "Ubuntu Live ISO" {
    set isofile="/iso/ubuntu-22.04.iso"
    loopback loop (hd0,1)$isofile
    linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile quiet
    initrd (loop)/casper/initrd
}

# 内存测试
menuentry "Memory Test (Memtest86+)" {
    linux16 /boot/memtest86+.bin
}

然后执行 sudo update-grub

3.4 启动菜单美化

# 安装主题
sudo add-apt-repository ppa:daniruiz/flat-remix
sudo apt install flat-remix-grub

# 或手动安装
sudo git clone https://github.com/vinceliuice/grub2-themes.git /tmp/grub2-themes
cd /tmp/grub2-themes
sudo ./install.sh -t vimix -s 1080p

# 修改配置启用
sudo nano /etc/default/grub
GRUB_THEME="/boot/grub/themes/vimix/theme.txt"

sudo update-grub

四、GRUB 故障修复

4.1 常见故障场景

现象 原因 修复方法
error: file not found 内核文件被删除或移动 GRUB 命令行手动指定正确路径
error: unknown filesystem GRUB 不支持该文件系统 安装对应 fs 模块,或重建 GRUB
grub> 提示符(无菜单) grub.cfg 损坏或丢失 命令行手动启动,或 Live CD 修复
grub rescue> 提示符 Stage 1.5/2 损坏 使用 Live CD 完整重装 GRUB
直接进入 Windows,无 Linux UEFI 启动顺序被覆盖 调整 UEFI 启动项,或修复 GRUB
启动后黑屏 显卡驱动问题 编辑启动参数添加 nomodeset

4.2 紧急修复:GRUB 命令行启动系统

当 GRUB 菜单损坏,只剩 grub> 提示符时:

# 步骤 1:找到根分区
grub> ls
(hd0) (hd0,gpt1) (hd0,gpt2) (hd0,gpt3)

grub> ls (hd0,gpt2)/
# 看到 vmlinuz 和 initrd.img = 找到根分区

# 步骤 2:设置变量
grub> set root=(hd0,gpt2)
grub> set prefix=(hd0,gpt2)/boot/grub

# 步骤 3:加载内核(根据实际版本调整)
grub> linux /vmlinuz-5.15.0-76-generic root=/dev/nvme0n1p2 ro
# 或先用 UUID(更可靠)
grub> linux /vmlinuz-5.15.0-76-generic root=UUID=xxxxx ro

# 步骤 4:加载初始化内存盘
grub> initrd /initrd.img-5.15.0-76-generic

# 步骤 5:启动
grub> boot

进入系统后,立即修复 GRUB

sudo update-grub
sudo grub-install /dev/nvme0n1  # 安装到磁盘,不是分区!

4.3 Live CD 完整修复

# 1. 从 Ubuntu Live USB 启动,选择 "Try Ubuntu"

# 2. 打开终端,查看磁盘
sudo fdisk -l
# 找到 Linux 根分区,如 /dev/nvme0n1p2

# 3. 挂载根分区
sudo mount /dev/nvme0n1p2 /mnt

# 4. 挂载其他必要文件系统
sudo mount /dev/nvme0n1p1 /mnt/boot/efi  # UEFI 系统
sudo mount --bind /dev /mnt/dev
sudo mount --bind /proc /mnt/proc
sudo mount --bind /sys /mnt/sys

# 5. chroot 进入系统
sudo chroot /mnt

# 6. 重新安装 GRUB
grub-install /dev/nvme0n1
update-grub

# 7. 退出并重启
exit
sudo reboot

4.4 重置 root 密码

# 在 GRUB 菜单按 'e' 编辑启动项

# 找到 linux 开头的那行,在行末添加:
init=/bin/bash

# 按 Ctrl+X 或 F10 启动

# 进入 root shell(无密码!)
# 根分区是只读的,重新挂载
mount -o remount,rw /

# 修改密码
passwd root

# 重启
exec /sbin/init

五、UEFI 与 Legacy BIOS 差异

特性 Legacy BIOS UEFI
分区表 MBR GPT
启动文件位置 MBR 前 446 字节 EFI 系统分区(ESP)
GRUB 安装目标 /dev/sda(磁盘) /dev/sda1(ESP 分区)
安装命令 grub-install /dev/sda grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=ubuntu
配置文件路径 /boot/grub/grub.cfg /boot/efi/EFI/ubuntu/grub.cfg
安全启动 不支持 支持(可能需关闭或 shim)

UEFI 专用修复

# 重新安装 UEFI 版本的 GRUB
sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=ubuntu --recheck

# 更新 NVRAM 启动项
sudo efibootmgr -v  # 查看当前项
sudo update-grub

六、GRUB 安全加固

6.1 设置启动密码

# 生成密码哈希
grub-mkpasswd-pbkdf2
# 输入密码,复制生成的哈希

sudo nano /etc/grub.d/40_custom
set superusers="admin"
password_pbkdf2 admin grub.pbkdf2.sha512.10000.xxxxxx

# 限制普通用户编辑
sudo nano /etc/grub.d/10_linux
# 在 menuentry 块中添加 --users '' 表示需要密码
menuentry 'Ubuntu' --users '' {
    ...
}

sudo update-grub

6.2 禁用恢复模式

sudo nano /etc/default/grub
GRUB_DISABLE_RECOVERY="true"

sudo update-grub

本文为同步搬运内容,原创首发于个人独立博客网站:https://www.zheng-chang-ren.xyz
平台更新优先级说明:所有技术笔记、实验教程、踩坑总结均会优先发布、长期维护于个人独立博客;CSDN 仅作为辅助分发渠道。
若想查阅全部完整文集、获取最新首发内容,建议收藏并优先访问我的个人博客网站。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐