ZFS - zfs#

ZFS は物理ボリューム管理とファイルシステムを兼ね備えています。 ZFS のインストールは一連のストレージデバイスに広がることができ非常にスケーラブルで、ディスクを追加してストレージプールの空き容量を即座に拡大できます。

ZFS はブロックベースのファイルシステムで、あらゆる操作を検証、確認、訂正するのにチェックサムを使用することでデータ破壊から守ります。 十分な速度で動作するためには、この機構には強力な環境と大量の RAM が必要です。

さらに、 ZFS はスナップショット、リプリケーション、RAID 管理、コピー・オン・ライトのクローン、圧縮、その他の機能を提供します。

ZFS を使用するにはマシンに zfsutils-linux をインストールしていることを確認してください。

用語#

ZFS は物理ストレージデバイスに基づいた論理ユニットを作成します。 これらの論理ユニットは ZFS pools または zpools と呼ばれます。 さらにそれぞれの zpool は複数の データセット に分割されます。 これらのデータセットは以下の異なるタイプがあります。

  • ZFS ファイルシステム はパーティションまたはマウントされたファイルシステムとして扱えます。

  • ZFS ボリューム はブロックデバイスを表します。

  • ZFS スナップショット は ZFS ファイルシステムまたは ZFS ボリュームの特定の状態をキャプチャーします。 ZFS スナップショットは読み取り専用です。

  • ZFS クローン は ZFS スナップショットの書き込み可能なコピーです。

LXD の zfs ドライバ#

LXD の zfs ドライバは ZFS ファイルシステムと ZFS ボリュームをイメージとカスタムストレージボリュームに使用し、ZFS スナップショットとクローンをイメージからのインスタンス作成とインスタンスとカスタムボリュームスナップショットに使用します。 デフォルトでは LXD は ZFS プール作成時に圧縮を有効にします。

LXD は ZFS プールとデータセットを完全制御できると想定します。 このため、ZFS プールまたはデータセット内に、LXD が所有しないファイルシステムエンティティは、決して置くべきではありません。LXD が消してしまうかもしれないからです。

ZFS のコピー・オン・ライトが動作する仕組みのため、親の ZFS ファイルシステムは全ての子供がいなくなるまで削除できません。 その結果、LXD は削除されたがまだ参照されている全てのオブジェクトを自動的にリネームします。 それらのオブジェクトは全ての参照がいなくなりオブジェクトが安全に削除できるようになるまでランダムな deleted/ パスに保管されます。 この方法はスナップショットの復元に予期しない結果をもたらすかもしれないことに注意してください。 下記の 制限 を参照してください。

ZFS 0.8 以降の上で新しく作成された全てのプールで LXD はトリミングサポートを自動的に有効化します。 これはコントローラによるより良いブロックの再利用を可能にすることで SSD の寿命を伸ばし、ループバックの ZFS プールを使用する際にはルートファイルシステム上の容量を解放できるようにもします。 ZFS の 0.8 より前のバージョンを稼働していてトリミングを有効にしたい場合は、少なくともバージョン 0.8 にアップグレードしてください。 そして以下のコマンドを実行し、今後作成されるプールにトリミングが自動的に有効化され、現在未使用のスペースの全てがトリムされることを確認してください。

zpool upgrade ZPOOL-NAME
zpool set autotrim=on ZPOOL-NAME
zpool trim ZPOOL-NAME

制限#

zfs ドライバには以下の制限があります。

プールの一部を委譲する

ZFS はプールの一部をコンテナユーザに委譲することをサポートしていません。 ZFS のアップストリームではこの機能を提供すべくアクティブに作業中です。

古いスナップショットからの復元

ZFS は最新ではないスナップショットからの復元をサポートしていません。 ですが、古いスナップショットから新しいインスタンスを作成することはできます。 この方法は特定のスナップショットが必要なものを含んでいるかを確認することを可能にします。 正しいスナップショットを決定したら 指定より新しいスナップショットを削除 して必要なスナップショットが最新になるようにして復元できるようにします。

別の方法として、復元中により新しいスナップショットを自動的に破棄するように LXD を設定することもできます。 そのためにはボリュームの zfs.remove_snapshots (あるいはプール内の全てのボリュームのストレージプールの対応する volume.zfs.remove_snapshots 設定) を設定します。

しかし、 zfs.clone_copytrue に設定される場合は、インスタンスのコピーは ZFS のスナップショットも使用することに注意してください。 この場合は、スナップショットの全ての子孫を削除すること無しに、インスタンスを最後のコピーの前に取られたスナップショットに復元できません。 この選択肢が選べない場合、欲しいスナップショットを新しいインスタンスにコピーしてから古いインスタンスを削除することはできます。 しかし、インスタンスが持っていたであろう他の全てのスナップショットは失うことになります。

I/O クォータを観測する

I/O クォータは ZFS ファイルシステムに大きな影響は与えません。 これは ZFS は (SPL を使用した) Solaris モジュールの移植でありネイティブな Linux ファイルシステムではないためで、 I/O の制限はネイティブ Linux ファイルシステムに適用されるからです。

クォータ#

ZFS は quotarefquota という 2 種類の異なるクォータのプロパティを提供します。 quota はスナップショットとクローンを含むデータセットの合計サイズを制限します。 refquota はスナップショットとクローンは含まずデータセット内のデータのサイズだけを制限します。

デフォルトでは、ストレージボリュームにクォータを設定する際は LXD は quota プロパティを使用します。 代わりに refquota プロパティを使用したい場合はボリュームの zfs.use_refquota 設定 (あるいはプール内の全てのボリュームのストレージプールの対応する volume.zfs.use_refquota 設定) を設定します。

また zfs.use_reserve_space (または volume.zfs.use_reserve_space) 設定を to use ZFS の reservation または refreservationquota または refquota と使用するために設定することもできます。

設定オプション#

zfs ドライバを使うストレージプールとこれらのプール内のストレージボリュームには以下の設定オプションが利用できます。

ストレージプール設定#

キー

デフォルト値

説明

size

string

自動 (空きディスクスペースの 20%, >= 5 GiB and <= 30 GiB)

ループベースのプールを作成する際のストレージプールのサイズ (バイト単位、接尾辞のサポートあり)

source

string

-

既存のブロックデバイスかループファイルか ZFS データセット/プールのパス

zfs.clone_copy

string

true

Boolean の文字列を指定した場合は ZFS のフル データセットコピーの代わりに軽量なクローンを使うかどうかを制御し、 rebase という文字列を指定した場合は初期イメージをベースにコピーします。

zfs.export

bool

true

アンマウントの実行中にzpoolのエクスポートを無効にする

zfs.pool_name

string

プールの名前

zpool 名

Tip

これらの設定に加えて、ストレージボリューム設定のデフォルト値を設定できます。 ストレージボリュームのデフォルト値を変更する を参照してください。

ストレージボリューム設定#

キー

条件

デフォルト値

説明

security.shifted

bool

カスタムボリューム

volume.security.shifted と同じか false

ID シフトオーバーレイを有効にする (複数の分離されたインスタンスによるアタッチを許可する)

security.unmapped

bool

カスタムボリューム

volume.security.unmapped と同じか false

ボリュームの ID マッピングを無効にする

size

string

適切なドライバ

volume.size と同じ

ストレージボリュームのサイズ/クォータ

snapshots.expiry

string

カスタムボリューム

volume.snapshots.expiry と同じ

スナップショットをいつ削除するかを制御 (1M 2H 3d 4w 5m 6y のような式を期待)

snapshots.pattern

string

カスタムボリューム

volume.snapshots.pattern と同じか snap%d

スナップショットの名前を表す Pongo2 テンプレート文字列 (スケジュールされたスナップショットと名前無しのスナップショットで使用) 1

snapshots.schedule

string

カスタムボリューム

snapshots.schedule と同じ

Cron 表記 (<minute> <hour> <dom> <month> <dow>)、またはスケジュールエイリアスのカンマ区切りリスト(@hourly, @daily, @midnight, @weekly, @monthly, @annually, @yearly)、または自動スナップショットを無効にする場合は空文字(デフォルト)

zfs.blocksize

string

ZFSドライバ

volume.zfs.blocksize と同じ

ZFSブロックのサイズを512~16MiBの範囲で指定します(2の累乗でなければなりません)。ブロックボリュームでは、より大きな値が設定されていても、最大値の128KiBが使用されます。

zfs.remove_snapshots

bool

ZFSドライバ

volume.zfs.remove_snapshots と同じか false

必要に応じてスナップショットを削除するかどうか

zfs.use_refquota

bool

ZFSドライバ

volume.zfs.use_refquota と同じか false

領域の quota の代わりに refquota を使うかどうか

zfs.reserve_space

bool

ZFS driver

volume.zfs.reserve_space と同じか false

qouta/refquota に加えて reservation/refreservation も使用するかどうか

ストレージバケット設定#

ローカルのストレージプールドライバでストレージバケットを有効にし、 S3 プロトコル経由でアプリケーションがバケットにアクセスできるようにするにはcore.storage_buckets_addressサーバ設定を調整する必要があります。

キー

条件

デフォルト値

説明

size

string

適切なドライバ

volume.size と同じ

ストレージバケットのサイズ/クォータ


1

snapshots.pattern オプションはスナップショット名をフォーマットする Pongo2 テンプレート文字列です。

スナップショット名にタイムスタンプを追加するには、Pongo2 コンテキスト変数 creation_date を使用します。 スナップショット名に使用できない文字を含まないようにテンプレート文字列をフォーマットするようにしてください。 例えば、 snapshots.pattern{{ creation_date|date:'2006-01-02_15-04-05' }} に設定し、作成日時を秒の制度まで落として、スナップショットを命名するようにします。

名前の衝突を防ぐ別の方法はパターン内に %d プレースホルダを使うことです。 最初のスナップショットでは、プレースホルダは 0 に置換されます。 後続のスナップショットでは、既存のスナップショットが考慮され、プレースホルダの位置の最大の数を見つけます。 この数が 1 増加されて新しい名前に使用されます。