Btrfs - btrfs
#
Btrfs は COW 原則に基づいたローカルファイルシステムです。 COW はデータが修正された後に既存のデータを上書きするのではなく別のブロックに保管され、データ破壊のリスクが低くなることを意味します。 他のファイルシステムと異なり、Btrfs はエクステントベースです。これはデータを連続したメモリ領域に保管することを意味します。
基本的なファイルシステムの機能に加えて、Btrfs は RAID、ボリューム管理、プーリング、スナップショット、チェックサム、圧縮、その他の機能を提供します。
Btrfs を使うにはマシンに btrfs-progs
がインストールされているか確認してください。
用語#
Btrfs ファイルシステムはサブボリュームを持つことができます。これはファイルシステムのメインツリーの名前をつけられたバイナリサブツリーでそれ自身の独立したファイルとディレクトリ階層を持ちます。 Btrfs スナップショットは特殊なタイプのサブボリュームで別のサブボリュームの特定の状態をキャプチャーします。 スナップショットは読み書き可または読み取り専用にできます。
LXD の btrfs
ドライバ#
LXD の btrfs
ドライバはインスタンス、イメージ、スナップショットごとにサブボリュームを使用します。
新しいエンティティを作成する際 (例えば、新しいインスタンスを起動する)、 Btrfs スナップショットを作成します。
Btrfs はブロックデバイスの保管をネイティブにはサポートしていません。 このため、仮想マシンに Btrfs を使用する場合、 LXD は仮想マシンを格納するディスク上に巨大なファイルを作成します。 このアプローチはあまり効率的ではなく、スナップショット作成時に問題を引き起こすかもしれません。
Btrfs はネストした LXD 環境内のコンテナ内部でストレージバックエンドとして使用できます。 この場合、親のコンテナ自体は Btrfs を使う必要があります。 しかし、ネストした LXD のセットアップは親から Btrfs のクォータは引き継がないことに注意してください (以下の クォータ 参照)。
クォータ#
Btrfs は qgroups 経由でストレージクォータをサポートします。
Btrfs qgroups は階層的ですが、新しいサブボリュームは親のサブボリュームの qgroups に自動的に追加されるわけではありません。
これはユーザが設定されたクォータから逃れることができることは自明であることを意味します。
このため、厳密なクォータが必要な場合は、別のストレージドライバを検討すべきです (例えば、refquotas
ありの ZFS や LVM 上の Btrfs)。
クォータを使用する際は、 Btrfs のエクステントはイミュータブルであることを考慮に入れる必要があります。 ブロックが書かれると、それらは新しいエクステントに現れます。 古いエクステントはその上の全てのデータが参照されなくなるか上書きされるまで残ります。 これはサブボリューム内で現在存在するファイルで使用されている合計容量がクォータより小さい場合でもクォータに達することがあり得ることを意味します。
注釈
この問題は Btrfs 上で仮想マシンを使用する際にもっともよく発生します。これは Btrfs サブボリューム上に生のディスクイメージを使用する際のランダムな I/O の性質のためです。
このため、仮想マシンには Btrfs ストレージプールは決して使うべきではありません。
どうしても仮想マシンに Btrfs ストレージプールを使う必要がある場合、インスタンスのルートディスクの size.state
をルートディスクのサイズの2倍に設定してください。
この設定により、ディスクイメージファイルの全てのブロックが qgroup クォータに達すること無しに上書きできるようになります。
btrfs.mount_options=compress-force
ストレージプールオプションでもこのシナリオを回避できます。圧縮を有効にすることの副作用で最大のエクステントサイズを縮小しブロックの再書き込みが2倍のストレージを消費しないようになるからです。
しかし、これはストレージプールのオプションなので、プール上の全てのボリュームに影響します。
設定オプション#
btrfs
ドライバを使うストレージプールとこれらのプール内のストレージボリュームには以下の設定オプションが利用できます。
ストレージプール設定#
キー |
型 |
デフォルト値 |
説明 |
---|---|---|---|
|
string |
|
ブロックデバイスのマウントオプション |
|
string |
自動 (空きディスクスペースの 20%, >= 5 GiB and <= 30 GiB) |
ループベースのプールを作成する際のストレージプールのサイズ (バイト単位、接尾辞のサポートあり) |
Tip
これらの設定に加えて、ストレージボリューム設定のデフォルト値を設定できます。 ストレージボリュームのデフォルト値を変更する を参照してください。
ストレージボリューム設定#
キー |
型 |
条件 |
デフォルト値 |
説明 |
---|---|---|---|---|
|
bool |
カスタムボリューム |
|
ID シフトオーバーレイを有効にする (複数の分離されたインスタンスによるアタッチを許可する) |
|
bool |
カスタムボリューム |
|
ボリュームへの id マッピングを無効にする |
|
string |
適切なドライバ |
|
ストレージボリュームのサイズ/クォータ |
|
string |
カスタムボリューム |
|
スナップショットをいつ削除するかを制御 ( |
|
string |
カスタムボリューム |
|
スナップショットの名前を表す Pongo2 テンプレート文字列 (スケジュールされたスナップショットと名前無しのスナップショットで使用) 1 |
|
string |
カスタムボリューム |
|
Cron 表記 ( |
ストレージバケット設定#
ローカルのストレージプールドライバでストレージバケットを有効にし、 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 増加されて新しい名前に使用されます。