Arch Linux ZFS wikiページで grub互換のプールの作成 について説明しています Fedoraの起動に関するこのページ と同じですが、Grubで読み取り可能なプールを作成できませんでした。 ZFSへのArch Linuxのインストール に関するArch Linux wikiページは、特定のバグを強調していますが、それらを克服する方法を実際には説明していません。
リンクされたページは、Grubが zpool features のサブセットをサポートしており、サポートしていない機能を使用するプールを読み取れないことを説明しています。彼らは適切なプールを構成する方法を説明し続けますが、私はそれを機能させることができませんでした。サポートされている機能のサブセットはどこにも文書化されていないようです。
私は仮想マシンを使用して、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 page が示唆するように、不要な機能を無効にします。
# 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
Grubで読み取れるようにするには、ZFS zpoolをどのように作成する必要がありますか?
メーリングリストで確認 のバグにより、Grubはzpoolのディレクトリリストを確実に実行できません。
grub内のディレクトリの内容のリストが壊れている、私はその特定の問題を修正するパッチをあちこちに置いています。奇妙なエラーメッセージ(無効なBPタイプや圧縮アルゴリズムなど)が表示された場合、これはおそらくこの問題です。
この問題はArchLinuxとFedora 28からインストールされたGrubに存在します。しかし、Ubuntuはこれを修正するためにGrubにパッチを適用しているようです(Ubuntu 16.10で確認済み)。
ただし、Grubは起動に必要なファイルを読み取ることができます。 Grubが次のように起動するzpoolを作成できます。
zpool create -m none "$ZPOOL" "$RAIDZ" "${DISKS[@]}"
ここで、変数はプールの名前を定義します(例:mypool
)、レイドレベル(例: mirror
およびディスク、たとえば/dev/disk/by-id/...
(ミラーには2つのディスクが必要です)。
データセットを作成する必要があります
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
I scripted this VirtualBoxマシンでテストする。 ArchをISOから通常のext4ルートにインストールし、それを使用して新しいZFSルートを2つのミラーリングされた仮想ディスクにインストールしました。上記は要約です-詳細については script を参照してください。