可以乐成不可与虑始

发布于
修复 grub 菜单条目中的图标显示错误

愚者暗于成事,智者见于未萌。 民不可与虑始,而可与乐成。


由于 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