说个实话,很多人除了装机时见过一眼自己的开机引导界面,之后几年里都不会再看第二次。麒麟系统的默认GRUB界面不算难看,经典的深色渐变背景配上简单菜单,信息清楚但跟“好看”没有半点关系。想把开机那几秒钟换成自己喜欢的图、公司品牌图或者一段极简纯色,是一件技术含量不高但细节极多的事,网上教程要么只给命令不给原因,要么针对Ubuntu的路径照抄到麒麟上直接失效。
这篇文章把我自己在麒麟系统上折腾GRUB背景图的完整过程写下来,包括图片该怎么准备、两种生效配置怎么选、双系统机器会遇到什么特殊情况,以及开机后没图时按什么顺序排查。内容适配不同基础的读者:完全没接触过引导加载器的能照着做,老手也能从里面捞几条省时间的经验。
1. GRUB在启动链里的位置:改的是开机画面不是桌面壁纸
1.1 从按下电源键到看到登录窗口,中间这几秒发生了什么
很多第一次改GRUB背景的人有个误区,以为开机画面是系统的一部分,改了桌面壁纸就等于改了开机画面。实际上这两个东西相隔天远地远。
按下电源键后,机器先做硬件自检,然后BIOS或UEFI找到启动设备,读入引导加载器。麒麟系统默认用的引导加载器就是GRUB(Grand Unified Bootloader的缩写),它在这个时间点接管屏幕,从文件系统里把内核镜像加载进内存,再跳转到内核,后续的事情才交给操作系统的启动流程。等到你看到麒麟桌面那应该是登录界面的时候,GRUB早就退出画面了。
所以GRUB背景图的本质,是引导加载器自己在图形模式下绘制的一张图。它不经过X11或者Wayland这套桌面图形栈,不读取你的桌面配置,也不走任何系统服务。所有跟这张图相关的设置,最终都要写进GRUB自己读取的菜单文件里,也就是/boot/grub/grub.cfg。
这个区别解释了为什么“桌面壁纸切得很顺,但开机背景怎么改都不对”——你改错了地方。桌面壁纸归桌面环境管理,开机背景归GRUB管理,两者的配置文件完全不互通。
1.2 默认界面为什么总是一副“程序员脸”
麒麟系统的默认GRUB界面正常情况下是深色渐变底、白色文字菜单,简洁但很朴素。GRUB默认不开图形输出的时候,甚至干脆是一块纯色背景加一堆字符,类似很久以前的DOS界面。设计成这样不是偷懒,而是引导加载器面临的工作环境比完整的操作系统恶劣得多,它必须在各种显卡驱动尚未加载的裸机环境下工作,只能依靠主板固件提供的帧缓冲(framebuffer)来输出图像。
这就是关键限制的来源:GRUB能够调用的图形模式依赖硬件固件给它的那几种分辨率。它不像桌面系统那样可以随便拉一个分辨率让显卡驱动去适配,针对特定显卡,GRUB可能只拿到一小撮选项,比如1366x768、1024x768、800x600。你准备了一张4K的图,GRUB未必有能力按4K输出。
明白这一层之后,很多“怎么我的图显示不对”的困惑就会自动解除:不是你步骤错了,是这个引导加载器的工作机制决定的。改GRUB背景图,本质上是在一个分辨率选项有限的裸机环境下,把一张符合规范的位图正确加载并绘制出来。
提示:修改GRUB配置并不会损坏硬盘数据,真正启动不了的时候,用系统安装U盘进入救援模式也能把配置改回来。但“能救回来”不等于“不用备份”,启动流程复杂时,犯错的代价是浪费几十分钟,而不是损失数据。所以刷配置前请先备份。
2. 先把图片做成GRUB能懂的样子:格式、色深与分辨率
2.1 为什么选PNG而不是JPG:格式背后是16位色深的现实
GRUB 2支持不少图像格式,包括PNG、JPEG、TGA。但实际做下来,我会毫不犹豫地选PNG。
原因是GRUB在图形模式下绘制图像时,受到帧缓冲色深的限制,输出效果远比不上你把图片放到桌面背景时看到的精细度。最直接的表现是大面积渐变区域会出现一道道肉眼可见的色带,原本平滑的夜空渐变,在开机画面上会变成一圈圈明显的色环。JPEG因为本身是有损压缩,会在暗部产生块状噪点,在GRUB的16位色深下这些噪点会被放大,看起来脏兮兮的。PNG虽然是无损压缩,在色深受限时仍然会有色带,但至少不会附加一层压缩噪点。
一句话总结:JPG的压缩痕迹在低色深环境里藏不住,PNG没这个问题。如果你的原始素材是JPG,第一步不是直接用,而是先转成PNG再做后续处理。
2.2 分辨率你说了不算,硬件视频模式说了算
图片的分辨率应该跟什么对齐?不是你的显示器分辨率,而是GRUB在你这台机器上实际可用的视频模式。这是最容易踩的坑。
查看可用视频模式的办法很简单。开机进入GRUB菜单界面后,按c键进入GRUB命令行,输入:
grub> videoinfo屏幕上会列出当前机器支持的视频模式。比如某台核显笔记本可能只给出1366x768、1024x768、800x600这几项。看到列表后,设置图片分辨率的最稳做法是选择其中最大的一个,通常是你的屏幕物理分辨率。
如果你不想每次重启都进GRUB命令去看,也可以直接在系统里查。很多发行版装好之后,/sys/class/drm/下面会反映出显卡支持的模式,但那个列表掺杂了内核驱动能力,跟GRUB实际拿到的固件模式不完全一致。实测下来,还是GRUB命令行里videoinfo的结果最准确。
图片分辨率本身限制在这几个方面:
- 过大的图片会让GRUB读取变慢,启动阶段加载大文件时,停顿感非常明显,得不偿失。
- 图片分辨率超过硬件能力时,GRUB可能忽略它并回退到纯文本模式。
- 分辨率不匹配时,图片会被裁剪或拉伸,构图直接毁掉。
我常用的安全策略是准备一张1920x1080的PNG。这个尺寸在大多数机器上都能找到对应模式,即使硬件只支持1366x768,GRUB也会按比例缩放显示。当然,缩放效果和它在桌面上的清晰度没法比。
2.3 转换命令与肉眼验收标准
拿到一张心仪的图,先用图像处理工具做转换。命令大致长这样:
convert input.jpg -resize 1920x1080! -colorspace sRGB -depth 8 -strip bg.png注意1920x1080后面的感叹号,表示强制缩放,忽略原图宽高比。如果你不想让构图变形,可以先去-resize填一个不带感叹号的尺寸,等比缩放后再-extent扩展画布。
转换之后对照下面几个标准验收:
- 画面中央区域不要放重要元素。GRUB菜单会叠加在这个位置,文字和图片元素容易互相干扰。
- 大面积纯色或者纹理简单的区域适合做菜单底色,最省心。
- 图片饱和度不要太高,GRUB的色深渲染会把高饱和颜色弄得刺眼且断层严重。
- 文件名不要用中文和空格。GRUB解析带空格的路径需要额外转义,纯英文加数字最省事。
关于色带问题,我的经验是图片里越接近纯黑纯白区域越容易出现断层。如果想减少色带,可以用图片处理软件做轻微的高斯模糊,把颜色过渡摊开,色带边界会柔和很多。
3. 两种生效路径:从配置变量到手写启动脚本
3.1 路径A:改GRUB_BACKGROUND变量(最快)
最传统的做法是修改/etc/default/grub文件,添加一个环境变量让GRUB的配置生成脚本知道背景图位置。具体操作:
先把图片复制到GRUB能读取的固定目录:
sudo cp bg.png /boot/grub/然后编辑/etc/default/grub,在里面加一行:
GRUB_BACKGROUND=/boot/grub/bg.png接着重新生成GRUB配置:
sudo update-grub这个命令会把/etc/default/grub、/etc/grub.d/目录下的脚本聚合,重新生成/boot/grub/grub.cfg。执行之后看一下输出,正常情况下会提示找到背景图,比如:
Found background image /boot/grub/bg.png然后重启就能看到效果。
但这里有个坑:不同发行版对GRUB_BACKGROUND变量的支持程度不一样。麒麟系统基于Debian系,配置生成脚本里有一套独立的主题检测逻辑,它会优先检查系统自带的桌面壁纸目录,而且对GRUB_BACKGROUND变量的处理方式在不同版本之间有过调整。我在一些机器上遇到过设置了变量但重启无效的情况,原因就是生成的配置里根本没有写入background_image命令。
提示:如果你走路径A重启后没看到图,不要反复重启验证,浪费生命。直接跳到3.3的验证步骤,看
grub.cfg里到底有没有写入背景指令。
3.2 路径B:自定义启动脚本(最稳)
稳定压倒一切的时候,我推荐路径B:自己在/etc/grub.d/下写一个专属脚本。这个目录下的所有可执行文件,都会在运行update-grub时被依次执行,最终结果拼装进grub.cfg。自己写脚本,等于自己控制GRUB启动时的完整绘制逻辑,绕开系统对GRUB_BACKGROUND的各版本差异。
创建一个文件/etc/grub.d/10_custom_background:
sudo nano /etc/grub.d/10_custom_background内容如下:
#!/bin/sh cat << EOF insmod all_video insmod gfxterm insmod png set gfxmode=auto terminal_output gfxterm if background_image /boot/grub/bg.png; then set color_normal=white/black set color_highlight=yellow/black set menu_color_normal=white/black set menu_color_highlight=yellow/black else set color_normal=white/black set color_highlight=cyan/blue set menu_color_normal=cyan/blue set menu_color_highlight=white/blue fi EOF保存后给脚本加上可执行权限:
sudo chmod +x /etc/grub.d/10_custom_background再跑一遍:
sudo update-grub这个脚本的核心是background_image命令。它的执行结果会被if分支捕获,图片加载成功时用自定义文字配色,加载失败时回退到默认蓝色配色,避免出现“图片没加载成功还把文字颜色搞乱”的双重意外。
解释一下脚本各段的作用:insmod是加载GRUB模块,由于我们不知道目标机器到底是核显还是独显,all_video会把可能用到的显卡驱动模块都加载一遍,代价极小但兼容性极好。gfxmode=auto让GRUB自己选一个合适的图形模式。terminal_output gfxterm是把输出从纯文本切换成图形模式,这一步没有执行的话,后面加载背景图没有意义。
3.3 验证与回退
无论走哪条路径,都别直接重启,先在系统里检查生成结果:
sudo grep -n "background_image" /boot/grub/grub.cfg能看到一行类似:
if background_image /boot/grub/bg.png; then说明背景指令已经写进启动配置了。如果没有这一行,说明路径A在你这台机器上没生效,老老实实换路径B。
重启后如果效果不对,回退方法也很简单。路径A就把/etc/default/grub里的GRUB_BACKGROUND那一行删掉,路径B就把10_custom_background这个脚本删掉或改后缀名,然后重新执行:
sudo update-grub或者在开机进GRUB菜单时按c进入命令行,直接手动执行:
grub> background_image /boot/grub/bg.png这个测试非常直观,图片能不能加载、当前模式支不支持,一眼就知道。如果手动执行都失败,说明问题出在图片或硬件模式上,不是配置路径的锅。
4. 双系统与其他“意外环境”里的特殊处理
4.1 多系统菜单:图片有了一堆选项,排版问题反而更突出
装双系统的人不在少数,麒麟配上Windows,开机时GRUB会把两个系统都列在菜单里。这种情况下背景图能不能显示,跟原理没有冲突,但排版和视觉效果有新的讲究。
首先是菜单条目变多。如果电脑还带厂商恢复分区,Windows恢复环境也可能被GRUB识别成一个独立启动项,菜单项可能多达三四个甚至更多。一张精心设计的背景图,中央区域原本预留了给一行两行菜单的空间,结果菜单多出来一截遮住图片主体部分,观感立刻打折扣。
其次是Windows引导项的文字格式。GRUB默认给Windows Boot Manager生成的菜单项很长,如果图片本身带浅色文字或者高对比图案,白色的菜单文字和背景可能糊成一片。我的建议是把菜单条颜色固定下来,不要在背景图里强依赖颜色对比,比如脚本中把menu_color_highlight设为醒目的深蓝色加亮字,菜单在高亮与未选中状态之间拉开差距。
另外,如果你在Windows侧看到开机画面是正常的Windows logo,不要紧张。那是Windows引导器自己的工作结果,与GRUB背景图无关。只要在GRUB菜单选择Windows项之后,界面由Windows自己的引导流程接管。反过来,如果某次开机直接进了Windows没有经过GRUB菜单,那多半不是背景图的问题,而是启动顺序被BIOS/UEFI改了,或者另一个系统的引导项被厂商的恢复分区覆盖了,这种情况要去固件设置里检查启动项顺序。
4.2 老硬件与独显:帧缓冲模式少,背景图可能直接“隐身”
显卡驱动没有加载的GRUB阶段,所有画面都依赖主板固件提供的帧缓冲模式。核显机器一般还好,常见分辨率基本都在;一些老独显或者比较新的独显在特定固件版本下,可用视频模式可能非常有限,好一点的能给出1024x768,差的甚至只有800x600。
这种机器上强行用1920x1080的图会怎么样?GRUB会尝试加载图片但最终因为分辨率不匹配直接放弃,回到纯文本模式,你的自定义背景图就这么“隐身”了。排查时看到默认的纯文本界面,别急着怀疑脚本写错了,先检查视频模式。
这种情况下的解法有两个:一是把图片转成机器支持的分辨率,比如1024x768;二是在/etc/default/grub里设置GRUB_GFXMODE=1024x768,800x600,auto,让GRUB优先在列表里挑第一个能用的模式,同时也兼容后续的自动模式。
我接触过一些N卡和A卡混合交火的游戏本,videoinfo列出的模式五花八门,但实际显示输出经常不稳定。对这些机器,最稳妥的不是追求满分辨率背景,而是尽量让背景图低分辨率化。开机画面本来就是一闪而过的事,清晰度损失的观感代价,远小于重启后没有背景图的失落感。
5. 开机没图的排查链路
5.1 先问两句:图片有没有加载,文本模式是否已经接管
遇到“开机没图”的情况,我习惯先按一套固定顺序排查,不瞎猜。
第一个要区分的是现象:开机后是“完全没有图形界面,看到满屏字符菜单”,还是“有图形界面但没有背景图,只显示纯色底”。前者是GRUB根本没有进入图形模式,后者是图形模式正常但图片加载失败。两种现象的问题根源完全不同。
如果是满屏字符菜单,说明gfxterm图形模块没生效或者帧缓冲模式不支持。检查点按顺序来:
grub> videoinfo看是否有可用的图形模式。如果列表是空的,说明当前固件没有提供帧缓冲支持,背景图这条路走不通,只能放弃图形化。如果列表正常,就在GRUB命令行依次手动执行:
grub> insmod all_video grub> insmod gfxterm grub> terminal_output gfxterm grub> background_image /boot/grub/bg.png执行到background_image时可以看它返回什么。GRUB命令执行失败不会弹窗提示,但background_image失败后后续配色逻辑会走else分支,界面表现就是没有图。手动执行能确认到底是模块问题还是图片问题。
5.2 找到“抢戏”的主题文件:背景图不是越多越好
另一种很隐蔽的情况是:背景图在grub.cfg里确实存在,生成的配置也正确,但开机的画面里依然没有它。这种情况八成是主题(theme)文件抢了背景的绘制权。
GRUB的主题机制和简单的background_image是两个层级。主题文件通过set theme=指令加载,主题内部会定义自己的背景图、字体、菜单框样式。一旦主题被启用,它内部指定的背景优先级高于外部background_image设置,你后写的背景命令要么被覆盖,要么被后续绘制的主题背景盖住。
检查方法:
grep -n "theme" /boot/grub/grub.cfg如果看到set theme=这样的行,说明当前使用了主题。麒麟系统在部分版本会默认带一套品牌主题,主题里可能有自己的背景图。这时候有两条路:一条是把主题文件里背景图换成你的图,另一条是把主题禁用,回到纯background_image方案。
我个人偏向后者,因为主题的自定义项太多,一次改动牵扯字体、菜单框、选择器等多种资源,排查面太大了。禁用主题只需要注释掉/etc/default/grub里的GRUB_THEME变量,或者把/etc/grub.d/里相关脚本的可执行权限去掉,然后重新update-grub。
5.3 别忘了检查“看起来像没成功,其实是成功了”
这类最容易被误判:背景图加载成功了,但图片本身的配色和菜单文字叠在一起,观感跟默认界面差不了太多。比如你选了一张深蓝色大背景图片,GRUB菜单又是蓝底白字,两者的边界感极弱,很多人以为自己没改成功。
我的验证技巧是:把背景图里故意放一个非常规颜色的小色块在角落,重启后如果能看到这个色块,说明背景图完全正常,剩下的只是视觉设计取舍。这个办法成本极低,却能直接排除配置问题,省下大量排查时间。
6. 从一张背景图到GRUB主题:进阶但不过度
6.1 主题与背景的层级关系
单张背景图是最原始的定制方式,它能实现的开机效果也就停留在“换了一张壁纸”。如果你想要字体、菜单框、启动时的倒计时位置都变得协调,绕不开GRUB主题。
主题本质上是一个目录,里面放着theme.txt描述文件、背景图、字体文件,再用set theme=指向这个目录。GRUB启动后会读取描述文件里的规则,把背景、菜单、进度条全部按规则绘制。相比单张背景图,主题把所有视觉元素的管理集中在一个配置文件里,可维护性高得多。
在主题文件里声明背景图的关键字段很简单:
desktop-image: "/boot/grub/themes/custom/background.png"但这只是冰山一角。一个完整主题还会包括title-text:(标题文字)、item的字体颜色、highlight的选择框样式等。想快速上手,一个成本最低的做法是找一份现成的开源GRUB主题模板,把它的图片路径替换成自己的背景图,先跑通再逐步改细节。
6.2 自制主题的骨架与颜色变量踩坑记录
自制一个最简单主题只需要几个文件:主题目录、theme.txt、PNG背景图。theme.txt的骨架大致如下:
desktop-image: "bg.png" title-text: "" terminal-font: "DejaVu Sans Mono Regular 16" terminal-box: "terminal_box_*.png" + boot_menu { top = 60% left = 50% width = 40% item_font = "DejaVu Sans 16" item_color = "#dddddd" selected_item_color = "#000000" selected_item_pixmap_style = "select_*.png" }这部分看起来不长,但坑都在细节:item_font指定的字体名称和实际安装的GRUB字体名称必须严格一致,写错一个字字体就消失;selected_item_pixmap_style如果指向不存在的文件,菜单选择框会直接空白;相对路径都以主题目录为基准,不要把背景图放出去再写相对路径。
做过一轮之后我的体会是:主题定制适合已经通过背景图走通整个流程、还想继续折腾的人。追求快速出效果的话,单张背景图加自定义菜单颜色已经能覆盖绝大多数需求,主题更像锦上添花,而不是必选项。
我自己用下来最稳定的一套组合是:PNG格式、分辨率贴着硬件能力走、通过/etc/grub.d/脚本注入背景、同时在if else分支里把菜单颜色兜底写好。这套配置迁移到不同机器上,从核显笔记本到老独显台式机都表现得很好。如果你也想把开机画面从“能用”变成“顺眼”,照着这个链路走一遍,大概率能少走不少弯路。