Arch Linux ZFS wiki 页面解释grub 兼容的池创建,就像此页面关于引导 Fedora,但我无法创建 Grub 可读的池。 Arch Linux wiki 页面关于在 ZFS 上安装 Arch Linux强调了某些错误,但没有真正解释如何克服它们。
链接页面解释了 Grub 支持的一个子集zpool 功能并且无法读取使用它不支持的功能的池。他们继续解释如何配置合适的池,但我一直无法使其工作。支持的功能子集似乎没有在任何地方记录。
我使用虚拟机来测试 Grub 2.02 和 Arch Linux 内核 4.16.13-1-ARCH,这是最新的并且与当前zfs-linux
软件包版本 ( zfs-linux-0.7.9.4.16.13.1-1
) 兼容。我(还)还没有尝试制作一个可启动系统,只是为了证明 Grub 可以读取 zpool。这是我尝试过的:
首先,像拱形维基页面建议通过禁用不需要的功能:
# zpool create \
-o feature@multi_vdev_crash_dump=disabled \
-o feature@large_dnode=disabled \
-o feature@sha512=disabled \
-o feature@skein=disabled \
-o feature@edonr=disabled \
testpool mirror \
/dev/disk/by-id/ata-VBOX_HARDDISK_VB{5f2d4170-647f16b7,f38966d8-57bff7df}
这导致了这些功能:
testpool feature@async_destroy enabled local
testpool feature@empty_bpobj active local
testpool feature@lz4_compress active local
testpool feature@multi_vdev_crash_dump disabled local
testpool feature@spacemap_histogram active local
testpool feature@enabled_txg active local
testpool feature@hole_birth active local
testpool feature@extensible_dataset active local
testpool feature@embedded_data active local
testpool feature@bookmarks enabled local
testpool feature@filesystem_limits enabled local
testpool feature@large_blocks enabled local
testpool feature@large_dnode disabled local
testpool feature@sha512 disabled local
testpool feature@skein disabled local
testpool feature@edonr disabled local
testpool feature@userobj_accounting active local
然后,就像软呢帽示例,通过启用所需的功能:
zpool create -d \
-o feature@async_destroy=enabled \
-o feature@empty_bpobj=enabled \
-o feature@spacemap_histogram=enabled \
-o feature@enabled_txg=enabled \
-o feature@hole_birth=enabled \
-o feature@bookmarks=enabled \
-o feature@embedded_data=enabled \
-o feature@large_blocks=enabled \
testpool mirror \
/dev/disk/by-id/ata-VBOX_HARDDISK_VB{5f2d4170-647f16b7,f38966d8-57bff7df}
这导致了这些功能:
# zpool get all testpool | grep feature
testpool feature@async_destroy enabled local
testpool feature@empty_bpobj active local
testpool feature@lz4_compress disabled local
testpool feature@multi_vdev_crash_dump disabled local
testpool feature@spacemap_histogram active local
testpool feature@enabled_txg active local
testpool feature@hole_birth active local
testpool feature@extensible_dataset enabled local
testpool feature@embedded_data active local
testpool feature@bookmarks enabled local
testpool feature@filesystem_limits disabled local
testpool feature@large_blocks enabled local
testpool feature@large_dnode disabled local
testpool feature@sha512 disabled local
testpool feature@skein disabled local
testpool feature@edonr disabled local
testpool feature@userobj_accounting disabled local
在每种情况下,我都加载了一些内容:
# cp -a /boot /testpool
然后,重新启动进入 Grub:
grub> search --set --label testpool
grub> ls /
@/
grub> ls /@
error: compression algorithm 80 not supported
.
grub> ls /@/
error: compression algorithm inherit not supported
.
我尝试启用/禁用某些功能,最值得注意的是lz4_compress
。我还尝试在池上创建数据集。我在 Grub 中尝试过的任何方法都不起作用。
我希望能够列出/boot
或/@/boot
。
遇到的错误包括
compression algorithm inherit not supported
compression algorithm 66 not supported
compression algorithm 80 not supported
incorrect dnode type
应如何创建 ZFS zpool 才能被 Grub 读取?
答案1
由于以下错误,Grub 无法可靠地执行 zpool 的目录列表通过邮件列表确认:
Grub 中的目录内容列表已损坏,我有一个补丁可以修复该特定问题。如果您收到奇怪的错误消息(例如,无效的 BP 类型或压缩算法之类的内容),很可能是这个问题。
从 ArchLinux 和 Fedora 28 安装的 Grub 中都存在此问题。但是,Ubuntu 似乎已经修补了 Grub 来修复此问题(已在 Ubuntu 16.10 中得到确认)。
然而,Grub 可以读取引导所需的文件。您可以创建一个 Grub 将启动的 zpool,如下所示:
zpool create -m none "$ZPOOL" "$RAIDZ" "${DISKS[@]}"
其中变量定义池的名称(例如)mypool
、RAID 级别(例如)mirror
和磁盘(例如/dev/disk/by-id/...
,镜像需要两个磁盘)。
您需要创建一个数据集
zfs create -p "$ZPOOL"/ROOT/archlinux
您需要设置数据集的挂载点:
zfs set mountpoint=/ "$ZPOOL"/ROOT/archlinux
然后,您可以使用以下命令通过 Grub 启动它:
insmod part_gpt
search --set --label mypool
linux /ROOT/archlinux@/boot/vmlinuz-linux zfs=mypool rw
initrd /ROOT/archlinux@/boot/initramfs-linux.img
boot
我编写了这个在 VirtualBox 机器中测试它。我将 Arch 从 ISO 安装到普通的 ext4 根目录上,然后使用它将新的 ZFS 根目录安装到两个镜像虚拟磁盘上。以上是总结 - 请参阅脚本了解完整详情。
答案2
支持的功能子集似乎没有在任何地方记录。
我可以找到支持的功能列表的唯一可靠的地方是 GRUB源代码(今天版本的永久链接)。基本上所有只写功能加上那些明确列出的功能。