Arch-Linux

如何創建 GRUB 可以讀取的 ZFS zpool

  • February 15, 2022

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 的目錄列表:

在 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 根目錄。以上是一個摘要 - 有關完整詳細資訊,請參閱腳本

引用自:https://unix.stackexchange.com/questions/447960