文档版本: 1.0 最后更新: 2025-05-14 (基于对话) 适用系统: Fedora Linux (UEFI 引导模式)
by Gemini 2.5 Pro & foggystar
本文档旨在帮助用户在 Fedora UEFI 系统上自定义 GRUB2 启动加载器的菜单项和外观。GRUB 是 Linux 系统中常用的引导加载程序,允许用户选择要启动的操作系统或内核。
- 数据备份: 在对 GRUB 配置进行任何修改之前,务必备份所有重要数据。
- Live 环境准备: 熟悉如何使用 Fedora Live USB/DVD 启动并在需要时修复 GRUB。错误配置可能导致系统无法启动。
- 小心操作: 严格按照步骤操作,理解每一步的含义。
- 主要配置文件 (用户修改):
/etc/default/grub- 定义 GRUB 的全局行为和默认外观设置。
- GRUB 脚本目录:
/etc/grub.d/- 包含多个脚本,
grub2-mkconfig会按顺序执行这些脚本来生成最终的grub.cfg。 00_header: 设置头部信息,包括超时、默认主题等。10_linux: 使用blscfg根据/boot/loader/entries/下的 BLS 文件生成 Fedora 内核启动项。12_menu_auto_hide(Fedora 特有): 可能根据上次启动状态自动隐藏菜单或减少超时。30_os-prober(或30_os-prober_proxy): 负责检测其他操作系统。31_uefi-firmware: 添加 UEFI 固件设置的启动项。40_custom: 用户添加自定义启动项的地方,这里的条目不会被自动更新覆盖。
- 包含多个脚本,
- 生成的 GRUB 配置文件 (不要直接编辑此文件!):
- 在你的 Fedora UEFI 系统中,主配置文件通常是:
/boot/grub2/grub.cfg - EFI 分区上的
grub.cfg(/boot/efi/EFI/fedora/grub.cfg) 可能只是一个指向/boot/grub2/grub.cfg的包装器或存根。
- 在你的 Fedora UEFI 系统中,主配置文件通常是:
- 更新 GRUB 配置的命令:
每次修改
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
/etc/default/grub或/etc/grub.d/目录下的文件后,都必须运行此命令。
在开始之前,备份关键配置文件:
sudo cp /etc/default/grub /etc/default/grub.bak
sudo cp -R /etc/grub.d /etc/grub.d.bak
sudo cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg.bak # 备份当前生效的GRUB配置如果出现问题,你可以从备份中恢复这些文件,然后重新运行 sudo grub2-mkconfig -o /boot/grub2/grub.cfg。
os-prober 会扫描磁盘以查找其他操作系统(如 Windows)并为其创建启动项。
- 禁用
os-prober(推荐,如果你想完全手动控制非 Fedora 启动项): 编辑/etc/default/grub:添加或修改行:sudo nano /etc/default/grub
GRUB_DISABLE_OS_PROBER=true - 启用
os-prober: 在/etc/default/grub中设置:(或者注释掉GRUB_DISABLE_OS_PROBER=falseGRUB_DISABLE_OS_PROBER这一行,默认是启用的)。 确保os-prober包已安装:sudo dnf install os-prober。
这是添加或重命名非 Fedora 启动项(如 Windows)的推荐方法。
如果 os-prober 之前检测到过该系统,你可以查看 /boot/grub2/grub.cfg (不要修改它) 来复制其 menuentry 块作为参考。
sudo nano /etc/grub.d/40_custom确保文件结构如下,并将你的 menuentry 块添加到注释之后:
#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.
menuentry 'Windows 10' --class windows --class os $menuentry_id_option 'osprober-efi-YOUR_ESP_UUID' {
insmod part_gpt
insmod fat
search --no-floppy --fs-uuid --set=root YOUR_ESP_UUID
chainloader /efi/Microsoft/Boot/bootmgfw.efi # 标准 UEFI Windows 路径
}
- 将
Windows 10替换为你想要的名称。 - 将
YOUR_ESP_UUID替换为你的 Windows EFI 系统分区 (ESP) 的文件系统 UUID (例如6078-2E2D)。你可以使用lsblk -f或sudo blkid查找。 - 重要: 确保此文件有执行权限:
sudo chmod +x /etc/grub.d/40_custom。
如果你启用了 os-prober 但又在 40_custom 中定义了同一个系统,为避免重复,可以在 /etc/default/grub 中告诉 os-prober 跳过该分区:
# GRUB_OS_PROBER_SKIP_LIST="YOUR_ESP_UUID@/dev/your_esp_device_name"
# 例如: GRUB_OS_PROBER_SKIP_LIST="6078-2E2D@/dev/nvme1n1p1"如果已设置 GRUB_DISABLE_OS_PROBER=true,则不需要此项。
Fedora 使用 BootLoaderSpec (BLS),内核条目由 /boot/loader/entries/ 下的 .conf 文件定义。
该目录包含形如 [machine-id]-[kernel-version].conf 的文件,每个文件定义一个内核启动项。
machine-id: 系统的唯一标识符,来自/etc/machine-id。kernel-version: 内核的具体版本号。0-rescue.conf: 救援模式启动项。
- 配置保留数量: 编辑
/etc/dnf/dnf.conf,设置installonly_limit(例如installonly_limit=2保留最新的2个内核)。 - 自动移除: 运行
sudo dnf autoremove。这将移除超出installonly_limit限制的旧内核及其对应的/boot/loader/entries/文件。 - 不要移除当前内核 (
uname -r) 或所有备用内核。
- 定位到
/boot/loader/entries/目录下你想要修改的内核对应的.conf文件。 - 使用
sudo nano编辑该文件。 - 修改
title行的值为你想要的名称。例如:title My Fedora (Kernel 6.x.x) - 保存文件。注意: 内核更新时,新内核的
.conf文件会以默认标题生成,你可能需要再次修改。
所有这些设置都在 /etc/default/grub 文件中进行。
GRUB_GFXMODE="2560x1440,auto" # 设置为你显示器支持的分辨率,可加多个备选
# GRUB_GFXPAYLOAD_LINUX=keep # (可选)让内核保持此分辨率在 GRUB 菜单按 c 进入命令行,输入 videoinfo 查看支持的模式。
- 将图片 (PNG, JPG, TGA) 复制到
/boot/grub2/目录 (或其他 GRUB 能访问的路径)。sudo cp /path/to/your/image.jpg /boot/grub2/mybackground.jpg
- 在
/etc/default/grub中设置:GRUB_BACKGROUND="/boot/grub2/mybackground.jpg"
- GRUB 使用
.pf2格式字体。转换.ttf或.otf字体:# 示例:将 JetBrainsMono 转换为 myfont.pf2,大小为18 sudo grub2-mkfont -s 18 -o /boot/grub2/fonts/myfont.pf2 /path/to/JetBrainsMono.ttf # 确保 /boot/grub2/fonts 目录存在,如果不存在则创建:sudo mkdir -p /boot/grub2/fonts
- 在
/etc/default/grub中设置:GRUB_FONT="/boot/grub2/fonts/myfont.pf2"
- 将主题文件夹 (例如
my-theme) 放到/boot/grub2/themes/或/usr/share/grub/themes/目录下。sudo cp -R /path/to/your/my-theme /usr/share/grub/themes/
- 在
/etc/default/grub中指定主题的theme.txt文件:你的主题路径是:GRUB_THEME="/usr/share/grub/themes/my-theme/theme.txt"
GRUB_THEME="/usr/share/grub/themes/tela/theme.txt"
主要用于无主题的文本模式。如果使用主题,主题颜色会覆盖这些。
# GRUB_COLOR_NORMAL="light-gray/black"
# GRUB_COLOR_HIGHLIGHT="magenta/black"这些设置也在 /etc/default/grub 中。
设置菜单显示的秒数。
GRUB_TIMEOUT="15" # 菜单显示15秒。如果为0,则不显示菜单直接启动默认项。控制菜单如何显示。
GRUB_TIMEOUT_STYLE=menu # 总是显示菜单
# 其他可能的值: hidden (按Shift/Esc显示), countdown (显示倒计时后自动启动)在 Fedora 中,/etc/grub.d/12_menu_auto_hide 脚本有时会根据上次启动是否成功来覆盖你在 /etc/default/grub 中设置的 GRUB_TIMEOUT 和 GRUB_TIMEOUT_STYLE,导致菜单被隐藏或超时变为0。
解决方案:移除该脚本的执行权限。
sudo chmod -x /etc/grub.d/12_menu_auto_hide之后重新生成 GRUB 配置,这将阻止该脚本运行。
在对 /etc/default/grub 或 /etc/grub.d/ 目录下的任何文件进行修改后,必须运行以下命令来使更改生效:
sudo grub2-mkconfig -o /boot/grub2/grub.cfg-
grub2-mkconfig输出不显示自定义条目,但条目实际已添加:- 现象:
sudo grub2-mkconfig ...的屏幕输出没有明确提到正在添加来自40_custom的条目。 - 检查: 使用
sudo cat /boot/grub2/grub.cfg | grep 'Your Menu Entry Name'查看最终配置文件中是否包含该条目。 - 原因:
40_custom通过exec tail直接输出内容,grub2-mkconfig可能不会为这种方式生成特定的状态消息。只要条目在最终的grub.cfg中,就是正常的。
- 现象:
-
GRUB 菜单不显示,直接进入系统:
- 检查
/etc/default/grub:- 确保
GRUB_TIMEOUT是一个正数 (如10或15)。 - 确保
GRUB_TIMEOUT_STYLE=menu。
- 确保
- 检查
/etc/grub.d/40_custom:- 确保
#!/bin/sh在第一行。 - 确保
exec tail -n +3 $0在第二行。 - 确保
menuentry语法正确。 - 确保文件有执行权限 (
sudo chmod +x /etc/grub.d/40_custom)。
- 确保
- 禁用
12_menu_auto_hide: 运行sudo chmod -x /etc/grub.d/12_menu_auto_hide。 - 重新生成配置:
sudo grub2-mkconfig -o /boot/grub2/grub.cfg。 - 强制显示: 重启时尝试按住
Shift或反复按Esc。 - 简化测试: 临时移除
/etc/default/grub中的主题、字体等美化设置,只保留基本超时和样式配置,然后重新生成并测试。
- 检查
-
GRUB 菜单出现多余的 Windows 启动项:
- 原因:
os-prober可能在多个位置检测到 Windows 文件,或者你同时使用了os-prober和40_custom来定义同一个 Windows 系统。 - 解决方案:
- 在
/etc/default/grub中设置GRUB_DISABLE_OS_PROBER=true,然后只依赖40_custom来定义你的 Windows 启动项。 - 如果必须使用
os-prober,使用GRUB_OS_PROBER_SKIP_LIST来精确排除你已在40_custom中定义的分区。
- 在
- 原因:
在进行任何修改后,务必运行 sudo grub2-mkconfig -o /boot/grub2/grub.cfg 并重启电脑以查看效果。