GRUB2 引导管理器完全教程 / 第 6 章:主题与美化
第 6 章:主题与美化
6.1 GRUB 主题系统概述
GRUB2 的图形终端(gfxterm)支持 GfxMenu 主题规范,允许自定义引导界面的外观,包括背景图片、字体、颜色、进度条、菜单样式等。
主题系统架构
/boot/grub/themes/
└── mytheme/
├── theme.txt ← 主题配置文件(必需)
├── background.png ← 背景图片
├── terminal.png ← 终端背景(可选)
├── boot_menu/
│ ├── menu_bkgnd.png ← 菜单背景
│ ├── scrollbar_thumb.png
│ └── scrollbar_bkgnd.png
├── progress_bar/
│ ├── progress_bkgnd.png
│ └── progress_bar.png
├── icons/
│ ├── gnu-linux.png
│ ├── windows.png
│ ├── os.png
│ └── ...
└── fonts/
└── dejavu-sans-12.pf2
6.2 主题配置文件(theme.txt)
6.2.1 基本结构
# /boot/grub/themes/mytheme/theme.txt
# 桌面(背景)
desktop-image: "background.png"
desktop-color: "#000000"
# 标题
title-text: ""
title-color: "#ffffff"
title-font: "DejaVu Sans Bold 24"
# 终端样式
terminal-font: "DejaVu Sans Mono 14"
terminal-box: "terminal_box_*.png"
terminal-left: "0"
terminal-top: "0"
terminal-width: "100%"
terminal-height: "100%"
# 引导菜单
+ boot_menu {
left = 15%
top = 25%
width = 70%
height = 60%
item_font = "DejaVu Sans Regular 16"
item_color = "#cccccc"
selected_item_font = "DejaVu Sans Bold 18"
selected_item_color = "#ffffff"
item_height = 36
item_padding = 8
item_spacing = 4
icon_width = 32
icon_height = 32
# 菜单背景
menu_pixmap_style = "boot_menu_bkgnd_*.png"
# 滚动条
scrollbar = true
scrollbar_width = 12
scrollbar_thumb = "scrollbar_thumb_*.png"
scrollbar_frame = "scrollbar_bkgnd_*.png"
}
# 进度条(用于启动计时)
+ progress_bar {
id = "__timeout__"
left = 25%
top = 90%
width = 50%
height = 16
bar_style = "progress_bar_*.png"
highlight_style = "progress_highlight_*.png"
text = ""
text_color = "#ffffff"
font = "DejaVu Sans Regular 12"
}
6.2.2 theme.txt 完整属性参考
桌面属性:
| 属性 | 类型 | 说明 | 示例 |
|---|---|---|---|
desktop-image | 字符串 | 背景图片文件名 | "background.png" |
desktop-color | 颜色 | 无图片时的背景色 | "#1a1a2e" |
desktop-image-h-align | 枚举 | 水平对齐 | center / left / right |
desktop-image-v-align | 枚举 | 垂直对齐 | center / top / bottom |
desktop-image-scale-method | 枚举 | 缩放方式 | fitwidth / fitheight / stretch |
标题属性:
| 属性 | 类型 | 说明 | 示例 |
|---|---|---|---|
title-text | 字符串 | 标题文本 | "My GRUB" |
title-color | 颜色 | 标题颜色 | "#ffffff" |
title-font | 字符串 | 标题字体 | "DejaVu Sans Bold 24" |
title-x | 整数/百分比 | X 坐标 | 50% |
title-y | 整数/百分比 | Y 坐标 | 5% |
引导菜单属性(boot_menu):
| 属性 | 类型 | 说明 |
|---|---|---|
left | 整数/百分比 | 左边距 |
top | 整数/百分比 | 上边距 |
width | 整数/百分比 | 宽度 |
height | 整数/百分比 | 高度 |
item_font | 字符串 | 普通项字体 |
item_color | 颜色 | 普通项颜色 |
selected_item_font | 字符串 | 选中项字体 |
selected_item_color | 颜色 | 选中项颜色 |
item_height | 整数 | 每项高度(像素) |
item_padding | 整数 | 项内边距 |
item_spacing | 整数 | 项间距 |
icon_width | 整数 | 图标宽度 |
icon_height | 整数 | 图标高度 |
scrollbar | 布尔 | 是否显示滚动条 |
scrollbar_width | 整数 | 滚动条宽度 |
颜色格式:
# 支持的格式
"#RRGGBB" # 6位十六进制,如 "#ff0000"(红色)
"#RRGGBBAA" # 带透明度,如 "#ff000080"(半透明红)
"255, 0, 0" # RGB 逗号分隔
"255, 0, 0, 128" # RGBA
"red" # 颜色名称(white, black, red, green, blue 等)
6.3 背景图片
6.3.1 支持的格式
| 格式 | 支持 | 说明 |
|---|---|---|
| PNG | ✅ | 推荐,支持透明度 |
| JPEG/JPG | ✅ | 不支持透明度 |
| TGA | ✅ | 较少见 |
6.3.2 推荐分辨率
| 分辨率 | 场景 |
|---|---|
| 1920×1080 | 全高清(推荐) |
| 2560×1440 | 2K |
| 3840×2160 | 4K |
| 1366×768 | 笔记本常见 |
| 1024×768 | 兼容性最好 |
6.3.3 准备背景图片
# 查看显示器分辨率(在 Linux 中)
$ xrandr | grep " connected"
# HDMI-A-1 connected primary 1920x1080+0+0
# 使用 ImageMagick 调整图片大小
$ convert input.jpg -resize 1920x1080! background.png
# ! 表示强制精确尺寸(可能变形)
# 保持宽高比缩放并裁剪
$ convert input.jpg -resize 1920x1080^ -gravity center -extent 1920x1080 background.png
# 降低文件大小(GRUB 加载大图片会变慢)
$ convert background.png -quality 85 -strip background.jpg
⚠️ 注意:GRUB 加载图片到内存的速度有限,建议背景图片不超过 5MB,分辨率不超过 1920×1080。过大的图片会明显拖慢启动速度。
6.4 字体
6.4.1 GRUB 字体格式
GRUB2 使用 .pf2 格式的位图字体。系统中已有的字体需要转换才能使用。
# 查看系统中可用的 GRUB 字体
$ ls /usr/share/grub/unicode.pf2
# 转换 TrueType 字体为 pf2 格式
$ grub-mkfont -s 24 -o dejavu-sans-24.pf2 /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf
# 参数说明:
# -s 24: 字号 24
# -o: 输出文件
# 最后一个参数:输入字体文件
# 创建不同大小的字体
$ for size in 12 14 16 18 20 24 32; do
grub-mkfont -s $size -o dejavu-sans-${size}.pf2 \
/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf
done
6.4.2 中文字体支持
# 中文字符需要包含 CJK 字形的字体
# 转换 Noto Sans CJK 字体
$ grub-mkfont -s 16 -o noto-cjk-16.pf2 \
/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc
# 或使用 WenQuanYi 字体
$ grub-mkfont -s 16 -o wqy-16.pf2 \
/usr/share/fonts/truetype/wqy/wqy-microhei.ttc
⚠️ 注意:CJK 字体文件通常较大(10MB+),转换后的 pf2 文件也很大,会拖慢 GRUB 启动。建议只在需要中文界面时使用,并使用较小的字号。
6.4.3 使用中文字体
# 在 /etc/default/grub 中设置
GRUB_FONT="/boot/grub/fonts/noto-cjk-16.pf2"
# 或在主题中引用
# theme.txt:
# item_font = "Noto Sans CJK 16"
# 重新生成配置
$ sudo update-grub
6.5 颜色方案
6.5.1 菜单颜色
# 在 /etc/default/grub 中
# 菜单项颜色(普通 / 高亮)
GRUB_COLOR_NORMAL="white/black"
GRUB_COLOR_HIGHLIGHT="black/light-gray"
# 格式:前景色/背景色
# 可用颜色:
# black, red, green, blue, cyan, magenta, brown, light-gray
# dark-gray, light-red, light-green, light-blue, light-cyan
# light-magenta, yellow, white
6.5.2 在主题中使用颜色
# theme.txt
+ boot_menu {
item_color = "#cccccc"
selected_item_color = "#ffffff"
selected_item_pixmap_style = "select_*.png"
}
6.6 分辨率设置
6.6.1 设置 GRUB 分辨率
# 在 /etc/default/grub 中
GRUB_GFXMODE=1920x1080
# 传递给内核的图形模式
GRUB_GFXPAYLOAD_LINUX=keep
6.6.2 在 grub.cfg 中设置
set gfxmode=1920x1080,1280x1024,auto
# 按顺序尝试,使用第一个可用的分辨率
6.6.3 查看可用分辨率
# 在 GRUB Shell 中(按 c 进入)
grub> videoinfo
# 可用模式列表:
# 0x000 1920 x 1080 x 32
# 0x001 1280 x 1024 x 32
# ...
6.6.4 分辨率选择建议
| 场景 | 推荐分辨率 |
|---|---|
| 现代显示器 | 1920×1080 |
| HiDPI/4K | 3840×2160 或 1920×1080(缩放) |
| 老旧显示器 | 1024×768 |
| 服务器(串口) | 不设置(使用文本模式) |
| 兼容性 | auto |
6.7 安装和使用主题
6.7.1 安装现成主题
# 1. 下载主题(以 grub2-theme-vimix 为例)
$ git clone https://github.com/Se7endaily/grub2-theme-vimix.git
# 2. 复制到主题目录
$ sudo cp -r grub2-theme-vimix/Vimix /boot/grub/themes/
# 3. 在 /etc/default/grub 中设置主题
$ sudo nano /etc/default/grub
GRUB_THEME="/boot/grub/themes/Vimix/theme.txt"
# 4. 重新生成配置
$ sudo update-grub
6.7.2 热门 GRUB 主题
| 主题名 | 风格 | 链接 |
|---|---|---|
| Vimix | Material Design 风格 | GitHub: Se7endaily/grub2-theme-vimix |
| Stylish | 简约现代 | GitHub: Se7endaily/grub2-theme-stylish |
| Fall | 秋日风格 | GNOME-Look |
| Chromium | 浏览器风格 | GNOME-Look |
| Fallout | 辐射游戏风格 | GNOME-Look |
| Starfield | 星空动态效果 | 通常内置于发行版 |
6.7.3 使用图片作为简单背景(无需主题)
# 最简单的方式:只设置背景图片
$ sudo cp my-background.png /boot/grub/background.png
$ sudo nano /etc/default/grub
GRUB_BACKGROUND="/boot/grub/background.png"
$ sudo update-grub
6.8 自制主题
6.8.1 主题目录结构
$ mkdir -p /boot/grub/themes/mytheme/{boot_menu,progress_bar,icons,fonts}
6.8.2 创建基本主题
# 1. 准备背景图片
$ sudo cp background.png /boot/grub/themes/mytheme/
# 2. 创建字体
$ sudo grub-mkfont -s 16 -o /boot/grub/themes/mytheme/fonts/dejavu-16.pf2 \
/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf
# 3. 创建主题配置文件
$ sudo nano /boot/grub/themes/mytheme/theme.txt
基本主题 theme.txt:
# 基本 GRUB 主题
# 背景
desktop-image: "background.png"
# 不显示标题
title-text: ""
# 终端字体
terminal-font: "DejaVu Sans Mono Regular 16"
# 引导菜单
+ boot_menu {
left = 20%
top = 30%
width = 60%
height = 55%
item_font = "DejaVu Sans Regular 16"
item_color = "#cccccc"
item_height = 32
item_padding = 6
item_spacing = 2
selected_item_font = "DejaVu Sans Bold 18"
selected_item_color = "#ffffff"
icon_width = 24
icon_height = 24
scrollbar = false
}
6.8.3 预览主题
GRUB 没有内置的主题预览功能。可以通过以下方式预览:
# 方法一:使用 QEMU 虚拟机测试
$ sudo apt install qemu-system-x86
$ qemu-img create -f qcow2 test-disk.img 10G
$ qemu-system-x86_64 -bios /usr/share/ovmf/OVMF.fd -hda test-disk.img
# 方法二:截图对比
# 在虚拟机中引导后截图
6.9 图标(Icons)
6.9.1 图标命名约定
GRUB 使用 --class 参数指定菜单项的图标类别:
# 对应的图标文件名格式:<class>.png
menuentry "Debian" --class debian --class gnu-linux --class gnu --class os {
# 图标查找顺序:debian.png → gnu-linux.png → gnu.png → os.png
}
6.9.2 标准图标
| 图标文件名 | 对应系统 |
|---|---|
gnu-linux.png | Linux |
gnu.png | GNU 系统 |
windows.png | Windows |
os.png | 通用操作系统 |
macos.png | macOS |
freebsd.png | FreeBSD |
ubuntu.png | Ubuntu |
debian.png | Debian |
fedora.png | Fedora |
arch.png | Arch Linux |
6.9.3 图标规格
推荐图标规格:
- 格式:PNG(支持透明度)
- 小图标:32×32 像素
- 中图标:48×48 像素
- 大图标:64×64 像素
- 保持所有图标尺寸一致
6.10 常见主题问题
问题 1:主题不生效
# 检查主题路径是否正确
$ head -5 /boot/grub/grub.cfg | grep theme
# set theme="/boot/grub/themes/mytheme/theme.txt"
# 检查文件是否存在
$ ls /boot/grub/themes/mytheme/theme.txt
# 检查 theme.txt 语法
$ cat /boot/grub/themes/mytheme/theme.txt
问题 2:背景图片不显示
# 检查图片格式(必须是 PNG 或 JPG)
$ file /boot/grub/themes/mytheme/background.png
# background.png: PNG image data, 1920 x 1080, 8-bit/color RGB
# 检查图片大小(过大会导致加载失败)
$ ls -lh /boot/grub/themes/mytheme/background.png
# 检查 GRUB 模块
# 确保 insmod png 或 insmod jpeg 在 grub.cfg 中
问题 3:分辨率不正确
# 检查设置的分辨率是否被显卡支持
# 在 GRUB Shell 中运行:
grub> videoinfo
# 使用 auto 或更保守的分辨率
GRUB_GFXMODE=1024x768
6.11 扩展阅读
上一章:第 5 章:自定义菜单项 | 下一章:第 7 章:加密与认证