Ventoy启动主题定制:从grub2配置到多镜像菜单优化
发布时间:2026/11/2 19:33:49 锦皓数字建站

1. 先想清楚启动主题到底在改什么一个 Ventoy 启动主题本质上不是给某个操作系统做美化而是给启动菜单那一层壳做视觉与交互的重定义。你插上U盘主板自检结束屏幕上出现的第一个“像样”的界面就是它。它背后跑的是 grub2 的图形菜单Ventoy 在这个基础上做了一层封装和插件机制把可定制的部分暴露出来让你用一份 theme.txt 加上几张图、几个字体文件就能把那个灰底白字、目录树挤成一团的默认界面换掉。我做过一版给内部运维团队用的启动盘里面塞了二十多个镜像覆盖安装、维护、诊断、离线刷写几种用途。默认界面下找一个特定版本的系统安装镜像要在树形菜单里翻好几层而且所有条目长得一模一样。换成自定义启动主题之后我给不同类型的镜像配了不同的图标和分组配色菜单项一屏能放下找东西的时间从“翻找”变成“扫一眼”。这就是主题定制真正的价值所在它不只是好看它是信息密度和识别效率的问题。但这里要先泼一盆冷水。启动主题的定制边界比你想的窄。grub2 的主题系统是一个相当老派的、基于固定字段的文本配置它能控制的东西无非是背景图和背景色、菜单项的字体颜色与选中样式、九宫格切片图、图标、进度条、标签文字、滚动条。你不能在菜单里放动画不能做响应式布局不能调用外部脚本渲染也不支持透明模糊之类的现代视觉效果。所有花哨的东西最终都要靠一张静态图加几个颜色值来“演”出来。所以动手之前我建议先把预期对齐能改背景、配色、字体、字号、行高、菜单位置与尺寸、选中框样式、图标、倒计时进度条、角落文字。不能改菜单的排序逻辑、镜像的扫描规则、启动流程本身。这些属于 Ventoy 层面的功能配置在 ventoy.json 的 control 插件里和主题是两套东西。要小心分辨率、字体编码、PNG 格式。这三样是启动主题翻车率最高的地方后面会逐个拆。顺带说一句启动主题和“启动盘功能”是解耦的。主题写坏了最坏情况是菜单不显示或者显示成默认样式镜像本身还能引导。这个安全边界很重要因为它意味着你可以放心大胆地试。真要彻底救不回来把 theme 相关目录删掉就行Ventoy 会回落到内置界面。1.1 为什么不用现成主题非要自己写网上能找到不少打包好的启动主题下载解压丢进去就能用。如果你只是想换个观感这确实是最省事的路。但我经手的场景里现成主题几乎都要改原因很实在第一分辨率对不上。很多主题是照着 1024x768 做的铺到 1920x1080 的屏上要么留黑边要么被拉伸变形。分辨率这个东西不是“跟着显示器自动适配”那么智能主题里的坐标和图片尺寸是硬编码的改分辨率等于重做一遍。第二字体扛不住中文。绝大多数现成主题用的是 grub 自带的 Unifont这个字体确实带中文字形但显示效果是等宽点阵感字重单一稍微大一点就糊。而换成自己找的思源黑体、更纱黑体又会撞上 pf2 格式转换和字库体积的坑。第三菜单结构不匹配。你自己的盘里放什么镜像、分几级目录、用不用树形视图别人不知道。主题的行高、每屏条目数、图标尺寸都得按你实际的内容量来调。所以我的一般做法是拿一个现成主题当“骨架”主要借它的 pixmap 切片图和目录结构然后 theme.txt 从头写。这样比纯手工画图快又比直接套用可控。1.2 一次改动涉及的文件清单正式动手前先把要碰的东西列清楚避免东改一处西改一处最后自己都记不住文件/目录作用改动频率theme.txt主题主配置所有组件都在这里声明高background.png桌面背景图中select_*.png菜单选中项的九宫格切片低icons/ 目录菜单项图标按名字匹配中fonts/ 目录pf2 字体文件低ventoy.json告诉 Ventoy 用哪个主题、什么分辨率高仅首次看起来不多但每一项背后都有一堆细节。下面按“结构—素材—配置—排错”的顺序一层层往下拆。2. 主题目录结构与核心文件逐层拆解2.1 一份最小可用的目录骨架先说结论一个能跑起来的最小主题只需要两个文件——theme.txt 和一张背景图。其他全是可选项。我在给同事做模板的时候就是从这个两文件版本开始的先确认“能显示”再逐步往里加东西。这个顺序很重要一次性把所有素材堆进去出问题时你根本不知道是哪一项导致的。目录结构我习惯这样组织放在U盘数据分区的固定路径下/ventoy/theme/ ├── theme.txt ├── background.png ├── select_c.png ├── select_n.png ├── select_s.png ├── select_e.png ├── select_w.png ├── select_nw.png ├── select_ne.png ├── select_sw.png ├── select_se.png ├── icons/ │ ├── windows.png │ ├── linux.png │ └── tool.png └── fonts/ └── cn.pf2路径不是随便定的它必须和 ventoy.json 里的配置对得上。我见过最常见的“主题不生效”就是文件放在了/theme/配置里写的是/ventoy/theme/差一层目录找半天。theme.txt 的文本编码必须是 UTF-8而且不建议带 BOM。某些编辑器保存时会偷偷加 BOM导致第一行解析失败症状是背景显示正常但菜单样式全丢。这个坑我踩过一次排查了快一个小时最后用十六进制查看才发现在文件头多了三个字节。2.2 theme.txt 的组件模型grub2 的 theme.txt 用的是“全局属性 组件块”的结构。全局属性控制桌面、终端框、标题文字这些组件块用 组件名 { ... }的形式声明每个组件有自己的位置、尺寸、颜色、字体。一个结构完整但不臃肿的骨架大致长这样desktop-image: background.png desktop-color: #0d1117 title-text: terminal-box: terminal_box_*.png terminal-font: Unifont Regular 16 boot_menu { left 8% top 22% width 84% height 58% item_font Unifont Regular 16 item_color #c9d1d9 selected_item_color #ffffff item_height 40 item_padding 6 item_spacing 4 icon_width 28 icon_height 28 icon_text_spacing 12 selected_item_pixmap_style select_*.png } progress_bar { id __timeout__ left 8% top 86% width 84% height 18 show_text true font Unifont Regular 16 text_color #8b949e bar_style progress_bar_*.png highlight_style progress_highlight_*.png } label { top 6% left 0 width 100% align center color #e6edf3 font Unifont Regular 16 text 启动菜单 } scrollbar { left 92% top 22% width 8 height 58% thumb_style scrollbar_thumb_*.png }几个字段值得单独说。top和left支持百分比和像素两种写法。百分比是相对整个屏幕的像素是绝对的。我强烈建议菜单区域一律用百分比这样换分辨率时不用整体重算虽然还是会有些偏差但至少不会整块菜单跑到屏幕外面去。item_height是整行的高度包括文字和上下留白。它和字体大小不是一回事。我一开始以为只要把字体调大行高自动跟着变结果文字直接上下被裁切。正确的关系是item_height至少要等于字号乘以 1.4再加上item_padding的额外空间。比如 16 号字行高给 40 是比较舒服的字与行之间有呼吸感。selected_item_pixmap_style指向九宫格切片如果不配选中项就只是一个色块或者干脆没变化视觉反馈极弱。这个字段是启动主题“看起来像成品”的关键。 label用来放标题或说明文字。我把标题放在顶部居中也见过有人放在左下角当水印。注意title-text那个全局属性在 Ventoy 里通常不起作用因为它对应的是 grub 菜单自身的标题栏实际显示还得靠 label 组件。2.3 九宫格切片为什么要把一张图切成九块这是整个主题体系里最反直觉的部分也是最容易让人放弃的地方。grub2 里选中框、滚动条、进度条这些需要跟随内容拉伸的图形用的是“九宫格切片”方案。你把它想象成一个按钮四个角保持原样不缩放四条边沿一个方向拉伸中间区域双向拉伸。这样无论按钮多宽多高边角的圆角和阴影都不会变形。文件名规则是固定的前缀你自己定后缀必须是这九个之一_c中心、_n、_s、_e、_w、_nw、_ne、_sw、_se。对应到配置里就写select_*.pnggrub 会自动去找这九个文件。实际做的时候我不建议你真去手工切图。有几个现成做法第一种找一张完整的选中框设计稿用脚本按固定边距切。边距一般取图片尺寸的 25%~30%太小的边角起不到圆角效果太大又浪费空间。第二种从现成主题里扒。现有主题的 select_*.png 直接拿来用改改色调就行。这是最省事的我就是这么起步的。第三种完全不切把九个文件都存成同一个 1x1 或 4x4 的小图得到一个纯色块。视觉上朴素但绝对不会错位适合先跑通流程再美化。注意九宫格切片的尺寸不一致是很常见的坑。如果_n和_c的高度对不上拼接处会出现一条缝或者重叠。九个文件必须严格来自同一张原图、同一套边距别东拼西凑。2.4 字体pf2 格式与中文显示这道坎grub2 不认 ttf、otf、woff只认 pf2Pango/FreeType 转出来的位图字体格式。这意味着任何好看的字体都得先转一遍。转换命令来自 grub 工具链grub-mkfont -s 20 -n CnFont 20 -o cn.pf2 SourceHanSansSC-Regular.ttf-s是字号-n是注册名-o是输出文件。这个注册名就是你在 theme.txt 里引用的名字必须完全一致包括大小写和空格。名字写错grub 找不到字体会静默回落到默认字体——不报错只是样式全变了非常容易误判成“配置没生效”。中文是这道坎里最硬的骨头。一套完整的中文字库转成 pf2体积轻松上到二三十兆。grub 在启动时要把它整个读进内存再渲染菜单出现会明显变慢低配机器上甚至能看到一两秒的黑屏。我的处理办法是做子集化把菜单里可能出现的字统计出来常用汉字加数字字母符号一般两三千个字符就够。用字体子集工具裁出这部分字形再转 pf2。体积能压到 1MB 以内加载几乎无感。如果懒得统计直接取 GB2312 一级字库3755 个常用字也够覆盖绝大多数场景转出来大概两三兆可以接受。另外一个折中方案主菜单文字用英文或数字编号中文说明放在背景图里做成静态文字。这样字体文件只需要英文字符集体积可以忽略不计。我在给一台老机器做启动盘时就是这么干的因为那台机器加载大字体真的会卡。3. 从零做一套主题的实操流程3.1 先定分辨率再定版式分辨率是整个设计的地基必须第一个定。定错了后面所有素材都要重做。选取原则很简单取你手上所有目标机器的最大公约数。如果绝大多数是 1920x1080 的显示器就用 1920x1080如果还要兼顾一堆老旧的 1024x768 设备要么做两套主题切换要么保守选 1024x768 然后接受大屏上的黑边。我一般的计算方式是先列出使用场景的屏幕分辨率分布取占比最高的那一个再验证它是否被所有关键设备支持。1920x1080 是目前的稳妥选择几乎通吃2560x1440 虽然更好看但有一部分老主板在引导阶段的显卡驱动只支持到 1080p设了会直接黑屏。分辨率确定后版式按比例分配。以 1920x1080 为例我常用的分区顶部 0~15%标题或品牌区放一张 logo 和一行说明。中部 18%~80%菜单主体这是视觉重心要留足行高。底部 80%~92%倒计时进度条。底部 92%~100%版本号、日期之类的角标信息由 Ventoy 自己填。这个比例不是死的如果你的镜像条目特别多菜单区可以拉到 85%把角标挤掉。3.2 背景图好看是次要的能快速解码是主要的背景图的坑比想象中多。grub 对 PNG 的支持并不完整隔行扫描interlaced的 PNG 会加载失败某些带特殊色彩配置文件的 PNG 也可能出问题。稳妥做法是导出成普通的、非隔行的、24 位真彩色 PNG。我更看重的是解码速度。1920x1080 的图如果不压缩直接存文件可能有好几兆grub 在引导阶段要靠 CPU 软解菜单出现前会有可感知的停顿。我实测下来把背景控制在一张 200KB 到 400KB 之间停顿基本感觉不到超过 1MB 就开始明显了。压缩手段上我用无损压缩工具类似优化 PNG 结构的工具处理尽量不转成调色板模式。调色板 PNG 体积小得多但 grub 的兼容性我没完全测透不敢在关键场景用。为了几百 KB 去冒黑屏的风险不值。设计层面我有个习惯背景图整体压暗对比度降低。因为菜单文字是叠在上面的背景一旦花哨文字可读性立刻崩掉。我通常做一层半透明的深色蒙版覆盖全图只留一点纹理或渐变视觉上高级实际用起来也舒服。3.3 菜单行高与对齐的实测调整法行高这东西看配置文件是调不准的必须实机看。我的做法是先把item_height设成一个估算值比如字号 18 就设 42然后启动到菜单界面用肉眼判断三个问题——一是文字上下有没有被裁。如果字顶和字底贴得太紧加 4 到 6 像素。二是选中框和文字是不是居中对齐。选中框的高度等于item_height如果文字偏上说明文字的基线计算和框的行为不一致这时候调item_padding比调行高更有效。三是条目之间的间距。item_spacing控制相邻两行的间隔设成 0 会让整个菜单像一堵墙设太大又会让一屏装不下几项。我的经验值是行高的 10% 到 15%。还有一个细节容易被忽略图标和文字之间的间距由icon_text_spacing控制。这个值给小了图标会贴到文字上给大了文字整体右移视觉重心偏了。一般取图标宽度的 40% 左右比较协调。3.4 图标映射让每个镜像自动带上正确图标图标这件事机制其实很朴素grub 会给每个菜单项打上若干“类别标签”class主题目录里的图标文件按标签名匹配。比如一个 Linux 安装镜像被打了linux标签就会去找icons/linux.png。问题在于自动打标签的准确性有限。文件名里的关键字能命中一部分但名称起得不规范的镜像就匹配不上显示成默认图标。我的处理办法分两层。第一层是把图标文件的命名尽量覆盖常见类别——windows、linux、tool、diagnostic、install 这类通用词各来一个命中率高。第二层是对那些实在匹配不上的我在 ventoy.json 或者镜像同级的配置文件里显式指定虽然麻烦一点但结果确定。图标尺寸别贪大。icon_width和icon_height建议和字号相当或者略大一点。我见过有人设成 64x64结果行高被迫拉到 80 以上一屏只能显示六个条目翻页翻到崩溃。图标的作用是“辅助识别”不是“展示美术”。4. 部署与生效ventoy.json 的配置细节4.1 theme 插件字段逐个说主题做好之后得让 Ventoy 知道它的存在。这一步在 ventoy.json 里完成用的是 theme 这一段配置{ theme: { file: /ventoy/theme/theme.txt, gfxmode: 1920x1080, display_mode: GUI, ventoy_left: 4%, ventoy_top: 96%, ventoy_color: #6e7681, fonts: /ventoy/theme/fonts } }逐条解释一下我踩过的点。file是 theme.txt 的绝对路径相对U盘根目录必须以斜杠开头。写成相对路径或者少个斜杠直接不生效。gfxmode是引导阶段请求的显示模式。填分辨率字符串也可以填auto。填auto的后果是让固件自己挑挑出来的不一定是你设计的分辨率版式可能整体错位。所以我建议显式写死。display_mode有三个值GUI、CLI、serial。选 GUI 才是图形菜单CLI 是纯文本菜单serial 走串口输出。做主题的场景下基本只会用 GUI但如果你某台机器图形模式起不来切 CLI 是保底手段。ventoy_left和ventoy_top控制左下角那行版本信息的位置。默认位置在某些背景图上会压到内容我就把它挪到 96% 的位置贴着底部颜色调灰弱化成角标。ventoy_color就是那行版本信息的颜色。这个字段很不起眼但很多主题的违和感恰恰来自这里——背景是深色右下角一行亮绿色小字特别扎眼。fonts指定字体目录。这一项是让 theme.txt 里能直接按注册名引用字体文件的关键。目录路径写错字体就找不到。4.2 JSON 写坏了会怎样这一点必须强调ventoy.json 是严格的 JSON 格式多一个逗号、少一个引号、用了中文标点整个文件解析失败。失败后的表现不是报错而是所有插件配置全部被忽略包括主题、菜单模式、自动安装等等你改的东西一律不生效。我最初排查这类问题时吃过亏一直盯着 theme.txt 看最后才发现是 JSON 里一个中文逗号。后来养成了习惯改完 JSON 先用在线校验器或者本地工具过一遍再往U盘里放。还有个细节JSON 里不能写注释。我习惯在配置里标注释说明字段用途结果一保存就失效反复几次才长记性。现在改成在旁边放一个同名的说明文本文件。4.3 验证与回滚验证流程我固定成三步很少出岔子第一步改完文件后先做静态检查——JSON 语法、theme.txt 的编码、图片格式和文件名大小写。这一步能在电脑上完成不用重启。第二步用虚拟机做快速验证。把U盘挂给虚拟机从U盘引导几十秒就能看到菜单。比反复重启真机快得多。虚拟机里 GPU 模拟有限颜色可能略有偏差但布局和字体完全能验证。第三步真机验证。重点看三件事菜单是否完整显示、中文是否正常、倒计时进度条是否按预期走完。回滚方案也很简单把/ventoy/theme/整个目录改名或者把 ventoy.json 里 theme 那一段删掉重启就回到默认界面。我一般会保留一份theme.bak目录改新版之前先备份出问题两秒钟换回来。5. 常见问题与排查实录5.1 黑屏、乱码、不生效三大类故障这三类几乎覆盖了我遇到过的所有问题。黑屏或花屏八成是分辨率问题。gfxmode设了一个固件不支持的模式grub 切不过去直接黑。判断方法把 gfxmode 改成 1024x768 试试如果能出来就是分辨率超标。另一个可能是背景图格式不对把desktop-image那行注释掉换成纯色背景如果菜单出来了就是图的问题。文字乱码或者显示成方块基本等于字体里没有对应字形。要么注册名写错了导致回落到一个不含中文的字体要么字体本身就没做中文字库。验证方法把一行文字改成纯英文如果英文正常、中文乱那就是字体缺字形如果中英文都异常那是字体没加载上检查名字和 fonts 目录路径。完全没变化优先级从高到低排查JSON 语法是否正确、file路径是否指到 theme.txt、theme.txt 第一行是否有 BOM、文件是否放在了正确的分区。Ventoy 只认数据分区上的配置放错分区等于没放。5.2 排查速查表现象最可能的原因处理方式菜单完全不显示直接进默认界面JSON 语法错误或路径不对校验 JSON确认 file 路径以斜杠开头背景正常菜单样式全丢theme.txt 带 BOM 或字段拼写错存成无 BOM 的 UTF-8逐个核对字段名中文显示成方块字体不含中文字形或注册名不符换含中文的 pf2核对 -n 参数与引用名一致选中框错位、有缝隙九宫格切片尺寸不统一九张图从同一原图按同一边距重新切菜单出现前有明显停顿背景图或字体文件过大压缩背景字体做子集化图标全部不显示图标目录名或 icon_width 未设确认 icons 目录存在补上宽高字段一屏显示条目太少item_height 过大按字号 1.4 倍重算行高开机黑屏无任何输出gfxmode 超出设备支持范围降到 1024x768 验证后再调5.3 两条私藏经验第一条改一处看一次。主题配置是链式的一个字段错可能连带影响一片。我现在的流程是每次只改一个变量重启验证确认没问题再改下一个。虽然慢但总比一次改十个然后花两小时定位强。第二条先用极端值定位问题。怀疑某个组件的位置不对就把它的left设成 0、width设成 100%如果它能正常显示说明是坐标或尺寸的问题如果还是不显示说明是组件本身没被解析。这个技巧帮我省了大量时间。6. 进阶玩法与几个实用技巧6.1 多分辨率兼容的折中做法真正要兼顾多种屏幕硬做一套自适应是不现实的因为 grub 主题没有条件判断能力。可行的做法是准备两套目录主题 A 对应 1080p主题 B 对应 768p通过 ventoy.json 切换。切之前需要人工确认目标机器的屏幕麻烦但可靠。另一种更轻的思路只用百分比布局把背景图做成一整块纯色或极简渐变加居中文字这样即使分辨率有出入视觉上也不违和。代价是设计感会弱一些但对多设备场景是最稳的。6.2 用信息层级替代装饰我最后想分享的是一个理念上的转变。刚开始做主题时我花了很多时间在纹理、光效、圆角阴影上做完看着挺花哨实际用起来问题不少——背景太抢眼文字看不清图标太多太杂反而更难找东西。后来我把重心挪到信息层级上用颜色区分镜像类型安装类、维护类、诊断类各一个色系用图标区分系统平台在菜单顶部加一行极简的说明把当前选中的镜像名字、版本、大小显示出来。视觉上朴素了很多但找人测试时平均选型时间反而下降了。启动主题终究是为“在几秒钟内做出正确选择”服务的。它的天花板不在美工水平而在对使用者注意力的理解。这一点想明白了剩下的都是配置文件的体力活。如果你也想动手我的建议是从“把背景换个颜色、把选中框换个样式”开始跑通一次完整链路再加字体、加图标、调布局。一步一步来比一次性追求完美成品靠谱得多。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。