强曰为道

与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

第 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
linux1616 位模式加载内核(BIOS)linux16 /boot/vmlinuz root=/dev/sda2
initrd加载初始内存盘initrd /boot/initrd.img
initrd1616 位模式加载 initrdinitrd16 /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/sda2root=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 系统调试

参数说明示例
single1单用户/救援模式single
init=/bin/bash直接进入 shell(跳过 init)init=/bin/bash
systemd.unit=rescue.targetsystemd 救援模式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禁用 ACPIacpi=off
noapic禁用 APICnoapic
pci=noacpiPCI 不使用 ACPIpci=noacpi
modprobe.blacklist=黑名单模块modprobe.blacklist=nouveau
intel_iommu=off禁用 Intel IOMMUintel_iommu=off
nvidia.modeset=0禁用 NVIDIA KMSnvidia.modeset=0

3.4.5 安全相关

参数说明示例
enforcing=0SELinux 设为 Permissiveenforcing=0
apparmor=0禁用 AppArmorapparmor=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 章:自动生成配置