制作 Linux 模版时出现 grub error: unknown filesystem 的解决办法

开篇废话

发现之前做的系统模版好久没更新了,这里来闲得蛋疼更新一下。
另外此文章就是个排错指南,主要是展示一下我的思路为主。
主要是应该也没人碰见这么奇怪的问题

遇到问题

之前一直没有做的原因是 grub 不知道为什么死活都报错,提示
grub error 1

unknown filesystem

于是我去搜索了一下,发现是 ext4 版本的特性 grub 可能还不支持的原因导致 grub 不认识这个文件系统。
参考 Arch Linux wiki

这个错误也可能是因为一个 ext4 文件系统拥有 GRUB 不支持的特性:

  • large_dir - 不被支持。
  • metadata_csum_seed - GRUB 2.11 将会支持(commit)。

经过检查,发现确实是为 ext4 分区带上了 metadata_csum_seed 导致的问题,而目前 debian10/11 的 grub 版本都在 2.05,因此 grub 没能安装上。

解决方案

强行安装 2.05 版本的 grub

grub error 2
评价是不用试了,grub 不认识就是不认识…

手动安装更新版本 grub

此方案被我废弃,因为用户可能会自己装 grub,我们做模版原则都是最小改动系统。
这样强行 break 软件(特别是 deb 系列的 apt 我就根本不会修软件依赖)感觉还是太奇妙。
因此放弃。

tune2fs

tune2fs -O ^metadata_csum_seed /dev/sda1

grub 测试是可以正常安装的,但是系统启动后会因为一些奇怪的错误什么的变成 ro ,因此继续放弃。
因为是去除特性,但是我们没有完整的过一遍同步之类的,所以出现问题感觉也很正常。
也许 ro 后运行 fsck 什么的重新检查一遍就行。

但是还是不能最小地改系统,因此此方案也抛弃。

/etc/mke2fs.conf

这里又找了个配置方法,就是编辑 /etc/mke2fs.conf 文件, 我们编辑,手动去掉 ,metadata_csum_seed grub error 2

这样我们执行 mkfs 的时候就不会带上 metadata_csum_seed 特性了,经过测试是正常的。

还没有结束!

上面这些个特性的话,肯定还是越新越好,因此我们最好是通过模版里面的文件直接复制过去,按照常理来说各个发行版这些 bug 还是能解决的,而我们碰到这个 bug 纯粹是因为我们执行 mkfs 的系统和实际的系统不一样而导致的。

这里给个 ubuntu 模版打包的例子:

wget https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64-root.tar.xz -O1.tar.xz
rm /etc/mke2fs.conf
tar -xvf /tmp/1.tar.xz -C / -k etc/mke2fs.conf
mkfs.ext4 /dev/sda1

这样就差不多解决了….

总结

这简单来说就是软件版本的小问题,不过还是困扰了我好几个月,今天终于解决了还是挺开心的。
然后大概两三年前遇到过类似的情况,一台服务器的各种软件版本太老(毕竟是 Centos6),需要开个不带 journal (tune2fs -O ^has_journal) 的 ext4 才能让模版正常跑,目测是因为软件不支持 journal 特性导致文件写不进去或者读取不了….