愚者暗于成事,智者见于未萌。 民不可与虑始,而可与乐成。
由于 fedora 自带的 grub 主题太丑了,就在网上下载了一个 grub2 主题 。
按照文档里的命令安装:
sudo ./install.sh -t tela -s 1080p
重启之后,除了多余的内核,出现了重复的菜单条目(menuentry)外, fedora 的正常显示, debian 的图标显示错了,匹配到了 gnu-linux 的图标。
看 install.sh 的里边的代码,没有找到有关图标的配置。查看 /boot/grub/grub.cfg 的内容,应该是和 --class 相关,这里 windows 的条目写着 --class windows ,debian 的条目有: --class gnu-linux --class gnu --class linux ,似乎没有识别出来是 debian 。
通过 Grub2 icons question 提到的 /boot/grub/grub.cfg 是通过 /etc/grub.d/ 生成的。
这里提到了 10_linux 和 30_uefi-firmware ,但是我这个环境,通过排查,发现是需要修改 30_os-prober 。
处理 debian
首先编辑一下:
sudo gnome-text-editor /etc/grub.d/30_os-prober
看到这里有一个循环:
for LINUX in ${LINUXPROBED} ; do
LROOT="`echo ${LINUX} | cut -d ':' -f 1`"
LBOOT="`echo ${LINUX} | cut -d ':' -f 2`"
LLABEL="`echo ${LINUX} | cut -d ':' -f 3 | tr '^' ' '`"
LKERNEL="`echo ${LINUX} | cut -d ':' -f 4`"
LINITRD="`echo ${LINUX} | cut -d ':' -f 5 | tr '^' ' '`"
LPARAMS="`echo ${LINUX} | cut -d ':' -f 6- | tr '^' ' '`"
找个位置打印 ${LINUXPROBED} ,刷新 /boot/grub/grub.cfg 看到读取到的是一个字符串
/dev/nvme1n1p1:/dev/nvme1n1p1:Debian^GNU/Linux:/boot/vmlinuz-6.1.0-27-amd64:/boot/initrd.img-6.1.0-27-amd64:root=UUID=4e1c33cd-xxxx-xxxx-xxxx-3799d98cba2f^ro^quiet /dev/nvme1n1p1:/dev/nvme1n1p1:Debian^GNU/Linux,^with^Linux^6.1.0-27-amd64:/boot/vmlinuz-6.1.0-27-amd64:/boot/initrd.img-6.1.0-27-amd64:root=UUID=4e1c33cd-xxxx-xxxx-xxxx-3799d98cba2f^ro^quiet /dev/nvme1n1p1:/dev/nvme1n1p1:Debian^GNU/Linux,^with^Linux^6.1.0-27-amd64^(recovery^mode):/boot/vmlinuz-6.1.0-27-amd64:/boot/initrd.img-6.1.0-27-amd64:root=UUID=4e1c33cd-xxxx-xxxx-xxxx-3799d98cba2f^ro^single
分析一下,LLABEL 就是通过 : 分割的第三个,然后 替换 ^ 为 空格,得到 Debian GNU/Linux ,所以可以照这样处理得到 debian:
LOS="`echo ${LINUX} | cut -d ':' -f 3 | cut -d '^' -f 1 | tr '[:upper:]' '[:lower:]' `"
在这里加上一行,声明一个 LOS 变量:把分割出来的 Debian^GNU/Linux 通过 ^ 分割,然后替换为小写。
然后搜索 menuentry 把
--class gnu-linux
改成
--class ${LOS:-gnu-linux}
这里 :- 相当于 “或”,LOS 不存在则为 gnu-linux。
最后运行
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
使用文本编辑器查看结果
sudo gnome-text-editor /boot/grub2/grub.cfg
这样就能看到成功添加上 --class debian 了。
处理 recovery
发现主题的图标里有专门的 recovery 图标,直接加一个判断,如果 ${LINUX} 里边包含 字符串 recovery ,就让变量为 recovery
if [[ ${LINUX} == *"recovery"* ]]; then
LOS="recovery"
fi
处理 efi
直接修改 30_os-prober 影响不到生成的结果。
于是编辑 30_uefi-firmware
sudo gnome-text-editor /etc/grub.d/30_uefi-firmware
加上 --class efi
menuentry '$LABEL' --class efi
运行 grub2-mkconfig 看一下也成功加上了。
处理 rescue
fedora 有两条记录,有一个是 rescue ,用的都是 fedora 的图标。
宿主系统的引导并没有在 /boot/grub2/grub.cfg 里边,找了一下相关的目录,看到这两个:
root@fedora:/boot/loader/entries# tree
.
├── 18b19aa06ee84eadad1c6d7164027242-0-rescue.conf
└── 18b19aa06ee84eadad1c6d7164027242-6.11.7-300.fc41.x86_64.conf
1 directory, 2 files
位于 /boot/loader/entries ,用的 conf 文件,目前不知道是什么时候生成的,于是直接修改试试:
给它强行使用 recovery 的图标。
最下面加上:
grub_class recovery
grub_class fedora