ZFS - zfs

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

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

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

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

用語

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

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

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

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

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

Incus の zfs ドライバー

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

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

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

ZFS 0.8 以降の上で新しく作成されたすべてのプールで Incus はトリミングサポートを自動的に有効化します。 これはコントローラーによるより良いブロックの再利用を可能にすることで 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 は最新ではないスナップショットからの復元をサポートしていません。 ですが、古いスナップショットから新しいインスタンスを作成することはできます。 この方法は特定のスナップショットが必要なものを含んでいるかを確認することを可能にします。 正しいスナップショットを決定したら 指定より新しいスナップショットを削除 して必要なスナップショットが最新になるようにして復元できるようにします。

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

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

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

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

ZFS の機能サポート

idmap の使用や ZFS データセットの委任などの一部の機能には、ZFS 2.2 以上が必要なため、まだ広く利用できません。

クォータ

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

デフォルトでは、ストレージボリュームにクォータを設定する際は Incus は 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

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

Key: size
Type:

string

Default:

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

Scope:

local

source

既存のブロックデバイスかループファイルかZFSデータセット/プールのパス。複数のブロックデバイスは,で区切ります。ブロックデバイスをリストする際はvdevタイプを接頭辞として指定することもできます。vdevタイプを指定するにはvdevタイプとブロックデバイスの間に=記号を書きます(例、mirror=/dev/sda,/dev/sdb)。stripemirrorraidz1raidz2のみがvdevタイプとして使用できます。

Key: source
Type:

string

Default:
Scope:

local

source.wipe

ストレージプールを作成する前にsourceで指定されたブロックデバイスの中身を消去する

Key: source.wipe
Type:

bool

Default:

false

Scope:

local

zfs.clone_copy

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

Key: zfs.clone_copy
Type:

string

Default:

true

Scope:

global

zfs.export

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

Key: zfs.export
Type:

bool

Default:

true

Scope:

global

zfs.pool_name

zpoolの名前

Key: zfs.pool_name
Type:

string

Default:

プールの名前

Scope:

local

Tip

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

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

block.create_options

ボリュームをフォーマットする際にファイルシステム作成ツールに渡す追加のオプション

Key: block.create_options
Type:

string

Default:

volume.block.create_optionsと同じ

Condition:

コンテントタイプfilesystemのカスタムボリューム(zfs.block_modeが有効)

block.filesystem

ストレージボリュームのファイルシステム: btrfs, ext4 または xfs (未指定の場合 ext4)

Key: block.filesystem
Type:

string

Default:

volume.block.filesystemと同じ

Condition:

コンテントタイプfilesystemのカスタムボリューム(zfs.block_modeが有効)

block.mount_options

ブロックベースのファイルシステムボリュームのマウントオプション

Key: block.mount_options
Type:

string

Default:

volume.block.mount_optionsと同じ

Condition:

コンテントタイプfilesystemのカスタムボリューム(zfs.block_modeが有効)

initial.gid

インスタンス内のボリュームの所有者のGID

Key: initial.gid
Type:

int

Default:

volume.initial.gidと同じか0

Condition:

コンテントタイプfilesystemのカスタムボリューム

initial.mode

インスタンス内のボリュームのモード

Key: initial.mode
Type:

int

Default:

volume.initial.modeと同じか711

Condition:

コンテントタイプfilesystemのカスタムボリューム

initial.uid

インスタンス内のボリュームの所有者のUID

Key: initial.uid
Type:

int

Default:

volume.initial.uidと同じか0

Condition:

コンテントタイプfilesystemのカスタムボリューム

security.shared

複数のインスタンスでのボリュームの共有を有効にする

Key: security.shared
Type:

bool

Default:

volume.security.sharedと同じかfalse

Condition:

カスタムブロックボリューム

security.shifted

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

Key: security.shifted
Type:

bool

Default:

volume.security.shiftedと同じかfalse

Condition:

カスタムボリューム

security.unmapped

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

Key: security.unmapped
Type:

bool

Default:

volume.security.unmappedと同じかfalse

Condition:

カスタムボリューム

size

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

Key: size
Type:

string

Default:

volume.sizeと同じ

Condition:
snapshots.expiry

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

Key: snapshots.expiry
Type:

string

Default:

volume.snapshots.expiryと同じ

Condition:

カスタムボリューム

この値は新しく作ったスナップショットの有効期限を算出するのに使います。 スナップショットが作られた日時にこの値が加算され、結果のタイムスタンプがスナップショットの個別の有効期限として保管されます。 この値を変更しても、変更後に作られたスナップショットのみに影響します。既存のスナップショットの有効期限は変更されません。

サポートされる単位はS(秒)、M(分)、H(時)、d(日)、w(週)、m(月) and y(年)です。 Mが分を意味し、mが月であることに注意してください。 それぞれの単位は1度だけ指定でき、月と年は固定の日数ではなくカレンダーの月として計算されます。

snapshots.expiry.manual

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

Key: snapshots.expiry.manual
Type:

string

Default:

volume.snapshots.expiry.manualと同じ

Condition:

カスタムボリューム

この値は新しく作ったスナップショットの有効期限を算出するのに使います。 スナップショットが作られた日時にこの値が加算され、結果のタイムスタンプがスナップショットの個別の有効期限として保管されます。 この値を変更しても、変更後に作られたスナップショットのみに影響します。既存のスナップショットの有効期限は変更されません。

サポートされる単位はS(秒)、M(分)、H(時)、d(日)、w(週)、m(月) and y(年)です。 Mが分を意味し、mが月であることに注意してください。 それぞれの単位は1度だけ指定でき、月と年は固定の日数ではなくカレンダーの月として計算されます。

snapshots.pattern

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

Key: snapshots.pattern
Type:

string

Default:

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

Condition:

カスタムボリューム

snapshots.schedule

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

Key: snapshots.schedule
Type:

string

Default:

volume.snapshots.scheduleと同じ

Condition:

カスタムボリューム

zfs.block_mode

datasetよりもフォーマットしたzvolを使うかどうか(zfs.block_modeはカスタムストレージボリュームにのみ設定できます。インスタンスボリュームを含むプール内のすべてのストレージボリュームにZFSブロックモードを有効にするにはvolume.zfs.block_modeを使ってください)

Key: zfs.block_mode
Type:

bool

Default:

volume.zfs.block_modeと同じ

Condition:
zfs.blocksize

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

Key: zfs.blocksize
Type:

string

Default:

volume.zfs.blocksizeと同じ

Condition:
zfs.delegate

ZFSデータセットとそれに含まれるすべてを使用しているコンテナに移譲するかどうか。有効にするとコンテナ内でzfsコマンドが使えます

Key: zfs.delegate
Type:

bool

Default:

volume.zfs.delegateと同じ

Condition:

ZFS 2.2以上

zfs.remove_snapshots

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

Key: zfs.remove_snapshots
Type:

bool

Default:

volume.zfs.remove_snapshotsと同じかfalse

Condition:
zfs.reserve_space

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

Key: zfs.reserve_space
Type:

bool

Default:

volume.zfs.reserve_spaceと同じかfalse

Condition:
zfs.use_refquota

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

Key: zfs.use_refquota
Type:

bool

Default:

volume.zfs.use_refquotaと同じかfalse

Condition:

ストレージバケット設定

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

size

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

Key: size
Type:

string

Default:

volume.sizeと同じ

Condition:

適切なドライバー