前言
最近刷系统玩不小心把原本的启动项给覆盖掉了, 在经过大约一天时间后总算是救回来了, 也因此对系统引导这部分内容再复习了一次, 所以就有了制作一个开机主题的想法.
这个东西写起来倒并不复杂, 主要是可以参考的资料不多而且调试起来不是很方便, 主要参考了这两篇文章: 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"
最终大概是这个样子:
因为还要放菜单栏所以把图标往上挪了一点, 不加背景菜单栏左边的白色图标又完全看不到.
参考
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 这个参数但是却出现在了不少主题里.
字体更是一绝, 首先需要用它自带的软件进行格式转换成一个它的专有格式, 然后在字体支持上也是一言难尽, 简单说就是只能选择命令行用的那种字体, 像下面这种字体只支持第一种
已有 2 条评论
Linux玩的很溜。
@威言威语 无奈手头设备不够多都是刚需的, 不然就可以体验一下其他发行版了.