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 データセット/プールのパス |
|
string |
|
Boolean の文字列を指定した場合は ZFS のフル |
|
bool |
|
アンマウントの実行中にzpoolのエクスポートを無効にする |
|
string |
プールの名前 |
zpool 名 |
Tip
これらの設定に加えて、ストレージボリューム設定のデフォルト値を設定できます。 ストレージボリュームのデフォルト値を変更する を参照してください。
ストレージボリューム設定#
キー |
型 |
条件 |
デフォルト値 |
説明 |
---|---|---|---|---|
|
bool |
カスタムボリューム |
|
ID シフトオーバーレイを有効にする (複数の分離されたインスタンスによるアタッチを許可する) |
|
bool |
カスタムボリューム |
|
ボリュームの ID マッピングを無効にする |
|
string |
適切なドライバ |
|
ストレージボリュームのサイズ/クォータ |
|
string |
カスタムボリューム |
|
スナップショットをいつ削除するかを制御 ( |
|
string |
カスタムボリューム |
|
スナップショットの名前を表す Pongo2 テンプレート文字列 (スケジュールされたスナップショットと名前無しのスナップショットで使用) 1 |
|
string |
カスタムボリューム |
|
Cron 表記 ( |
|
string |
ZFSドライバ |
|
ZFSブロックのサイズを512~16MiBの範囲で指定します(2の累乗でなければなりません)。ブロックボリュームでは、より大きな値が設定されていても、最大値の128KiBが使用されます。 |
|
bool |
ZFSドライバ |
|
必要に応じてスナップショットを削除するかどうか |
|
bool |
ZFSドライバ |
|
領域の |
|
bool |
ZFS driver |
|
|
ストレージバケット設定#
ローカルのストレージプールドライバでストレージバケットを有効にし、 S3 プロトコル経由でアプリケーションがバケットにアクセスできるようにするにはcore.storage_buckets_address
サーバ設定を調整する必要があります。
キー |
型 |
条件 |
デフォルト値 |
説明 |
---|---|---|---|---|
|
string |
適切なドライバ |
|
ストレージバケットのサイズ/クォータ |
- 1
snapshots.pattern
オプションはスナップショット名をフォーマットする Pongo2 テンプレート文字列です。スナップショット名にタイムスタンプを追加するには、Pongo2 コンテキスト変数
creation_date
を使用します。 スナップショット名に使用できない文字を含まないようにテンプレート文字列をフォーマットするようにしてください。 例えば、snapshots.pattern
を{{ creation_date|date:'2006-01-02_15-04-05' }}
に設定し、作成日時を秒の制度まで落として、スナップショットを命名するようにします。名前の衝突を防ぐ別の方法はパターン内に
%d
プレースホルダを使うことです。 最初のスナップショットでは、プレースホルダは0
に置換されます。 後続のスナップショットでは、既存のスナップショットが考慮され、プレースホルダの位置の最大の数を見つけます。 この数が 1 増加されて新しい名前に使用されます。