Arch Linux ZFS wiki 页面解释了与 grub 兼容的池创建,这个关于引导 Fedora 的页面也是如此,但我无法创建 Grub 可读的池。关于在 ZFS 上安装 Arch Linux的 Arch Linux wiki 页面突出显示了某些错误,但并没有真正解释如何克服这些错误。
链接页面说明 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。这是我尝试过的:
首先,就像arch wiki 页面建议的那样,通过禁用不需要的功能:
# 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
然后,像fedora 示例一样,通过启用想要的功能:
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 可以读取它?
由于通过邮件列表确认的错误,Grub 无法可靠地执行 zpool 的目录列表:
这个问题存在于从 ArchLinux 和 Fedora 28 安装的 Grub 中。然而,Ubuntu 似乎已经修补了他们的 Grub 来解决这个问题(在 Ubuntu 16.10 上得到确认)。
但是,Grub 可以读取启动所需的文件。您可以创建一个 Grub 将像这样引导的 zpool:
其中变量定义池的名称,例如
mypool
,RAID 级别,例如mirror
和磁盘,例如/dev/disk/by-id/...
(镜像需要两个磁盘)。您需要创建一个数据集
您需要设置数据集的挂载点:
然后,您可以使用 Grub 使用以下命令启动它:
我编写了这个脚本以在 VirtualBox 机器上对其进行测试。我将 Arch 从 ISO 安装到一个普通的 ext4 根目录,然后用它在两个镜像虚拟磁盘上安装一个新的 ZFS 根目录。以上是一个摘要 - 有关完整详细信息,请参阅脚本。
我可以找到支持的功能列表的唯一可靠的地方是 GRUB 的源代码(永久链接到今天的版本)。基本上所有只写功能加上那里明确列出的功能。