GRUB2 引导管理器完全教程 / 第 3 章:配置文件详解
第 3 章:配置文件详解
3.1 配置文件结构
GRUB2 的主配置文件是 /boot/grub/grub.cfg。这个文件由 grub-mkconfig 自动生成,不应手动编辑,因为下次运行更新命令时会覆盖修改。
3.1.1 配置文件层级
/boot/grub/grub.cfg ← 主配置(自动生成,不要手动编辑)
/etc/default/grub ← 用户配置(主要编辑此文件)
/etc/grub.d/ ← 生成脚本目录
├── 00_header ← 头部设置(超时、默认项、主题)
├── 05_debian_theme ← Debian 主题(背景、颜色)
├── 10_linux ← Linux 内核检测
├── 20_linux_xen ← Xen 虚拟化
├── 30_os-prober ← 其他操作系统检测
├── 30_uefi-firmware ← UEFI 固件设置入口
├── 40_custom ← 自定义菜单项(用户编辑此文件)
├── 41_custom ← 自定义菜单(加载 custom.cfg)
└── README ← 说明文件
⚠️ 注意:不同发行版的脚本文件名和顺序可能略有不同。RHEL/Fedora 使用
grub2-mkconfig和/etc/grub2.cfg(符号链接)。
3.1.2 grub.cfg 基本结构
# /boot/grub/grub.cfg — 自动生成的示例结构
#
# --- 头部区域 ---
# 设置默认项、超时、主题等
set default=0
set timeout=5
set menu_color_normal=white/black
set menu_color_highlight=black/light-gray
# 加载模块
loadfont unicode
set gfxmode=auto
insmod all_video
insmod gfxterm
terminal_output gfxterm
# --- 菜单区域 ---
menuentry 'Debian GNU/Linux' --class debian --class gnu-linux --class gnu --class os {
load_video
insmod gzio
insmod part_gpt
insmod ext2
set root='hd0,gpt2'
search --no-floppy --fs-uuid --set=root xxxx-xxxx-xxxx
linux /boot/vmlinuz-6.1.0-amd64 root=UUID=xxxx-xxxx ro quiet splash
initrd /boot/initrd.img-6.1.0-amd64
}
menuentry 'Windows Boot Manager' --class windows --class os {
insmod part_gpt
insmod fat
set root='hd0,gpt1'
search --no-floppy --fs-uuid --set=root XXXX-XXXX
chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}
3.2 grub.cfg 语法详解
3.2.1 命令参考
GRUB2 有大量内置命令,以下是最常用的:
| 命令 | 说明 | 示例 |
|---|---|---|
set | 设置变量 | set default=0 |
unset | 删除变量 | unset theme |
insmod | 加载模块 | insmod ext2 |
linux | 加载 Linux 内核 | linux /boot/vmlinuz root=/dev/sda2 |
linux16 | 16 位模式加载内核(BIOS) | linux16 /boot/vmlinuz root=/dev/sda2 |
initrd | 加载初始内存盘 | initrd /boot/initrd.img |
initrd16 | 16 位模式加载 initrd | initrd16 /boot/initrd.img |
chainloader | 链式加载其他引导程序 | chainloader /EFI/Microsoft/Boot/bootmgfw.efi |
search | 搜索分区 | search --no-floppy --fs-uuid --set=root UUID |
menuentry | 定义菜单项 | menuentry 'Linux' { ... } |
submenu | 定义子菜单 | submenu 'Advanced' { ... } |
load_video | 加载视频模块 | load_video |
set root | 设置根设备 | set root='hd0,gpt2' |
set gfxpayload | 设置图形模式 | set gfxpayload=keep |
terminal_output | 设置输出终端 | terminal_output gfxterm |
loadfont | 加载字体 | loadfont unicode |
source | 加载外部配置 | source /boot/grub/custom.cfg |
3.2.2 变量
GRUB2 支持变量的设置和引用:
# 设置变量
set my_var="hello world"
set default=0
set timeout=5
# 引用变量
echo $my_var
echo ${my_var}
# 特殊变量
# default — 默认启动项编号
# timeout — 超时时间(秒)
# fallback — 默认项失败后的回退项
# gfxmode — 图形模式分辨率
# gfxpayload — 传递给内核的图形模式
# root — 根设备
# prefix — GRUB 配置文件所在目录
3.2.3 条件判断
# 基本 if-else
if [ -f /boot/grub/grubenv ]; then
load_env
fi
# 比较操作
if [ ${default} = 0 ]; then
set timeout=10
else
set timeout=30
fi
# 检查变量是否已设置
if [ "${grub_platform}" = "efi" ]; then
insmod efi_gop
fi
# 检查文件是否存在
if [ -f ${prefix}/themes/mytheme/theme.txt ]; then
set theme=${prefix}/themes/mytheme/theme.txt
fi
3.2.4 循环
# for 循环
for v in 0 1 2 3; do
echo "Testing mode $v"
done
# while 循环(少见用法)
set i=0
while [ $i -lt 10 ]; do
set i=$((i + 1))
done
3.2.5 函数
# 定义函数
function load_video {
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root XXXX-XXXX
fi
insmod efi_gop
insmod efi_uga
insmod video_bochs
insmod video_cirrus
insmod all_video
}
# 调用函数
load_video
3.3 菜单项(menuentry)
3.3.1 基本语法
menuentry '显示名称' [选项] {
# 菜单项内容
...
}
3.3.2 menuentry 选项
| 选项 | 说明 | 示例 |
|---|---|---|
--class | 菜单项图标类别 | --class gnu-linux --class os |
--users | 限制访问的用户 | --users admin |
--unrestricted | 允许所有用户访问 | --unrestricted |
--hotkey | 快捷键 | --hotkey='w' |
3.3.3 完整的 Linux 菜单项
menuentry 'Debian GNU/Linux' --class debian --class gnu-linux --class gnu --class os --unrestricted {
# 加载视频驱动
load_video
insmod gzio
# 加载文件系统模块
insmod part_gpt
insmod ext2
# 设置根设备(使用 UUID 更可靠)
search --no-floppy --fs-uuid --set=root 1234-5678-abcd-efgh
# 加载内核
# ro: 以只读方式挂载根分区
# quiet: 减少启动信息
# splash: 显示启动画面
linux /boot/vmlinuz-6.1.0-amd64 root=UUID=1234-5678-abcd-efgh ro quiet splash
# 加载初始内存盘
initrd /boot/initrd.img-6.1.0-amd64
}
3.3.4 子菜单
submenu 'Advanced options for Debian' --class debian --class gnu-linux {
menuentry 'Debian GNU/Linux, with Linux 6.1.0-amd64' {
linux /boot/vmlinuz-6.1.0-amd64 root=UUID=xxx ro
initrd /boot/initrd.img-6.1.0-amd64
}
menuentry 'Debian GNU/Linux, with Linux 6.1.0-amd64 (recovery mode)' {
linux /boot/vmlinuz-6.1.0-amd64 root=UUID=xxx ro single
initrd /boot/initrd.img-6.1.0-amd64
}
}
3.4 常用内核参数
内核参数在 linux 命令行中指定,以空格分隔。以下是常用参数:
3.4.1 根设备与文件系统
| 参数 | 说明 | 示例 |
|---|---|---|
root= | 根设备 | root=/dev/sda2 或 root=UUID=xxx |
ro | 只读挂载根分区(推荐) | ro |
rw | 读写挂载根分区 | rw |
rootflags= | 根分区挂载选项 | rootflags=subvol=@ |
rootfstype= | 根分区文件系统类型 | rootfstype=ext4 |
3.4.2 控制台与显示
| 参数 | 说明 | 示例 |
|---|---|---|
quiet | 减少启动输出 | quiet |
splash | 启用启动画面(Plymouth) | splash |
nomodeset | 禁用内核模式设置(显卡问题时使用) | nomodeset |
vga= | VGA 文本模式 | vga=0x31A(1280x1024) |
video= | 视频模式 | video=HDMI-A-1:1920x1080@60 |
console= | 控制台设备 | console=ttyS0,115200(串口) |
text | 强制文本模式启动 | text |
3.4.3 系统调试
| 参数 | 说明 | 示例 |
|---|---|---|
single 或 1 | 单用户/救援模式 | single |
init=/bin/bash | 直接进入 shell(跳过 init) | init=/bin/bash |
systemd.unit=rescue.target | systemd 救援模式 | systemd.unit=rescue.target |
systemd.unit=emergency.target | 紧急模式 | systemd.unit=emergency.target |
debug | 开启调试输出 | debug |
loglevel= | 日志级别(0-7) | loglevel=7 |
break= | 在指定阶段暂停 | break=premount |
panic= | 内核恐慌后等待秒数 | panic=10 |
3.4.4 硬件控制
| 参数 | 说明 | 示例 |
|---|---|---|
acpi=off | 禁用 ACPI | acpi=off |
noapic | 禁用 APIC | noapic |
pci=noacpi | PCI 不使用 ACPI | pci=noacpi |
modprobe.blacklist= | 黑名单模块 | modprobe.blacklist=nouveau |
intel_iommu=off | 禁用 Intel IOMMU | intel_iommu=off |
nvidia.modeset=0 | 禁用 NVIDIA KMS | nvidia.modeset=0 |
3.4.5 安全相关
| 参数 | 说明 | 示例 |
|---|---|---|
enforcing=0 | SELinux 设为 Permissive | enforcing=0 |
apparmor=0 | 禁用 AppArmor | apparmor=0 |
init_on_alloc=0 | 禁用内存分配清零 | init_on_alloc=0 |
3.4.6 常用参数组合
# 正常启动(推荐)
linux /boot/vmlinuz root=UUID=xxx ro quiet splash
# 调试模式
linux /boot/vmlinuz root=UUID=xxx ro debug loglevel=7
# 安全/恢复模式
linux /boot/vmlinuz root=UUID=xxx ro single nomodeset
# 显卡问题修复
linux /boot/vmlinuz root=UUID=xxx ro nomodeset nouveau.modeset=0
# 串口控制台(服务器)
linux /boot/vmlinuz root=UUID=xxx ro console=tty0 console=ttyS0,115200n8
# 指定 init 系统
linux /boot/vmlinuz root=UUID=xxx ro systemd.unit=multi-user.target
3.5 主题设置
3.5.1 在 grub.cfg 中配置主题
# 设置主题目录
set theme=${prefix}/themes/mytheme/theme.txt
# 导出变量供主题使用
export theme
3.5.2 设置背景图片
# 方式一:使用背景图片命令
background_image ${prefix}/themes/mytheme/background.png
# 方式二:在主题文件中配置
# 在 theme.txt 中添加:
# desktop-image: "background.png"
3.6 超时与默认项
3.6.1 超时设置
# 等待 5 秒后自动启动默认项
set timeout=5
# 立即启动(不显示菜单)
set timeout=0
# 需要用户手动选择(不自动启动)
set timeout=-1
3.6.2 默认启动项
# 按编号设置(0 = 第一个菜单项)
set default=0
# 按名称设置(支持通配符)
set default="Debian GNU/Linux"
# 使用上次成功启动的项(需要 grubenv)
set default=saved
# 使用 saved 时,需要以下配合
set default=saved
save_env default # 保存当前默认项
3.6.3 回退启动项
# 默认项失败时,尝试以下备选项
set default=0
set fallback=1
3.6.4 菜单显示控制
# 显示菜单(即使只有一项)
set timeout_style=menu
set timeout=5
# 倒计时样式(不显示菜单,只显示倒计时)
set timeout_style=countdown
set timeout=5
# 隐藏菜单(按 Shift 键显示)
set timeout_style=hidden
set timeout=0
3.7 颜色配置
# 菜单颜色
set menu_color_normal=white/black # 普通项:白字黑底
set menu_color_highlight=black/light-gray # 高亮项:黑字浅灰底
# 支持的颜色名称:
# black, blue, green, cyan, red, magenta, brown, light-gray
# dark-gray, light-blue, light-green, light-cyan, light-red
# light-magenta, yellow, white
3.8 图形终端设置
# 加载字体
loadfont unicode
# 设置图形模式(分辨率)
set gfxmode=auto
# 或指定分辨率
set gfxmode=1920x1080
# 或多个备选
set gfxmode=1920x1080,1280x1024,auto
# 加载图形驱动模块
insmod all_video
# 或更精确地加载
insmod efi_gop # UEFI 图形输出协议
insmod efi_uga # UEFI 统一图形适配器
insmod video_bochs # BIOS VESA
insmod video_cirrus # BIOS Cirrus
# 切换到图形终端
terminal_output gfxterm
# 传递图形模式给内核
set gfxpayload=keep # 保持 GRUB 的图形模式
# 或
set gfxpayload=text # 使用文本模式
3.9 GRUB 环境变量块(grubenv)
/boot/grub/grubenv 文件用于存储持久化的 GRUB 变量,如上次启动的菜单项。
# 查看环境变量
$ sudo grub-editenv /boot/grub/grubenv list
# saved_entry=Debian GNU/Linux
# 设置环境变量
$ sudo grub-editenv /boot/grub/grubenv set default=0
# 设置为"记住上次启动项"
$ sudo grub-editenv /boot/grub/grubenv set saved_entry=0
# 重置环境变量
$ sudo grub-editenv /boot/grub/grubenv unset default
# 创建新的环境块文件
$ sudo grub-editenv /boot/grub/grubenv create
使用上次启动项作为默认
在 /etc/default/grub 中:
GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=true
然后运行:
$ sudo update-grub
⚠️ 注意:
GRUB_SAVEDEFAULT=true需要 Btrfs 或支持写入的文件系统。某些只读文件系统或 LVM 快照环境下可能不工作。
3.10 /etc/default/grub 参数完整参考
/etc/default/grub 是用户配置 GRUB 的主要入口,以下是完整参数:
# 默认启动项编号(从 0 开始)
# 或 "saved" 使用上次启动项
GRUB_DEFAULT=0
# 超时时间(秒)
GRUB_TIMEOUT=5
# 超时样式:menu / countdown / hidden
GRUB_TIMEOUT_STYLE=menu
# 分发版名称
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
# 内核命令行参数
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
# 所有菜单项都追加的内核参数
GRUB_CMDLINE_LINUX=""
# 是否启用恢复模式菜单项
GRUB_DISABLE_RECOVERY="false"
# 是否禁用 os-prober(检测其他系统)
GRUB_DISABLE_OS_PROBER=false
# 终端类型
GRUB_TERMINAL="console"
# 可选值:console, serial, gfxterm, ofconsole
# 串口配置(配合 GRUB_TERMINAL=serial)
GRUB_SERIAL_COMMAND="serial --speed=9600 --unit=0 --word=8 --parity=no --stop=1"
# 图形模式分辨率
GRUB_GFXMODE=auto
# 示例:GRUB_GFXMODE=1920x1080
# 传递给内核的图形模式
GRUB_GFXPAYLOAD_LINUX=keep
# 菜单颜色
GRUB_COLOR_NORMAL="white/black"
GRUB_COLOR_HIGHLIGHT="black/light-gray"
# 背景图片
GRUB_BACKGROUND="/boot/grub/background.png"
# 主题
GRUB_THEME="/boot/grub/themes/mytheme/theme.txt"
# 字体
GRUB_FONT="/boot/grub/fonts/unicode.pf2"
# 是否保存上次启动项
GRUB_SAVEDEFAULT=false
# 是否禁用子菜单
GRUB_DISABLE_SUBMENU=true
# 是否生成 recovery 模式的 quiet 参数
GRUB_RECOVERY_COMMAND=""
# 初始化 ramdisk 是否使用 UUID
GRUB_INIT_TUNE=""
3.10.1 GRUB_DEFAULT 的特殊值
| 值 | 说明 |
|---|---|
0 | 第一个菜单项 |
1 | 第二个菜单项 |
>N | 子菜单中第 N 项(如 >2 表示第一个子菜单的第三项) |
"string" | 按名称匹配(如 "Debian GNU/Linux, with Linux 6.1.0") |
saved | 使用 grubenv 中保存的项 |
3.11 配置修改流程
修改配置的标准流程:
# 1. 编辑 /etc/default/grub
$ sudo nano /etc/default/grub
# 2. 编辑自定义菜单项(可选)
$ sudo nano /etc/grub.d/40_custom
# 3. 重新生成 grub.cfg
$ sudo update-grub # Debian/Ubuntu
$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg # RHEL/Fedora
$ sudo grub-mkconfig -o /boot/grub/grub.cfg # Arch Linux
# 4. 验证配置
$ grep menuentry /boot/grub/grub.cfg
# 5. 重启测试
$ sudo reboot
3.12 扩展阅读
上一章:第 2 章:安装与部署 | 下一章:第 4 章:自动生成配置