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_thinpool を false に設定することで変更できます。
この場合、Incus はスナップショットでないすべてのストレージエンティティに "通常の" 論理ボリュームを使用します。
これは深刻なパフォーマンスの低下とディスクの空き容量の低下を lvm ドライバーに必然的にもたらすことに注意してください(スピードとストレージ使用量の両面で dir ドライバーに近くなります)。
この理由は thin pool でない論理ボリュームがスナップショットのスナップショットをサポートしないため、ほとんどのストレージ操作が rsync の使用にフォールバックするためです。
さらに、 thin でないスナップショットは作成時に最大のサイズのストレージを予約しなければならないため、 thin スナップショットよりもはるかに大容量のストレージを使用するからです。
このため、このオプションはどうしても必要なユースケースの場合にのみ選択すべきです。
インスタンスの入れ替わりが激しい環境(たとえば、継続的インテグレーション)では、Incus の操作が遅くなるのを回避するため /etc/lvm/lvm.conf 内のバックアップの retain_min と retain_days 設定を調整すべきです。
Incus の lvmcluster ドライバー¶
クラスタ内で使用できる第 2 の lvmcluster が利用可能です。
これは lvmlockd と sanlock デーモンに依存し、共有されたディスクや一組のディスクについての分散ロックを提供します。
これは LVM ストレージプールのバッキングとして FiberChannel LUN、 NVMEoF/NVMEoTCP ディスク、iSCSI ドライブのようなリモートの共有されたブロックデバイスを使用可能にします。
注釈
Thin provisioning はクラスタ LVM とは互換性がないので、ディスク使用量が増えます。
これを Incus で使うには、以下が必要です:
全てのクラスタメンバーに共有されたブロックデバイスを用意する
lvm、lvmlockd、sanlockに必要なパッケージをインストールする/etc/lvm/lvm.conf内でuse_lvmlockd = 1と設定しlvmlockdを有効にする/etc/lvm/lvmlocal.conf内に (クラスタ内で) ユニークなhost_idの値を設定するlvmlockdとsanlockデーモンの両方を稼働する
警告
lvmclusterには以下の制限があります:
共有されたカスタムストレージボリュームのスナップショットはサポートされません。
rawブロックボリュームのスナップショットはサポートされません。
rawカスタムボリュームのみがsecurity.sharedオプションをサポートします。
設定オプション¶
lvm ドライバーを使うストレージプールとこれらのプール内のストレージボリュームには以下の設定オプションが利用できます。
ストレージプール設定¶
| Key: | lvm.metadata_size |
| Type: | string |
| Default: |
|
| Scope: | global |
| Key: | lvm.thinpool_metadata_size |
| Type: | string |
| Default: |
|
| Scope: | global |
| Key: | lvm.thinpool_name |
| Type: | string |
| Default: |
|
| Scope: | local |
| Key: | lvm.use_thinpool |
| Type: | bool |
| Default: |
|
| Scope: | global |
| Key: | lvm.vg.force_reuse |
| Type: | bool |
| Default: |
|
| Scope: | local |
| Key: | size |
| Type: | string |
| Default: |
|
| Scope: | local |
| Key: | source.wipe |
| Type: | bool |
| Default: |
|
| Scope: | local |
Tip
これらの設定に加えて、ストレージボリューム設定のデフォルト値を設定できます。 ストレージボリュームのデフォルト値を変更する を参照してください。
ストレージボリューム設定¶
| Key: | block.create_options |
| Type: | string |
| Default: |
|
| Condition: | コンテントタイプ |
| Key: | block.filesystem |
| Type: | string |
| Default: |
|
| Condition: | コンテントタイプ |
| Key: | block.mount_options |
| Type: | string |
| Default: |
|
| Condition: | コンテントタイプ |
| Key: | initial.gid |
| Type: | int |
| Default: |
|
| Condition: | コンテントタイプ |
| Key: | initial.mode |
| Type: | int |
| Default: |
|
| Condition: | コンテントタイプ |
| Key: | initial.uid |
| Type: | int |
| Default: |
|
| Condition: | コンテントタイプ |
| Key: | lvm.stripes |
| Type: | string |
| Default: |
|
| Condition: |
| Key: | lvm.stripes.size |
| Type: | string |
| Default: |
|
| Condition: |
| Key: | lvmcluster.remove_snapshots |
| Type: | bool |
| Default: |
|
| Condition: |
| Key: | security.shifted |
| Type: | bool |
| Default: |
|
| Condition: | カスタムボリューム |
| Key: | security.unmapped |
| Type: | bool |
| Default: |
|
| Condition: | カスタムボリューム |
| Key: | snapshots.expiry |
| Type: | string |
| Default: |
|
| Condition: | カスタムボリューム |
この値は新しく作ったスナップショットの有効期限を算出するのに使います。 スナップショットが作られた日時にこの値が加算され、結果のタイムスタンプがスナップショットの個別の有効期限として保管されます。 この値を変更しても、変更後に作られたスナップショットのみに影響します。既存のスナップショットの有効期限は変更されません。
サポートされる単位はS(秒)、M(分)、H(時)、d(日)、w(週)、m(月) and y(年)です。
Mが分を意味し、mが月であることに注意してください。
それぞれの単位は1度だけ指定でき、月と年は固定の日数ではなくカレンダーの月として計算されます。
| Key: | snapshots.expiry.manual |
| Type: | string |
| Default: |
|
| Condition: | カスタムボリューム |
この値は新しく作ったスナップショットの有効期限を算出するのに使います。 スナップショットが作られた日時にこの値が加算され、結果のタイムスタンプがスナップショットの個別の有効期限として保管されます。 この値を変更しても、変更後に作られたスナップショットのみに影響します。既存のスナップショットの有効期限は変更されません。
サポートされる単位はS(秒)、M(分)、H(時)、d(日)、w(週)、m(月) and y(年)です。
Mが分を意味し、mが月であることに注意してください。
それぞれの単位は1度だけ指定でき、月と年は固定の日数ではなくカレンダーの月として計算されます。
| Key: | snapshots.pattern |
| Type: | string |
| Default: |
|
| Condition: | カスタムボリューム |
snapshots.scheduleCron 表記 (<minute> <hour> <dom> <month> <dow>)、またはスケジュールエイリアスのカンマ区切りリスト(@hourly, @daily, @midnight, @weekly, @monthly, @annually, @yearly)、または自動スナップショットを無効にする場合は空文字(デフォルト)
| Key: | snapshots.schedule |
| Type: | string |
| Default: |
|
| Condition: | カスタムボリューム |
ローカルのストレージプールドライバーでストレージバケットを有効にし、 S3 プロトコル経由でアプリケーションがバケットにアクセスできるようにするにはcore.storage_buckets_addressサーバー設定を調整する必要があります。