openSUSE 下开启 Btrfs 压缩需谨慎

如果你的 openSUSE 环境满足以下所有条件:

  1. i386 架构或者使用了传统 bios。
  2. 使用 Btrfs 文件系统。
  3. 使用 GRUB2 引导。
  4. /boot 没有单独分区。

那么请千万不要使用 ZSTD 算法开启 Btrfs 压缩,这将导致系统无法启动!!!

背景

一直想试试 Btrfs 的透明压缩特性,根据文档选择了 ZSTD 算法,并确认最新的 grub2 应该支持这一算法。由于是在安装后才开启压缩的,因此现有的文件不会被自动压缩,系统顺利运行了一段时间。

直到进行了一次系统更新,由于一些更新会更新/boot 内的文件,这部分新文件便会使用 ZSTD 压缩。

然而系统却没有如预想一般正常启动,而是进入了 GRUB shell。使用恢复盘,开启了 GRUB 错误消息,出现如下报告:

Compression type 0x3 not supported

看来是压缩算法不受支持。然而 openSUSE 的 GRUB2 版本应该已经支持 ZSTD 了啊?

就在百思不得其解的时候,查看了一下官方仓库,才发现 openSUSE 打了个补丁,禁用了 i386 平台的 GRUB2 的 ZSTD 特性。

病因

openSUSE 的 GRUB2 禁用了 i386 平台的 ZSTD 特性(上游支持)。如果你开启了 Btrfs 压缩,使用 ZSTD 算法,并且 boot 没有单独分区,那么系统将不能正常启动。另外,即使你的系统是 64 位的,但如果在非 uefi 模式下,GRUB2 也以 32 位模式运行(很多虚拟机环境就是这种情况)。

解决方法

自己编译没有补丁的 GRUB2 自然是一种方法,不过现阶段还是禁用压缩比较实际。

首先使用恢复盘,用如下命令使用默认算法重新压缩/boot 分区:

btrfs filesystem defragment -rc /boot

然后在/etc/fstab 禁用 Btrfs 压缩即可。

发表评论

您的电子邮箱地址不会被公开。