LVM - lvm#

LVM はファイルシステムというよりストレージマネージメントフレームワークです。 これは物理ストレージデバイスを管理するのに使用され、複数のストレージボリュームを作成し、配下の物理ストレージデバイスを使用し仮想化できるようにします。

この過程で物理ストレージをオーバーコミットすることが可能で、全ての利用可能なストレージが同時に使用されるわけではないシナリオに対して柔軟性を提供できることに注意してください。

LVM を使用するにはマシン上に lvm2 がインストールされていることを確認してください。

用語#

LVM は複数の物理ストレージデバイスを組み合わせて ボリュームグループ にすることができます。 その後このボリュームグループから異なるタイプの 論理ボリューム を割り当てることができます。

サポートされるボリュームタイプの 1 つに thin pool があります。これは許可された最大サイズの合計は利用可能な物理ストレージより大きいような薄くプロビジョンされたボリュームを作成することでリソースをオーバーコミットすることを可能にします。 別のタイプは ボリュームスナップショット でこれは論理ボリュームの特定の状態をキャプチャーします。

LXD の lvm ドライバ#

LXD の lvm ドライバはイメージに論理ボリュームを、インスタンスとスナップショットにボリュームスナップショットを使用します。

LXD はボリュームグループを完全制御できると想定しています。 このため、 LXD が所有しないファイルシステムエンティティは LXD が消してしまうかもしれないので、LVM ボリュームグループ内に置くべきではありません。 しかし、既存のボリュームグループを再利用する必要がある場合 (例えば、あなたの環境ではボリュームグループが 1 つしかない場合)、lvm.vg.force_reuse を設定することでこれは可能です。

デフォルトでは LVM ストレージプールは LVM thin pool を使用しその中に全ての LXD ストレージエンティティ (イメージ、インスタンス、カスタムボリューム) の論理ボリュームを作成します。 この挙動はプール作成時に lvm.use_thinpoolfalse に設定することで変更できます。 この場合、LXD はスナップショットでない全てのストレージエンティティに "通常の" 論理ボリュームを使用します。 これは深刻なパフォーマンスの低下とディスクの空き容量の低下を lvm ドライバに必然的にもたらすことに注意してください (スピードとストレージ使用量の両面で dir ドライバに近くなります)。 この理由は thin pool でない論理ボリュームがスナップショットのスナップショットをサポートしないため、ほとんどのストレージ操作が rsync の使用にフォールバックするためです。 さらに、 thin でないスナップショットは作成時に最大のサイズのストレージを予約しなければならないため、 thin スナップショットよりもはるかに大容量のストレージを使用するからです。 このため、このオプションはどうしても必要なユースケースの場合にのみ選択すべきです。

インスタンスの入れ替わりが激しい環境 (例えば、継続的インテグレーション) では、LXD の操作が遅くなるのを回避するため /etc/lvm/lvm.conf 内のバックアップの retain_minretain_days 設定を調整すべきです。

設定オプション#

lvm ドライバを使うストレージプールとこれらのプール内のストレージボリュームには以下の設定オプションが利用できます。

ストレージプール設定#

キー

デフォルト値

説明

lvm.thinpool_name

string

LXDThinPool

ボリュームが作成される thin pool

lvm.thinpool_metadata_size

string

0 (auto)

thin pool メタデータボリュームのサイズ (デフォルトは LVM が適切なサイズを計算)

lvm.use_thinpool

bool

true

ストレージプールは論理ボリュームに thin pool を使うかどうか

lvm.vg.force_reuse

bool

false

既存の空でないボリュームグループの使用を強制

lvm.vg_name

string

プールの名前

作成するボリュームグループ名

rsync.bwlimit

string

0 (no limit)

ストレージエンティティーの転送にrsyncを使う場合、ソケットI/Oに設定する上限を指定

rsync.compression

bool

true

ストレージプールをマイグレートする際に圧縮を使用するかどうか

size

string

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

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

source

string

-

既存のブロックデバイスかループファイルかLVMボリュームグループのパス

source.wipe

bool

false

ストレージプールを作成する前にsourceで指定されたブロックデバイスの中身を消去する

Tip

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

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

キー

条件

デフォルト値

説明

block.filesystem

string

volume.block.filesystem と同じ

ストレージボリュームのファイルシステム: btrfs, ext4 または xfs (未指定の場合 ext4)

block.mount_options

string

volume.block.mount_options と同じ

block-backedなファイルシステムボリュームのマウントオプション

lvm.stripes

string

volume.lvm.stripes と同じ

新しいボリューム (あるいは thin pool ボリューム) に使用するストライプ数

lvm.stripes.size

string

volume.lvm.stripes.size と同じ

使用するストライプのサイズ (最低 4096 バイトで 512 バイトの倍数を指定)

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 と同じ

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