概要

OpenZFSは、オープンソースのストレージプラットフォームである。
従来のファイルシステムとボリュームマネージャの両方の機能を含んでおり、以下に示すような多くの高度な機能を備えている。

  • データ破損からの保護データとメタデータの整合性チェック
  • 継続的な整合性検証と自動「自己修復」修復
  • ミラーリング、RAID-Z1/2/3 [およびDRAID]によるデータの冗長性
  • 最大256兆ヨビバイト(2^128バイト)の大容量ストレージのサポート
  • LZ4、GZIP、またはZSTDを使用した透過的圧縮による省スペース化
  • ハードウェアアクセラレーションによるネイティブ暗号化
  • スナップショットとコピーオンライトクローンによる効率的なストレージ
  • 効率的なローカルまたはリモート・レプリケーション - ZFS send and receiveで変更されたブロックのみを送信



ZFSのインストール

詳細を知りたい場合は、OpenZFSの公式ドキュメントを参照すること。

リポジトリを追加してインストール

RHEL

DKMSおよびkABIトラッキング kmodスタイルパッケージは、OpenZFSリポジトリからRHELベースのLinuxディストリビューション向けに提供されている。
これらのパッケージは、新しいバージョンがリリースされるたびに更新されており、現在のメジャーリリースの現在のマイナーバージョンのリポジトリのみが新しいパッケージで更新される。

インストールを簡単にするため、zfs.repo設定ファイルと公開署名キーを含むzfs-releaseパッケージが提供されている。
OpenZFSパッケージは、この鍵を使用して署名されており、yumまたはdnfは、インストールを許可する前にパッケージの署名を検証する。
ユーザは、ここに記載されているフィンガープリントを使用して、OpenZFS公開鍵の信頼性を検証することを強く推奨する。

sudo dnf install https://zfsonlinux.org/epel/zfs-release-2-3$(rpm --eval "%{dist}").noarch.rpm


zfs-releaseパッケージをインストールして公開鍵を検証した後、DKMSまたはkABIトラッキング kmodスタイルパッケージのどちらかをインストールすることができる。
DKMSパッケージは、非ディストリビューションのカーネルを実行しているユーザや、OpenZFSにローカルなカスタマイズを適用したいユーザに推奨される。
多くのユーザには、カーネルアップデートごとにOpenZFSを再構築する必要がないkABIトラッキング kmodパッケージを推奨する。

  • DKMSスタイルのパッケージをインストールする場合
    まず、epel-releaseパッケージをインストールした後、DKMSを提供するEPELリポジトリを追加して、次にkernel-develパッケージとzfsパッケージをインストールする。
    DKMSは、OpenZFSをビルドするためにkernel-develパッケージを必要とするため、実行中のカーネルに一致するkernel-develパッケージがインストールされていることを確認する。
    sudo dnf install epel-release
    sudo dnf install kernel-devel
    sudo dnf install zfs

  • kABIトラッキング kmodスタイルのパッケージをインストールする場合
    デフォルトでは、zfs-releaseパッケージはDKMSスタイルのパッケージをインストールするように設定されているため、幅広いカーネルで動作する。
    kABIトラッキング kmodスタイルをインストールする場合は、デフォルトのリポジトリをzfsからzfs-kmodに切り替える必要がある。
    kABIトラッキング kmodスタイルは、Linuxディストリビューションが提供する非Streamカーネルでのみ動作が確認されていることに注意すること。
    sudo dnf config-manager --disable zfs
    sudo dnf config-manager --enable zfs-kmod
    sudo dnf install zfs

    デフォルトでは、OpenZFSカーネルモジュールは、ZFSプールが検出されると自動的にロードされる。
    ブート時に常にモジュールをロードする場合は、/etc/modules-load.dディレクトリに設定ファイルを作成する。
    sudo vi /etc/modules-load.d/zfs.conf


# /etc/modules-load.d/zfs.confファイル

zfs


DKMSからkABIトラッキング kmodsに切り替える場合、まず、既存のDKMSパッケージをアンインストールする。
これにより、インストールされている全てのカーネルモジュールが削除されて、その後、kABIトラッキング kmodsをインストールすることができる。

※注意
RHELをアップデートする場合、カーネルアップストリームのkABIの変更により、既存のkmodスタイルのパッケージが動作しないことがある。
現在のリリースパッケージの設定により、既に更新されたパッケージが利用可能になっているかもしれないが、
バージョニングが新しいものではない場合、パッケージマネージャはそのパッケージをインストールしない可能性がある。

そのため、アップグレードする場合、ユーザはkmod-zfsパッケージが適切なカーネルモジュールを提供していることを確認して、必要であればkmod-zfsパッケージを再インストールする必要がある。

SUSE

SUSEの公式リポジトリにあるfilesystemを追加する。

# SLE 15 SP 5
sudo zypper addrepo -f https://download.opensuse.org/repositories/filesystems/SLE_15_SP5/ FileSystem

# SLE 15 SP 4
sudo zypper addrepo -f https://download.opensuse.org/repositories/filesystems/SLE_15_SP4/ FileSystem

# SLE 15 SP 3
sudo zypper addrepo -f https://download.opensuse.org/repositories/filesystems/SLE_15_SP3/ FileSystem

# openSUSE Leap
sudo zypper addrepo -f 'https://download.opensuse.org/repositories/filesystems/$releasever/' FileSystem


追加したリポジトリを更新する。

sudo zypper --gpg-auto-import-keys refresh


ZFSをインストールする。

sudo zypper install zfs zfs-kmp-default dkms 


ソースコードからインストール

ZFSのビルドに必要なライブラリをインストールする。

# SUSE
sudo zypper install pkg-config autoconf make zlib-devel libaio-devel libuuid-devel libblkid-devel libtirpc-devel \
                    pam-devel libgnutls-devel libgcrypt-devel \
                    kernel-devel kernel-source
                    systemd-devel  # Systemdサービスを使用する場合


ZFSのGithubにアクセスして、ソースコードをダウンロードする。
ダウンロードしたファイルを解凍する。

tar xf zfs-<バージョン>.tar.gz
cd zfs-<バージョン>


ZFSをビルドおよびインストールする。

../configure --prefix=<ZFSのインストールディレクトリ> --enable-systemd --enable-nls --enable-linux-builtin
make -j $(nproc)
sudo make install


~/.profileファイル等に、環境変数を追記する。

vi ~/.profile


 # ~/.profileファイル
 
 export PATH="/<ZFSのインストールディレクトリ>/bin:$PATH"
 export PATH="/<ZFSのインストールディレクトリ>/sbin:$PATH"
 
 export LD_LIBRARY_PATH="/<ZFSのインストールディレクトリ>/lib64:$LD_LIBRARY_PATH"
 
 export MANPATH="/<ZFSのインストールディレクトリ>/share/man:$MANPATH"



ZFSのアンインストール

ZFSをアンインストールする。

sudo make uninstall


セキュアブートが有効な場合、署名を削除する。

cd ~/MOK/ZFS
sudo mokutil --delete ./ZFS.der --root-pw


PCを再起動して、署名を削除する。

ZFSのカーネルモジュールを削除する。

sudo rm /lib/modules/$(uname -r)/extra/zfs.ko \
        /lib/modules/$(uname -r)/extra/spl.ko


カーネルモジュールを再読み込みする。

sudo depmod -a $(uname -r)



MOKの署名

セキュアブートが有効の場合、ZFSモジュールの署名を登録する必要がある。

まず、ZFSモジュールの署名に必要な設定ファイルを作成する。

mkdir -p ~/MOK/ZFS && cd ~/MOK/ZFS
vi ZFS.config


 # ~/MOK/ZFS/ZFS.configファイル
 
 [ req ]
 default_bits = 4096
 distinguished_name = req_distinguished_name
 prompt = no
 string_mask = utf8only
 x509_extensions = myexts
 
 [ req_distinguished_name ]
 O = SUSE Linux Products GmbH (User Add ZFS)            # 任意の名前
 CN = SUSE Linux Enterprise Secure Boot (User Add ZFS)  # 任意の名前
 emailAddress = suse@localhost                          # 任意のメールアドレス
 
 [ myexts ]
 basicConstraints=critical,CA:FALSE
 keyUsage=digitalSignature
 subjectKeyIdentifier=hash
 authorityKeyIdentifier=keyid


キーペアを作成する。

openssl req -x509 -new -nodes -utf8 -sha256 -days 36500 -batch -config ./ZFS.config \
            -outform DER -out ./ZFS.der -keyout ./ZFS.priv \
            -addext "extendedKeyUsage=codeSigning"


次に、MOK(Module owned Key)にキーをインポートする。
--root-pwオプションを付加することにより、再起動時のZFSモジュールの署名において、rootパスワードが必要となる。

sudo mokutil --import ./ZFS.der --root-pw


PCを再起動して、上記のキーの署名する。

sudo systemctl reboot


ZFSモジュール(spl.koおよびzfs.ko)を署名する。

sudo /lib/modules/$(uname -r)/build/scripts/sign-file sha256 ./ZFS.priv ./ZFS.der /lib/modules/$(uname -r)/extra/spl.ko
sudo /lib/modules/$(uname -r)/build/scripts/sign-file sha256 ./ZFS.priv ./ZFS.der /lib/modules/$(uname -r)/extra/zfs.ko


必要であれば、ZFSモジュールをXZ形式またはZstandard形式に圧縮する。(任意)

# XZ形式の場合
cd /lib/modules/$(uname -r)/extra/
sudo xz -f spl.ko
sudo xz -f zfs.ko

# Zstandard形式の場合
cd /lib/modules/$(uname -r)/extra/
sudo zstd --rm spl.ko
sudo zstd --rm zfs.ko


ZFSモジュールを読み込む。

sudo depmod -a $(uname -r)  # モジュール依存リストを更新する
sudo modprobe -v spl        # ZFSモジュールを読み込む
sudo modprobe -v zfs        # ZFSモジュールを読み込む


ZFSモジュールが正常に読み込まれているかどうかを確認する。

lsmod | grep spl
lsmod | grep zfs
# または
sudo modinfo spl
sudo modinfo zfs


ZFSモジュールが正しく署名されているかどうかを確認する。
正常に読み込まれている場合は、"ZFS.der is already enrolled"と表示される。

cd <ZFSモジュールの署名ファイルが存在するディレクトリ>
sudo mokutil --test-key ./ZFS.der


上記の署名は、カーネルがアップデートされた場合、再度、署名が必要となることに注意する。

作成したキーは信頼されるため、キーを適切に保存する必要がある。
このキーで署名されたものはシステムから信頼されるため、セキュリティリスクとなる可能性があることに注意する。


ZFSの起動

ZFSサービスを起動する。

sudo systemctl start zfs.target


ZFSプールの再起動時に自動マウントするように、サービスを有効にする。

sudo systemctl start zfs-import-cache
sudo systemctl start zfs-mount
sudo systemctl start zfs-import.target


ZFSプールのアップデートが必要かどうかを確認する。

sudo zpool status


もし、action: Upgrade the pool using 'zpool upgrade'.メッセージが表示される場合、アップデートが必要である。
全てのプールをアップデートする。

sudo zpool upgrade -a


これらのSystemdサービスユニットは、/usr/lib/systemd/systemディレクトリに存在する。