如何創建 GRUB 可以讀取的 ZFS zpool
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 根目錄。以上是一個摘要 - 有關完整詳細資訊,請參閱腳本。