Btrfs - btrfs#

BtrfsCOW 原則に基づいたローカルファイルシステムです。 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 ドライバを使うストレージプールとこれらのプール内のストレージボリュームには以下の設定オプションが利用できます。

ストレージプール設定#

キー

デフォルト値

説明

btrfs.mount_options

string

user_subvol_rm_allowed

ブロックデバイスのマウントオプション

size

string

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

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

Tip

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

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

キー

条件

デフォルト値

説明

security.shifted

bool

カスタムボリューム

volume.security.shifted と同じか false

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

security.unmapped

bool

カスタムボリューム

volume.security.unmapped と同じか false

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

size

string

適切なドライバ

volume.size と同じ

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

snapshots.expiry

string

カスタムボリューム

volume.snapshots.expiry と同じ

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

snapshots.pattern

string

カスタムボリューム

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

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

snapshots.schedule

string

カスタムボリューム

volume.snapshots.schedule と同じ

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

ストレージバケット設定#

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

キー

条件

デフォルト値

説明

size

string

適切なドライバ

volume.size と同じ

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


1

snapshots.pattern オプションはスナップショット名をフォーマットする Pongo2 テンプレート文字列です。

スナップショット名にタイムスタンプを追加するには、Pongo2 コンテキスト変数 creation_date を使用します。 スナップショット名に使用できない文字を含まないようにテンプレート文字列をフォーマットするようにしてください。 例えば、 snapshots.pattern{{ creation_date|date:'2006-01-02_15-04-05' }} に設定し、作成日時を秒の制度まで落として、スナップショットを命名するようにします。

名前の衝突を防ぐ別の方法はパターン内に %d プレースホルダを使うことです。 最初のスナップショットでは、プレースホルダは 0 に置換されます。 後続のスナップショットでは、既存のスナップショットが考慮され、プレースホルダの位置の最大の数を見つけます。 この数が 1 増加されて新しい名前に使用されます。