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

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×14402K
3840×21604K
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/4K3840×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 主题

主题名风格链接
VimixMaterial 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.pngLinux
gnu.pngGNU 系统
windows.pngWindows
os.png通用操作系统
macos.pngmacOS
freebsd.pngFreeBSD
ubuntu.pngUbuntu
debian.pngDebian
fedora.pngFedora
arch.pngArch 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 章:加密与认证