📘 依據原著 Vladimir Testov (ROSA, 2013) 完整 31 頁專題改寫

GRUB2 主題製作與視覺排版深度指南

深入拆解 Linux 開機引導程式(GRUB2)的每一項參數、公式與圖形渲染行為。透過即時互動操作台,親手調校 9-Slice 九宮格切片、選單像素對齊、Parrots 角度單位與開機模擬器。

7 章
完整覆蓋全文件章節
9-Slice
九宮格動態縮放模擬
Pixel-Exact
開機選單高度零誤差公式
100%
純前端無依賴即開即玩
Chapter 01

入門準備與設定流程 (How to Begin)

了解 GRUB2 主題檔案結構、設定檔修改與開機引導程式更新機制。

當我們想要為 GRUB2 打造自訂主題時,必須建立標準目錄結構,並告訴系統主題組態檔案的絕對路徑。以下是完整的標準建立步驟:

💡
核心觀念: GRUB2 的主要主題設定檔通常命名為 theme.txt。GRUB2 在每次開機時都會重新解析此檔案,因此修改 theme.txt 內容無需重新執行更新指令即可在重開機時生效;但如果變更了 /etc/default/grub 中的主題路徑,則必須執行更新指令以重新產生 grub.cfg。

1. 建立主題目錄與設定檔

建議將新主題放置於 /boot/grub2/themes/(或某些發行版的 /boot/grub/themes/)目錄下:

Terminal (Bash)
# 建立主題目錄
sudo mkdir -p /boot/grub2/themes/my_theme/

# 建立核心主題檔案 theme.txt
sudo touch /boot/grub2/themes/my_theme/theme.txt

2. 修改 /etc/default/grub 設定檔

在 /etc/default/grub 檔案中指定 GRUB_THEME 變數為主題設定檔的完整路徑:

/etc/default/grub
# 指定 GRUB2 主題檔案之絕對路徑(注意:同一個參數不可重複出現多次)
GRUB_THEME="/boot/grub2/themes/my_theme/theme.txt"

3. 重新產生開機設定檔 (update-grub2)

變更 /etc/default/grub 後,必須重新產生引導組態 /boot/grub2/grub.cfg:

Terminal (Bash)
# 若系統具備 update-grub2 腳本(需 root 權限):
sudo update-grub2

# 若系統沒有 update-grub2,則執行標準指令:
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
Chapter 02 & 03

核心概念與九宮格切片原理 (Common Conceptions & 9-Slice)

掌握 GRUB2 支援之元件種類,以及關鍵的 9 區域切片(9-Slice / 9-Zones)伸縮機制。

GRUB2 預定義元素類型 (Types of Elements)

元件名稱 說明 特點與限制
root 最頂層容器(擴展自 Canvas) 全螢幕尺寸,用來設定背景、全域字型、標題及控制台裝飾。
boot_menu 開機作業系統選單 核心元件,具備選中高亮框、圖標、字型配色與自訂滾動條。
progress_bar 水平倒數進度條 支援單色填色與圖形切片模式,可顯示剩餘秒數權杖。
circular_progress 環形倒數計時指示器 以環狀排列刻度(Ticks)展示剩餘時間,支援自訂旋轉角度。
label 單行文字標籤 輸出文字,無自動換行機制,若長度超過寬度會自動拉長。
image 靜態圖片 輸出 PNG 圖片,預設尺寸為圖片原始大小,可設定拉伸。
vbox / hbox 垂直 / 水平排列容器 自動依序堆疊子元素,並將次軸尺寸統一重設為最大子元素尺寸。
canvas 相對座標自由畫布容器 子元素採相對座標,子元素以逆序(Reverse Order)繪製。

九宮格圖形切片(9-Slice Scaling)原理

在 GRUB2 中,所有具有邊框裝飾的元素(例如按鈕 button_*.png、選單框 menu_*.png、控制台外框 inbox_*.png)都採用 9 個區域(Zones) 拼接:

🛑 4 個轉角邊界
固定 1:1 像素
涵蓋 NW、NE、SW、SE 四個區域。永遠保持圖片原始長寬,絕對不縮放、不拉伸,以確保邊框轉角造型與圓角精確剛性呈現。
約束:W = Worig, H = Horig
↔️ 南北邊界
水平單向延展
涵蓋 North (N) 與 South (S)。寬度隨著容器水平伸展拉伸;高度則嚴格鎖定,必須與相鄰邊角切片之高度一致。
約束:HN = HNW = HNE
↕️ 東西邊界
垂直單向延展
涵蓋 West (W) 與 East (E)。高度隨著容器垂直伸展拉伸;寬度則嚴格鎖定,必須與相鄰邊角切片之寬度一致。
約束:WW = WNW = WSW
⤢ 中央核心
雙向平鋪拉伸
涵蓋 Center 核心區域。同時在水平與垂直雙向拉伸,填補扣除邊界後的所有剩餘空間,文字、選單項目與主內容均繪製於此。
寬高:自動填滿容器內部中心空間
⚠️
邊角與邊緣鄰接存在性與相等性約束(Crucial Adjacency Rule)
• 存在性相依:若裝飾切片中包含某個邊角區域(例如西北角 NW),則必須同時存在與其相連的兩側邊緣切片(即 N 與 W)!
• 尺寸嚴格相等:邊角的尺寸數值必須與相鄰邊界切片的對應厚度完全相等(即 NW 高度 = N 高度 且 NW 寬度 = W 寬度)。若有任何 1 像素誤差,GRUB2 渲染引擎在拼接邊界時將出現明顯錯位或黑邊破圖!
圖解 ①:存在性相依約束 (Existence Dependency) 強制聯動
NW 邊角起點 N (上邊界) 相依必要項 1 W (左) 相依項 2 Center 內部 存在性邏輯判定: ✓ 若有 NW 邊角: 必須提供 N + W ✕ 孤立單獨 NW: 缺少 N 或 W 邊界 ➔ GRUB2 語法拒絕
📌 白話解釋:邊角就像柱子,必須有水平橫樑(N)與垂直牆面(W)接合。單獨定義邊角而不提供相連邊緣切片會導致渲染引擎失去參考基準。
圖解 ②:尺寸嚴格相等性 (Strict Equality) 像素完全對齊
NW 24×24px N (高度一致) 寬×24px W 24px×高 H 相等 W 相等 拼接誤差實機對比: ✓ 齊平 0px 誤差:平滑拼接 ✕ 錯位 高度差 1px 即露黑底 鋸齒撕裂無法拼合
📌 白話解釋:若 NW 邊角厚度為 24px,則 N 的高度與 W 的寬度必須是嚴格 24px。多 1px 或少 1px,GRUB2 渲染引擎皆無法自適應平滑拼接,會產生難看的鋸齒階梯或黑縫。
🎁
標準切片素材包已就緒 (Sample Slices Pack)
包含選單裝飾圖、選中項目高亮圖、滑桿(3-Slice Thumb)與進度條切片。
📦 下載範例切片套件 (.zip)
🎮 互動操作台 01
九宮格 (9-Slice) 動態縮放視覺化實驗室
NW
N
NE
W
Center
E
SW
S
SE
分區類別 涵蓋切片 縮放行為 尺寸約束
四角區 NW NE SW SE 固定原始像素
絕對不拉伸、保證剛性圓角
W, H 固定
南北邊界 N S 水平單向延展
寬度隨容器伸展,厚度鎖定
H = HNW
東西邊界 W E 垂直單向延展
高度隨容器伸展,厚度鎖定
W = WNW
中央核心 Center 雙向平鋪延展
水平與垂直平鋪填滿剩餘空間
自動填滿
💡 即時連動提示:拖曳上方「容器寬度 / 高度 / 邊角」滑桿,左側方塊會即時顯示實時動態像素,驗證四角固定與邊界單向延展之運作特性。
🎮 互動操作台 09 純原生零依賴 Canvas 實作
線上自訂九宮格切片產生器 (Custom 9-Slice Canvas Studio)
即時自訂色彩、漸層、邊框、圓角與光暈,前端 HTML5 Canvas 即時精確裁切符合 GRUB2 規範的標準切片並一鍵打包為 ZIP。
🎨 快速套用風格預設:
📐 幾何與切片厚度
20px
決定 NW/NE/SW/SE 邊角長寬,以及 N/S/W/E 邊界的固定厚度。
10px
2px
🎨 色彩、漸層與透明度
#0a192f
#020c1b
#00f0ff
#00f0ff
85%
6px
視圖 ①:動態延展組裝效果 即時 9-Slice / 3-Slice 拼裝 320 × 140 px
Arch Linux (linux 6.10-arch1)
GRUB2 Custom Nine-Slice Live Assembler
視圖 ②:切片裁切解構矩陣 (9-Slice Matrix) 點擊單張即可直接下載 PNG
Chapter 04.1

根元素與全域設定 (Root Canvas & Global Options)

掌握 theme.txt 的頂層設定與最容易犯錯的語法分隔符號規則。

🚨
GRUB2 關鍵語法陷阱:全域選項 vs 組件屬性分隔符號對照表
官方渲染引擎對單詞連接與鍵值指派符號極度嚴格,兩者千萬不可混淆!
設定層級 單詞連接符號 鍵值指派符號 ✓ 正確標準語法 ✕ 常見致命錯誤 (報錯/無效)
全域選項 (Global)
如背景、標題、全域字型
- 減號 (Hyphen) : 冒號 (Colon) title-text: "GNU Grub"
desktop-image: "bg.png"
title_text = "GNU Grub"
⚠️ 引擎無視該行,背景/標題遺失
組件屬性 (Component)
如 boot_menu, progress_bar
_ 底線 (Underscore) = 等號 (Equals) item_height = 30
selected_item_color = "#fff"
item-height: 30
⚠️ 組件解析中斷,排版錯位破版
💡 超好記口訣:「外層全域橫槓接、冒號分」(title-text: ...);「內層組件底線接、等號分」(item_height = ...)。這是 90% 主題新手最容易踩中導致外觀失效的隱形陷阱!
全域選項名稱 預設與功能說明 渲染特性與重要限制
desktop-image 背景圖片路徑(如 "background.png") 自動拉伸填滿螢幕。若設定了此屬性,則 desktop-color 將被忽略。
desktop-color 單色背景色值(如 "#000000") 僅在未指定 desktop-image 時生效。
title-text 標題文字(如 "GNU GRUB") 永遠置中對齊。文字基線(Baseline)位置固定於 40 + ascent 像素處。設為 "" 可隱藏。
terminal-box 終端機控制台邊框切片(如 "inbox_*.png") 繪製於控制台矩形外側(OUTSIDE),並於內側中央預留 3px 的內縮邊距(padding)。
terminal-font 終端機文字字型 新增字型至主題目錄後,需執行 update-grub2。
Chapter 04.2

開機選單座標錨點與精密像素計算 (boot_menu Layout & Formula)

深入剖析九宮格座標錨點定位原理、INSIDE 繪製機制與選單總高度零跑版公式。

📐 選單精密高度計算公式 (boot_menu Height Formula)

在 GRUB2 中,boot_menu 是最關鍵的組件。然而許多主題作者常遇到「選單最後一項的高亮裝飾被截斷」或「滾動條底部與選中項目邊框無法齊平」的嚴重跑版問題。

原作者 Vladimir Testov 透過閱讀原始碼,推導出選單總高度(height)與可視項目數量($N \ge 3$)之間的唯一絕對正確精準公式:

📐 GRUB2 選單總高度精密公式 (Exact Total Height)
Height = 2 × item_padding + menu_pad_top + menu_pad_bottom + (N - 1) × (item_height + item_spacing) + pad_top + pad_bottom + item_height - 1
💡 公式總結:只要嚴格按照此公式設定選單高度 height,GRUB2 即可達到「選中項目邊框 0 像素裁切」且「右側垂直滾動條與底層項目 100% 齊平」的完美像素對齊效果!下方互動操作台 02 提供即時動態計算與失真對比演示。
💡
選中項目外掛裝飾框 (OUTSIDE) 與 -1px 扣減幾何原理圖解
公式核心:選中項目實際繪製高度 = item_height + pad_top + pad_bottom - 1
Ubuntu 24.04 LTS (選項本體) item_height = 34px pad_top (+10px) item_height (34px) pad_bottom - 1 (+9px) 總高 53px 裝飾框向四周向外擴展 (OUTSIDE),不壓迫條目文字與圖標 為什麼必須 - 1px? ✓ 扣減 1px (正確演算法) 裝飾外框底線 0px 誤差,剛好齊平內縮線! ✕ 若未扣減 1px (多 1px) 選單內縮邊界線 ⚠️ 凸出 1px 被選單下緣裁切! (或導致右側滾動條錯位)
1. 外掛渲染 (OUTSIDE Rendering) GRUB2 選中高亮邊框是在選項尺寸外側包裹展開,完全不壓縮選項內的圖標與文字排版空間。
2. 減 1 像素避免邊界重疊 底層渲染器在拼接底邊框時自動重疊 1px,若官方高度公式未扣減此 1px,選中框底緣將被外框無情裁切!
3. 滾動條完美齊平保證 嚴格扣減 1px 後,選單右側垂直滾動條的滑塊(Thumb)滾動到底部時,底端剛好與選中框線 100% 齊平。
🎮 互動操作台 02
選單像素精確高度計算器與失真模擬器
公式精算高度:289 px

選單其他重要參數規範

屬性名稱 預設值 行為細節與注意事項
icon_width / icon_height 32 / 32 即使沒有圖標,GRUB2 依然會強制預留 icon_width + item_icon_space 的縮排空白!若不需要圖標,必須將 icon_width = 0。
item_icon_space 4 圖標與文字之間的水平間距。
選單項目寬度自扣 2px 自動扣除 GRUB2 演算法中,項目繪製寬度會自動扣除 2px,使右側留出微小空間。
圖標 Class 匹配順序 階層匹配 優先比對更具體的系統標識:
windows > os
gnu-linux > gnu > os
發行版自身名稱(如 rosa)擁有最高優先權!
scrollbar_thumb 切片限制 僅限 3 區 絕對不要為滑塊使用 north/south/center 以外的切片(不可有四角與東西側)!外框 scrollbar_frame 則可以使用完整的 9 個切片。
Chapter 04.3

水平倒數進度條 (progress_bar)

單色填色模式、九宮格切片模式以及隱藏外框之星號技巧。

progress_bar 元件專門用來視覺化倒數剩餘時間。若要啟用倒數連動,必須將其 id 設定為特殊常數 __timeout__。

🎮 互動操作台 03
水平進度條雙模式與文字權杖展示
對應 theme.txt 語法
Chapter 04.4

環形倒數進度條 (circular_progress) 與 Parrots 鸚鵡角

揭密 GRUB2 獨創的 256 鸚鵡度量單位、起始角度與消失模式。

環形指示器透過在圓周圍繪製一圈刻度圖片(tick_bitmap)並環繞中心背景圖片(center_bitmap)來展示倒數。這其中有幾個極為特殊的渲染限制:

🦜 鸚鵡角度量
1 圓 = 256 parrots
GRUB2 內部不使用 360° 度數或弧度,而是將整圈圓周均分為 256 等份(1 parrot ≈ 1.40625°),並以 X 軸正向為 0 起算。
0° (正東)0
90° (正南)64
180° (正西)128
-90° (正北)-64
⚖️ 刻度軸對稱
建議 2ⁿ 次方
由於刻度圖案(tick_bitmap)不支援旋轉與縮放,且角度以整數 parrots 步進,建議將 num_ticks 設為 2 的次方(如 8 或 16),刻度才能精確坐落於整數點位,達成絕對軸對稱。
⚠️ 減 1 繪製特性
實際繪製少 1 個
渲染演算法中實際畫出的刻度永遠比應顯示刻度少 1(always decreased by 1)。
若啟用 ticks_disappear = "True",刻度將逐個消逝;若為預設,則隨時間遞增累積至缺 1 滿圓。
🎮 互動操作台 04
Parrots 鸚鵡角與環形刻度動態模擬器
Chapter 04.5

容器排版與逆序繪製 (vbox, hbox, canvas)

理解彈性排版容器行為,以及 Canvas 極具顛覆性的繪製順序機制。

⚡
畫布容器核心特性(逆序繪製,Reverse Order):
在 canvas(包含根畫布 root)中,子元素的繪製順序與一般的 HTML / CSS 恰恰相反!
如果在 theme.txt 中,元素 A 寫在元素 B 之前,則 GRUB2 會先畫 B,再畫 A(亦即 A 會覆蓋在 B 之上)!
🎮 互動操作台 05
容器行為與 Canvas 圖層疊加對比器
Chapter 05

通用繪製特性與座標容錯機制 (Common Features)

了解繪製邊界、無效數值修復公式與缺字自動回退(Fallback)。

1. 座標越界與數值自動修復演算法

當我們在 theme.txt 中設定的座標或尺寸超出父容器範圍時,GRUB2 引擎會依循以下防呆修復規則(令父容器寬高為 parent_width 與 parent_height):

⬅️ 1. 左側負座標歸零 水平左緣
若 left < 0 ➔ left = 0
避免元素超出容器左邊緣,負值直接校正為貼齊左側原點。
⬆️ 2. 上方負座標歸零 垂直頂部
若 top < 0 ➔ top = 0
避免元素超出容器上方邊界,負值直接校正為貼齊頂部原點。
➡️ 3. 右側超寬自動截斷 寬度重設
若 left + width > parent_w ➔ w = parent_w - left
自動縮減寬度,使元素右側邊緣剛好切齊父容器右邊界。
⬇️ 4. 下方超高自動截斷 高度重設
若 top + height > parent_h ➔ h = parent_h - top
自動縮減高度,使元素底側邊緣剛好切齊父容器底端邊界。

💡 實用技巧:這項特性可以善用在多螢幕解析度自適應上,讓右緣或底緣自動對齊父容器或螢幕邊界!

2. 字型符號回退替換機制 (Fallback)

若在 theme.txt 中指定的字型未找到,或該字型缺少某些特定字元(例如終端機邊框符號、特殊符號),GRUB2 會自動從主題目錄中存在的其他字型中挑選最適合的符號補上。 因此,若在螢幕上看到邊框變成問號(?)或虛線,即代表當前字型缺少該字元,需補充適當的字型檔。

Chapter 06

字型轉換指南 (Font Creation with grub2-mkfont)

將 TTF / OTF 轉換為 GRUB2 專用 .pf2 格式,調整基線與 Ascent / Descent。

GRUB2 無法直接讀取標準 TrueType 字型,必須透過官方工具 grub2-mkfont 轉為專屬的點陣字型格式 .pf2。 GRUB2 不支援字距微調(Kerning)。

🎮 互動操作台 06
grub2-mkfont 指令產生器與字型度量圖解
支援本地 TTF/OTF 拖曳即時量測
📁
拖曳 .ttf / .otf 字型檔至此,或點擊瀏覽本地檔案
利用瀏覽器原生 FontFace API 即時在記憶體中載入,純本機無上傳・即時提取幾何度量與點陣模擬
✓ 已載入自訂字型: CustomFont.ttf (1.2 MB)
模擬模式:
字型垂直度量結構圖 (Font Metrics Baseline Diagram)
▲ Ascent (上伸部): 14px GRUB 2.0 開機選單
── 基線 (Baseline) ──
▼ Descent (下延部): 4px
當前字型:系統預設 DejaVuSans (標準無微調排版) 行高總和 (Total Line Height): 18px
產生之 grub2-mkfont 終端機指令
Chapter 07

外部關鍵設定與環境變數 (Outside theme.txt)

掌握 /etc/default/grub 核心控制參數與語言環境設定。

參數名稱 設定檔案 作用與注意事項
GRUB_THEME /etc/default/grub 指定 theme.txt 之絕對路徑。必須確保同個檔案中無重複定義。
GRUB_BACKGROUND /etc/default/grub 控制台終端機的背景圖片路徑。該圖片必須為不透明格式(若有透明度將無法正常顯示)。
LANG 與 LANGUAGE /etc/default/grub 若需變更開機引導程式之語言,這兩個參數必須同時設定為完全相同的值!例如:LANG="zh_TW.UTF-8" 與 LANGUAGE="zh_TW.UTF-8"。
Chapter 08

theme.txt 智慧語法校驗與錯誤診斷 (Syntax Linter & Validator)

即時靜態語法解析,精確揪出全域/組件符號顛倒、高度公式違背、括號缺失與切片約束衝突。

GRUB2 開機引導程式的設定檔解析器極度嚴苛。只要一個全域選項誤用了等號 =,或選單高度未依據官方精確公式計算,就可能導致開機畫面直接黑屏、破圖或退回文字救援模式。

本校驗器在瀏覽器前端進行深度靜態語法健檢,支援即時分析錯誤行號、違規原因並提供精準的綠色修復代碼建議。

🎮 互動操作台 08
theme.txt 智慧靜態語法診斷台
純前端零上傳・即時規則庫靜態審查
快速載入測試情境:
總行數:0 行
Master Playground

GRUB2 完整開機模擬器與 theme.txt 產生器

整合全篇知識的實體開機螢幕!支援鍵盤 ↑ / ↓ 方向鍵操作切換、倒數計時連動與一鍵產生代碼。

GNU GRUB Version 2.00 16:9 FHD
📦 放開滑鼠以載入 GRUB2 主題 ZIP 或底圖 支援主題 .zip 壓縮包(純原生解析)或 PNG/JPG/WebP 影像
100% 縮放 (1920×1080)
⋮⋮ GNU GRUB Bootloader 2.0
⋮⋮
🐧
Ubuntu 24.04 LTS (GNU/Linux)
🍃
Linux Mint 22 (Victoria)
🪟
Windows Boot Manager (on /dev/nvme0n1p1)
⚙️
UEFI Firmware Settings
🛠️
Memory Diagnostic (Memtest86+)
⋮⋮
The highlighted entry will be executed automatically in 10s.
📦 下載範例切片套件 (.zip)
標準 theme.txt 設定檔預覽
# 點擊上方「一鍵產生標準 theme.txt」以查看由本系統產生的規範化設定檔...