环境以Ubuntu 22.04为实验环境,其他版本比如fedora系列的可能会有所出入
要修改grub,请注意以下几个重要档案:
#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#
说明了这是由/etc/grub.d与/etc/default/grub所生成的,不要自己编辑。这个档案还是只读属性,就是要避免你直接去编辑。如果修改了这个档案,只要更新grub,之前的修改就会被覆盖掉。
2. /etc/default/grub
该文件是用来配置grub的主要文件,在/usr/share/grub/default/里还有一份,复制回来即可。
3. /etc/grub.d
此目录中的配置文件会在sudo update-grub时,合并到/boot/grub/grub.cfg中。注意这些配置文件的名称结构,前面都有数字。数字越小的,在合并时放在越前面。
配置文件详解: /etc/default/grub
# 设定默认启动项,推荐使用数字
GRUB_DEFAULT=0
# 注释掉下面这行将会显示引导菜单
#GRUB_HIDDEN_TIMEOUT=0
# 黑屏,并且不显示GRUB_HIDDEN_TIMEOUT过程中的倒计时
GRUB_HIDDEN_TIMEOUT_QUIET=true
# 设定超时时间,默认为10秒
# 设定为-1取消倒计时
GRUB_TIMEOUT=10
# 获得发行版名称(比如Ubuntu, Debian)
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
# 将会导入到每个启动项(包括recovery mode启动项)的'linux'命令行
GRUB_CMDLINE_LINUX=""
# 同上,但是只会添加到 normal mode 的启动项
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
# 取消注释以允许图形终端(只适合grub-pc)
#GRUB_TERMINAL=console
# 分辨率设定,否则采用默认值
#GRUB_GFXMODE=640x480
# 取消注释以阻止GRUB将传递参数 "root=UUID=xxx" 传递给 Linux
#GRUB_DISABLE_LINUX_UUID=true
# 取消启动菜单中的“Recovery Mode”选项
#GRUB_DISABLE_LINUX_RECOVERY="true"
# 当GRUB菜单出现时发出鸣音提醒
#GRUB_INIT_TUNE="480 440 1"
其他参数,可以参考Ubuntu官方文档:https://help.ubuntu.com/community/Grub2/Setup
以下介绍/etc/grub.d目录下的档案。这些档案内都有很清楚的注解,但都是英文的,不过不需要很强的英文能力。难的是你必须要有撰写修改scripts的能力。基本上,这些档案大多都不需要去修改。
既然不怎麼需要作修改,那知道这个目录有什麼用?就像最早简介中所述:更改数字,可以改变顺序,小的在前面,大的在后面;更改x属性,可以决定要不要在选单中出现。
如,你想要windows系统出现在前面,你可以把os-prober的数字改成07,他就会出现在现有的linux前面。如,你不想要出现memtest86+,就把x属性拿掉。
再一个更复杂的状况,除了现有的ubuntu外,你还有fedora与windows7在其他分割区,而你希望出现的顺序为windows7, fedora, ubuntu,你可以把os-prober的数字改成07,并且把里面关於windows的scripts放在前面。
所有对于/etc/default/grub与/etc/grub.d的更改,必须以下列的指令来生效
sudo update-grub
这个指令会重新做出/boot/grub/grub.cfg,下次开机时,就会呈现出新的选单。
这通常是所有人首先会遇到的一个问题,在哪里设置?有很多方法来查找 GRUB 设置。每个人都可能有自己的方法,但我发现 update-grub 是最简单的。如果在 VMWare 或 VirtualBox 中执行 update-grub,你将看到如下所示的内容:
ubuntu@ubuntu-vm:~$ sudo update-grub
Sourcing file `/etc/default/grub'
Sourcing file `/etc/default/grub.d/init-select.cfg'
Generating grub configuration file ...
Found background: /usr/share/backgrounds/grub_bcakground.jpg
Found background image: /usr/share/backgrounds/grub_bcakground.jpg
Found linux image: /boot/vmlinuz-5.15.0-46-generic
Found initrd image: /boot/initrd.img-5.15.0-46-generic
Found linux image: /boot/vmlinuz-5.4.0-42-generic
Found initrd image: /boot/initrd.img-5.4.0-42-generic
Adding boot menu entry for UEFI Firmware Settings
done
我们可以看到下面这句,默认系统是没有背景的,只有设置了才会出现
Found background image: /usr/share/backgrounds/grub_bcakground.jpg
GRUB 启动图像搜索顺序
在 grub2 中,对基于 Debian 的系统来说,它将按照以下顺序搜索启动背景:
现在将此信息留在这里,我们会尽快重新检查它。
GRUB 背景图像属性
可以使用 PNG, JPG/JPEG 以及 TGA 类型的图像文件作为 GRUB 2 的背景。必须符合以下规范:
如果图像格式不符合,那么是无法生效的
方式 1:替换图像
现在我们只需简单的用新文件将 /usr/share/images/desktop-base/grub_background.png 替换掉。值得注意这是最简单的方法,不需要修改 grub-config 文件。 如果你对 GRUB 很熟,建议你简单的修改 GRUB 的默认配置文件,然后执行 update-grub。
方式 2:在 GRUB_BACKGROUND 中定义图像路径
所以你可以根据上述的查找优先级使用上述任一项,将 GRUB 背景图像改为自己的。以下是我自己系统上 /etc/default/grub 的内容。
ubuntu@ubuntu-vm:~$ sudo vim /etc/default/grub
按照 GRUB_BACKGROUND=/usr/share/backgrounds/grub_bcakground.jpg的格式添加一行,其中 grub_bcakground.jpg 是你要作为 GRUB 背景的图像文件。
执行 update-grub ,现在重启机器,你会在 GRUB 看到自定义的图像。
方式 3:把图像文件放到 /boot/grub/ 文件夹
如果没有在 /etc/default/grub 文件中指定 GRUB_BACKGROUND 项,理论上 GRUB 应当使用在 /boot/grub/ 文件夹找到的第一个图像文件作为背景。如果 GRUB 在 /boot/grub/ 找到多个图像文件,它会按字母排序并使用第一个图像文件。
方式 4:在 grub_background.sh 指定图像路径
如果没有在 /etc/default/grub 文件中指定 GRUB_BACKGROUND 项,而且 /boot/grub/ 目录下没有图像文件,GRUB 将会开始在 /usr/share/desktop-base/grub_background.sh 文件中指定的图像路径中搜索。Kali Linux 是在这里指定的。每个 Linux 发行版都有自己的特色。
方式 5:在 /etc/grub.d/05_debian_theme 文件的 WALLPAPER 一行指定图像
这是 GRUB 搜寻背景图像的最后一个位置。如果在其他部分都没有找到,它将会在这里查找。
结论
这篇文章较长,但我想介绍一些基础但很重要的东西。如果你有仔细阅读,你会理解如何在 Kali Linux 上来回跟踪符号链接。当你需要在一些 Linux 系统上查找 GRUB 背景图像的位置时,你会感到得心应手。只要再多阅读一点来理解 GRUB 颜色的工作方式,你就是行家了。