LVM - lvm

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

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

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

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

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

Incus の lvm ドライバー

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

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

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

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

Incus の lvmcluster ドライバー

クラスタ内で使用できる第 2 の lvmcluster が利用可能です。

これは lvmlockdsanlock デーモンに依存し、共有されたディスクや一組のディスクについての分散ロックを提供します。

これは LVM ストレージプールのバッキングとして FiberChannel LUNNVMEoF/NVMEoTCP ディスク、iSCSI ドライブのようなリモートの共有されたブロックデバイスを使用可能にします。

注釈

Thin provisioning はクラスタ LVM とは互換性がないので、ディスク使用量が増えます。

これを Incus で使うには、以下が必要です:

  • 全てのクラスタメンバーに共有されたブロックデバイスを用意する

  • lvmlvmlockdsanlock に必要なパッケージをインストールする

  • /etc/lvm/lvm.conf 内で use_lvmlockd = 1 と設定し lvmlockd を有効にする

  • /etc/lvm/lvmlocal.conf 内に (クラスタ内で) ユニークな host_id の値を設定する

  • lvmlockdsanlock デーモンの両方を稼働する

警告

lvmclusterには以下の制限があります:

  • 共有されたカスタムストレージボリュームのスナップショットはサポートされません。

  • rawブロックボリュームのスナップショットはサポートされません。

  • rawカスタムボリュームのみがsecurity.sharedオプションをサポートします。

設定オプション

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

ストレージプール設定

block.type

ブロックボリュームのタイプ

Key: block.type
Default:

volume.block.typeと同じ

Condition:

ブロックベースのボリューム

lvm.metadata_size

物理ボリュームのメタデータ空間のサイズ

Key: lvm.metadata_size
Type:

string

Default:

0 (自動)

Scope:

global

lvm.thinpool_metadata_size

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

Key: lvm.thinpool_metadata_size
Type:

string

Default:

0 (自動)

Scope:

global

lvm.thinpool_name

ボリュームが作成されるthin pool名。lvmclusterでは使用不可。

Key: lvm.thinpool_name
Type:

string

Default:

IncusThinPool

Scope:

local

lvm.use_thinpool

ストレージプールは論理ボリュームにthin poolを使うかどうか。lvmclusterでは使用不可。

Key: lvm.use_thinpool
Type:

bool

Default:

true

Scope:

global

lvm.vg.force_reuse

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

Key: lvm.vg.force_reuse
Type:

bool

Default:

false

Scope:

local

lvm.vg_name

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

Key: lvm.vg_name
Type:

string

Default:

プールの名前

Scope:

local

size

ストレージプールのサイズ (バイト単位、接尾辞のサポートあり、増やすとストレージプールのサイズを拡大)。lvmclusterでは作成時は指定できませんが、更新はできます。

Key: size
Type:

string

Default:

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

Scope:

local

source

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

Key: source
Type:

string

Default:
Scope:

local

source.wipe

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

Key: source.wipe
Type:

bool

Default:

false

Scope:

local

Tip

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

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

block.create_options

ボリュームをフォーマットする際にファイルシステム作成ツールに渡す追加のオプション

Key: block.create_options
Type:

string

Default:

volume.block.create_optionsと同じ

Condition:

コンテントタイプfilesystemのブロックベースのボリューム

block.filesystem

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

Key: block.filesystem
Type:

string

Default:

volume.block.filesystemと同じ

Condition:

コンテントタイプfilesystemのブロックベースのボリューム

block.mount_options

ブロックベースのファイルシステムボリュームのマウントオプション

Key: block.mount_options
Type:

string

Default:

volume.block.mount_optionsと同じ

Condition:

コンテントタイプfilesystemのブロックベースのボリューム

initial.gid

インスタンス内のボリュームの所有者のGID

Key: initial.gid
Type:

int

Default:

volume.initial.gidと同じか0

Condition:

コンテントタイプfilesystemのカスタムボリューム

initial.mode

インスタンス内のボリュームのモード

Key: initial.mode
Type:

int

Default:

volume.initial.modeと同じか711

Condition:

コンテントタイプfilesystemのカスタムボリューム

initial.uid

インスタンス内のボリュームの所有者のUID

Key: initial.uid
Type:

int

Default:

volume.initial.uidと同じか0

Condition:

コンテントタイプfilesystemのカスタムボリューム

lvm.stripes

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

Key: lvm.stripes
Type:

string

Default:

volume.lvm.stripesと同じ

Condition:
lvm.stripes.size

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

Key: lvm.stripes.size
Type:

string

Default:

volume.lvm.stripes.sizeと同じ

Condition:
lvmcluster.remove_snapshots

スナップショットを必要に応じて削除

Key: lvmcluster.remove_snapshots
Type:

bool

Default:

volume.lvmcluster.remove_snapshotsと同じかfalse

Condition:
security.shared

複数のインスタンスでのボリュームの共有を有効にする

Key: security.shared
Type:

bool

Default:

volume.security.sharedと同じかfalse

Condition:

カスタムブロックボリューム

security.shifted

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

Key: security.shifted
Type:

bool

Default:

volume.security.shiftedと同じかfalse

Condition:

カスタムボリューム

security.unmapped

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

Key: security.unmapped
Type:

bool

Default:

volume.security.unmappedと同じかfalse

Condition:

カスタムボリューム

size

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

Key: size
Type:

string

Condition:

default: same as volume.size

snapshots.expiry

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

Key: snapshots.expiry
Type:

string

Default:

volume.snapshots.expiryと同じ

Condition:

カスタムボリューム

この値は新しく作ったスナップショットの有効期限を算出するのに使います。 スナップショットが作られた日時にこの値が加算され、結果のタイムスタンプがスナップショットの個別の有効期限として保管されます。 この値を変更しても、変更後に作られたスナップショットのみに影響します。既存のスナップショットの有効期限は変更されません。

サポートされる単位はS(秒)、M(分)、H(時)、d(日)、w(週)、m(月) and y(年)です。 Mが分を意味し、mが月であることに注意してください。 それぞれの単位は1度だけ指定でき、月と年は固定の日数ではなくカレンダーの月として計算されます。

snapshots.expiry.manual

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

Key: snapshots.expiry.manual
Type:

string

Default:

volume.snapshots.expiry.manualと同じ

Condition:

カスタムボリューム

この値は新しく作ったスナップショットの有効期限を算出するのに使います。 スナップショットが作られた日時にこの値が加算され、結果のタイムスタンプがスナップショットの個別の有効期限として保管されます。 この値を変更しても、変更後に作られたスナップショットのみに影響します。既存のスナップショットの有効期限は変更されません。

サポートされる単位はS(秒)、M(分)、H(時)、d(日)、w(週)、m(月) and y(年)です。 Mが分を意味し、mが月であることに注意してください。 それぞれの単位は1度だけ指定でき、月と年は固定の日数ではなくカレンダーの月として計算されます。

snapshots.pattern

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

Key: snapshots.pattern
Type:

string

Default:

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

Condition:

カスタムボリューム

snapshots.schedule

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

Key: snapshots.schedule
Type:

string

Default:

volume.snapshots.scheduleと同じ

Condition:

カスタムボリューム

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

size

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

Key: size
Type:

string

Default:

volume.sizeと同じ

Condition:

適切なドライバー