前言

最近刷系统玩不小心把原本的启动项给覆盖掉了, 在经过大约一天时间后总算是救回来了, 也因此对系统引导这部分内容再复习了一次, 所以就有了制作一个开机主题的想法.

这个东西写起来倒并不复杂, 主要是可以参考的资料不多而且调试起来不是很方便, 主要参考了这两篇文章: GRUB - Arch Linux 中文维基 GNU GRUB Manual 2.12

实现

首先生成一个不是那么辣眼睛的背景图最好还带点半透明, 用 ImageMagick 就够了

magick -size 3840x2160 xc:'#FFFFFFF0' background/translucent_white.png
# convert 命令是过时的但仍然可用
convert -size 3840x2160 xc:'#FFFFFFF0' background/translucent_white.png

接下来就按照 GNU 官方文档和几个第三方的主题照着写一个了, 写的时候有种在写 CSS 的感觉( 快进到添加 JavaScript Feature

其他的例如图片和字体资源直接从其他主题里复制过来凑合用, 也可以直接拿本地字体进行转换使用.

grub-mkfont /path/to/fontfile -o ./font.pf2

系统 Logo 图部分发现分辨率不够, 于是找了其他主题图标进行替换, 但是又发现我系统图标比较特殊所以还得自己想办法生成一个, 找到本机上其他位置的矢量图用 ffmpeg 进行转换解决了. 后面又改用 inkscape 直接从矢量图生成全部图标, 也是直接用其他主题所提供的资源.( 对于 PNG 图片用 GIMP 进行二次处理

# 旧的
ffmpeg -i dr460nized.svg -vf "scale=64:64,format=rgba,setsar=1:1,setdar=1:1" -colorspace bt709 -pix_fmt rgba garuda.png -y
# 新的
inkscape --export-dpi=96 --export-filename=garuda.png dr460nized.svg

调试是用 https://github.com/hartwork/grub2-theme-preview 这个项目来进行的, 但是只用 qemu-base 是看不到画面的, 在发现这个问题之前我一直真机调试....

应用主题

完成这些之后需要更新文件才能生效, 对于单系统引导放心大胆地执行就好了.

# 更新引导文件命令, 不需要
# sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=GRUB
# 二选一, 完全相同
sudo update-grub
sudo grub-mkconfig -o /boot/grub/grub.cfg

可选 如果需要添加其他系统启动项可以在更新之前创建并编辑位于 /etc/grub.d 下的 4 开头的文件,文件内容大概如下:

#!/bin/sh
exec tail -n +3 $0

menuentry "Garuda KDE" --class dr460nized --class archlinux --class gnu-linux {
    load_video
    set gfxpayload=keep
    insmod gzio
    insmod part_gpt
    insmod btrfs
    search --no-floppy --fs-uuid --set=root c039404d-589d-4e1f-aa35-5d1a95846956
    echo    'Loading Linux linux-zen ...'
    linux   /@/boot/vmlinuz-linux-zen root=UUID=c039404d-589d-4e1f-aa35-5d1a95846956 rw rootflags=subvol=@  quiet loglevel=3 ibt=off
    echo    'Loading initial ramdisk ...'
    initrd  /@/boot/initramfs-linux-zen.img
}

文件会生成在 esp/EFI/{bootloader-id}/grubx64.efi/boot/grub/grub.cfg 其中 esp 是指 EFI system partition 的挂载点, 一般在 /boot /boot/efi 或者 /esp.

特别的, 我是基于 2k 分辨率进行制作的, 如果分辨率不匹配可能会很难看( 本来也就不好看

需要修改 /etc/default/grub 文件中的内容实现指定分辨率和替换主题

+ GRUB_GFXMODE=2560x1440
+ GRUB_THEME="/usr/share/grub/themes/Genshin/theme.txt"

最终大概是这个样子:

boot

因为还要放菜单栏所以把图标往上挪了一点, 不加背景菜单栏左边的白色图标又完全看不到.

参考

https://github.com/AdisonCavani/distro-grub-themes

https://github.com/vinceliuice/grub2-themes

https://github.com/Generator/Grub2-themes

项目地址

https://github.com/albaz64/grub2-theme-genshin

用到的工具们:

  • FFmpeg
  • ImageMagick
  • GIMP
  • Inkscape
  • GRUB2

吐槽

不愧是十七年前的项目啊, 先不说配置文件上的语法奇奇怪怪, 就连支持的格式也十分可怜: JPEG 只能 8bit 256 色, PNG 好一些但是之前用 ffmpeg magick 导出的图片是看不到的, 所以才加了一些奇怪的参数尝试修复.

而且哪怕是能够显示, 我也不知道为什么我原本的 logo 图片只能显示左上角大约四分之一, 并且替换为其他图片又能够完全显示, 最后妥协直接把图标嵌入到背景当中了.

此外, 官方文档虽然写的洋洋洒洒但貌似有些小细节漏了写, 比如我并没有发现 terminal-font 这个参数但是却出现在了不少主题里.

字体更是一绝, 首先需要用它自带的软件进行格式转换成一个它的专有格式, 然后在字体支持上也是一言难尽, 简单说就是只能选择命令行用的那种字体, 像下面这种字体只支持第一种

image.png