web-dev-qa-db-ja.com

GRUBが読み取れるZFS zpoolを作成する方法

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をどのように作成する必要がありますか?

5
starfry

メーリングリストで確認 のバグにより、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 を参照してください。

2
starfry