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_copyがtrueに設定される場合は、インスタンスのコピーは ZFS のスナップショットも使用することに注意してください。 この場合は、スナップショットのすべての子孫を削除すること無しに、インスタンスを最後のコピーの前に取られたスナップショットに復元できません。 この選択肢が選べない場合、欲しいスナップショットを新しいインスタンスにコピーしてから古いインスタンスを削除することはできます。 しかし、インスタンスが持っていたであろう他のすべてのスナップショットは失うことになります。- I/O クォータを観測する
I/O クォータは ZFS ファイルシステムに大きな影響は与えません。 これは ZFS は (SPL を使用した) Solaris モジュールの移植でありネイティブな Linux ファイルシステムではないためで、 I/O の制限はネイティブ Linux ファイルシステムに適用されるからです。
- ZFS の機能サポート
idmap の使用や ZFS データセットの委任などの一部の機能には、ZFS 2.2 以上が必要なため、まだ広く利用できません。
クォータ¶
ZFS は quota と refquota という 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 または refreservation を quota または refquota と使用するために設定することもできます。
設定オプション¶
zfs ドライバーを使うストレージプールとこれらのプール内のストレージボリュームには以下の設定オプションが利用できます。
ストレージプール設定¶
| Key: | size |
| Type: | string |
| Default: | 自動(空きディスクスペースの 20%, >= 5 GiB and <= 30 GiB) |
| Scope: | local |
source既存のブロックデバイスかループファイルかZFSデータセット/プールのパス。複数のブロックデバイスは,で区切ります。ブロックデバイスをリストする際はvdevタイプを接頭辞として指定することもできます。vdevタイプを指定するにはvdevタイプとブロックデバイスの間に=記号を書きます(例、mirror=/dev/sda,/dev/sdb)。stripe、mirror、raidz1、raidz2のみがvdevタイプとして使用できます。
| Key: | source |
| Type: | string |
| Default: | |
| Scope: | local |
| Key: | source.wipe |
| Type: | bool |
| Default: |
|
| Scope: | local |
zfs.clone_copyBooleanの文字列を指定した場合はZFSのフルのrebaseという文字列を指定した場合は初期イメージをベースにコピーします
| Key: | zfs.clone_copy |
| Type: | string |
| Default: |
|
| Scope: | global |
Tip
これらの設定に加えて、ストレージボリューム設定のデフォルト値を設定できます。 ストレージボリュームのデフォルト値を変更する を参照してください。
ストレージボリューム設定¶
| Key: | block.create_options |
| Type: | string |
| Default: |
|
| Condition: | コンテントタイプ |
| Key: | block.filesystem |
| Type: | string |
| Default: |
|
| Condition: | コンテントタイプ |
| Key: | block.mount_options |
| Type: | string |
| Default: |
|
| Condition: | コンテントタイプ |
| Key: | initial.gid |
| Type: | int |
| Default: |
|
| Condition: | コンテントタイプ |
| Key: | initial.mode |
| Type: | int |
| Default: |
|
| Condition: | コンテントタイプ |
| Key: | initial.uid |
| Type: | int |
| Default: |
|
| Condition: | コンテントタイプ |
| Key: | security.shifted |
| Type: | bool |
| Default: |
|
| Condition: | カスタムボリューム |
| Key: | security.unmapped |
| Type: | bool |
| Default: |
|
| Condition: | カスタムボリューム |
| Key: | snapshots.expiry |
| Type: | string |
| Default: |
|
| Condition: | カスタムボリューム |
この値は新しく作ったスナップショットの有効期限を算出するのに使います。 スナップショットが作られた日時にこの値が加算され、結果のタイムスタンプがスナップショットの個別の有効期限として保管されます。 この値を変更しても、変更後に作られたスナップショットのみに影響します。既存のスナップショットの有効期限は変更されません。
サポートされる単位はS(秒)、M(分)、H(時)、d(日)、w(週)、m(月) and y(年)です。
Mが分を意味し、mが月であることに注意してください。
それぞれの単位は1度だけ指定でき、月と年は固定の日数ではなくカレンダーの月として計算されます。
| Key: | snapshots.expiry.manual |
| Type: | string |
| Default: |
|
| Condition: | カスタムボリューム |
この値は新しく作ったスナップショットの有効期限を算出するのに使います。 スナップショットが作られた日時にこの値が加算され、結果のタイムスタンプがスナップショットの個別の有効期限として保管されます。 この値を変更しても、変更後に作られたスナップショットのみに影響します。既存のスナップショットの有効期限は変更されません。
サポートされる単位はS(秒)、M(分)、H(時)、d(日)、w(週)、m(月) and y(年)です。
Mが分を意味し、mが月であることに注意してください。
それぞれの単位は1度だけ指定でき、月と年は固定の日数ではなくカレンダーの月として計算されます。
| Key: | snapshots.pattern |
| Type: | string |
| Default: |
|
| Condition: | カスタムボリューム |
snapshots.scheduleCron 表記 (<minute> <hour> <dom> <month> <dow>)、またはスケジュールエイリアスのカンマ区切りリスト(@hourly, @daily, @midnight, @weekly, @monthly, @annually, @yearly)、または自動スナップショットを無効にする場合は空文字(デフォルト)
| Key: | snapshots.schedule |
| Type: | string |
| Default: |
|
| Condition: | カスタムボリューム |
zfs.block_modezvolを使うかどうか(zfs.block_modeはカスタムストレージボリュームにのみ設定できます。インスタンスボリュームを含むプール内のすべてのストレージボリュームにZFSブロックモードを有効にするにはvolume.zfs.block_modeを使ってください)
| Key: | zfs.block_mode |
| Type: | bool |
| Default: |
|
| Condition: |
zfs.blocksizeZFSブロックのサイズを512バイト~16MiBの範囲で指定します(2の累乗でなければなりません)。ブロックボリュームでは、より大きな値が設定されていても、最大値の128KiBが使用されます
| Key: | zfs.blocksize |
| Type: | string |
| Default: |
|
| Condition: |
| Key: | zfs.delegate |
| Type: | bool |
| Default: |
|
| Condition: | ZFS 2.2以上 |
| Key: | zfs.remove_snapshots |
| Type: | bool |
| Default: |
|
| Condition: |
| Key: | zfs.reserve_space |
| Type: | bool |
| Default: |
|
| Condition: |
| Key: | zfs.use_refquota |
| Type: | bool |
| Default: |
|
| Condition: |
ストレージバケット設定¶
ローカルのストレージプールドライバーでストレージバケットを有効にし、 S3 プロトコル経由でアプリケーションがバケットにアクセスできるようにするにはcore.storage_buckets_addressサーバー設定を調整する必要があります。