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_copy
がtrue
に設定される場合は、インスタンスのコピーは ZFS のスナップショットも使用することに注意してください。 この場合は、スナップショットの全ての子孫を削除すること無しに、インスタンスを最後のコピーの前に取られたスナップショットに復元できません。 この選択肢が選べない場合、欲しいスナップショットを新しいインスタンスにコピーしてから古いインスタンスを削除することはできます。 しかし、インスタンスが持っていたであろう他の全てのスナップショットは失うことになります。- I/O クォータを観測する
I/O クォータは ZFS ファイルシステムに大きな影響は与えません。 これは ZFS は (SPL を使用した) Solaris モジュールの移植でありネイティブな Linux ファイルシステムではないためで、 I/O の制限はネイティブ Linux ファイルシステムに適用されるからです。
クォータ#
ZFS は quota
と refquota
という 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
または refreservation
を quota
または refquota
と使用するために設定することもできます。
設定オプション#
zfs
ドライバを使うストレージプールとこれらのプール内のストレージボリュームには以下の設定オプションが利用できます。
ストレージプール設定#
キー |
型 |
デフォルト値 |
説明 |
---|---|---|---|
|
string |
自動 (空きディスクスペースの 20%, >= 5 GiB and <= 30 GiB) |
ループベースのプールを作成する際のストレージプールのサイズ (バイト単位、接尾辞のサポートあり、増やすとストレージプールのサイズを拡大) |
|
string |
- |
既存のブロックデバイスかループファイルか ZFS データセット/プールのパス |
|
bool |
|
ストレージプールを作成する前に |
|
string |
|
Boolean の文字列を指定した場合は ZFS のフル |
|
bool |
|
アンマウントの実行中にzpoolのエクスポートを無効にする |
|
string |
プールの名前 |
zpool 名 |
Tip
これらの設定に加えて、ストレージボリューム設定のデフォルト値を設定できます。 ストレージボリュームのデフォルト値を変更する を参照してください。
ストレージボリューム設定#
キー |
型 |
条件 |
デフォルト値 |
説明 |
---|---|---|---|---|
|
string |
|
|
ストレージボリュームのファイルシステム: |
|
string |
|
|
block-backedなファイルシステムボリュームのマウントオプション |
|
bool |
カスタムボリューム |
|
ID シフトオーバーレイを有効にする (複数の分離されたインスタンスによるアタッチを許可する) |
|
bool |
カスタムボリューム |
|
ボリュームの ID マッピングを無効にする |
|
string |
|
ストレージボリュームのサイズ/クォータ |
|
|
string |
カスタムボリューム |
|
スナップショットをいつ削除するかを制御 ( |
|
string |
カスタムボリューム |
|
スナップショットの名前を表す Pongo2 テンプレート文字列 (スケジュールされたスナップショットと名前無しのスナップショットで使用) [1] |
|
string |
カスタムボリューム |
|
Cron 表記 ( |
|
string |
|
ZFSブロックのサイズを512~16MiBの範囲で指定します(2の累乗でなければなりません)。ブロックボリュームでは、より大きな値が設定されていても、最大値の128KiBが使用されます。 |
|
|
bool |
|
|
|
|
bool |
|
必要に応じてスナップショットを削除するかどうか |
|
|
bool |
|
領域の |
|
|
bool |
|
|
ストレージバケット設定#
ローカルのストレージプールドライバでストレージバケットを有効にし、 S3 プロトコル経由でアプリケーションがバケットにアクセスできるようにするにはcore.storage_buckets_address
サーバー設定を調整する必要があります。
キー |
型 |
条件 |
デフォルト値 |
説明 |
---|---|---|---|---|
|
string |
適切なドライバ |
|
ストレージバケットのサイズ/クォータ |