58.8. 論理ボリュームのスナップショット
LVM スナップショット機能を使用すると、サービスを中断することなく、ある時点でのボリュームの仮想イメージ (/dev/sda など) を作成できます。
58.8.1. スナップショットボリュームの概要
スナップショットを作成した後で元のボリューム (スナップショットの元になるボリューム) を変更すると、スナップショット機能は、ボリュームの状態を再構築できるように、変更前の変更されたデータ領域のコピーを作成します。スナップショットを作成しても、作成元への完全な読み取り/書き込みのアクセスは引き続き可能です。
スナップショットは、スナップショットの作成後に変更したデータ部分のみをコピーするため、スナップショット機能に必要なストレージは最小限になります。たとえば、コピー元がほとんど更新されない場合は、作成元の 3 ~ 5 % の容量があれば十分にスナップショットを維持できます。バックアップ手順に代わるものではありません。スナップショットコピーは仮想コピーであり、実際のメディアバックアップではありません。
作成元のボリュームへの変更を保管するために確保する領域は、スナップショットのサイズによって異なります。たとえば、スナップショットを作成してから作成元を完全に上書きする場合に、その変更の保管に必要なスナップショットのサイズは、作成元のボリュームと同等か、それ以上になります。スナップショットのサイズは定期的に監視する必要があります。たとえば、/usr
など、その大部分が読み取り用に使用されるボリュームの短期的なスナップショットに必要な領域は、/home
のように大量の書き込みが行われるボリュームの長期的なスナップショットに必要な領域よりも小さくなります。
スナップショットが満杯になると、作成元のボリュームの変更を追跡できなくなるため、そのスナップショットは無効になります。ただし、スナップショットが無効になるのを防ぐために、使用量が snapshot_autoextend_threshold
値を超えるたびにスナップショットを自動的に拡張するように LVM を設定できます。スナップショットは完全にサイズ変更可能で、次の操作を実行できます。
- ストレージ容量に余裕がある場合は、スナップショットボリュームのサイズを大きくして、削除されないようにすることができます。
- スナップショットのボリュームサイズが必要以上に大きければ、そのボリュームのサイズを縮小して、他の論理ボリュームで必要となる領域を確保できます。
スナップショットボリュームには、次の利点があります。
- 最も一般的な用途は、継続的にデータを更新している稼動中のシステムを停止せずに、論理ボリューム上でバックアップを実行する必要がある場合にスナップショットを撮ることです。
-
スナップショットファイルシステムで
fsck
コマンドを実行し、ファイルシステムの整合性をチェックすれば、複製元のファイルシステムを修復する必要があるかどうかを判断できます。 - スナップショットは読み取りおよび書き込み用であるため、スナップショットを撮ってそのスナップショットにテストを実行することにより、実際のデータに触れることなく、実稼働データにアプリケーションのテストを実行できます。
- LVM ボリュームを作成して、Red Hat の仮想化と併用することが可能です。LVM スナップショットを使用して、仮想ゲストイメージのスナップショットを作成できます。このスナップショットは、最小限のストレージを使用して、既存のゲストの変更や新規ゲストの作成を行う上で利便性の高い方法を提供します。
58.8.2. コピーオンライトスナップショットの作成
作成時には、Copy-on-Write (COW) スナップショットにはデータが含まれません。代わりに、スナップショット作成時における元の LV のデータブロックを参照します。元のボリュームのデータが変更されると、COW システムは変更が行われる前に、元の変更されていないデータをスナップショットにコピーします。この方法では、変更が発生した場合にのみスナップショットのサイズが増加し、スナップショット作成時における元のボリュームの状態が保存されます。COW スナップショットは、短期間のバックアップやデータの変更が最小限の状況に効果的で、特定の時点をキャプチャーして復元するためのスペースを節約する方法を提供します。COW スナップショットを作成するときは、元のボリュームに予想される変更に基づいて、十分なストレージを割り当てます。
スナップショットを作成する前に、ストレージ要件とスナップショットの想定される有効期間を考慮することが重要です。スナップショットのサイズは、意図された有効期間中の変更をキャプチャーするのに十分な大きさである必要がありますが、元の LV のサイズを超えることはできません。変更頻度が低いと予想される場合は、10% - 15% の小さいスナップショットサイズで十分な場合があります。変更頻度が高い LV の場合は、30% 以上を割り当てる必要がある場合があります。
スナップショットのストレージ使用率を定期的に監視することが重要です。スナップショットに割り当てられている領域の 100% に達すると、スナップショットが無効になります。lvs
コマンドを使用してスナップショットに関する情報を表示できます。
スナップショットが完全にいっぱいになる前に拡張することが重要です。これは、lvextend
コマンドを使用して手動で実行できます。または、/etc/lvm/lvm.conf
ファイルで snapshot_autoextend_threshold
および snapshot_autoextend_percent
パラメーターを設定して自動拡張を設定することもできます。この設定により、dmeventd は
使用量が定義されたしきい値に達したときにスナップショットを自動的に拡張できるようになります。
COW スナップショットを使用すると、スナップショットが作成された時点のファイルシステムの読み取り専用バージョンにアクセスできます。これにより、元のファイルシステムで進行中の操作を中断することなく、バックアップやデータ分析が可能になります。スナップショットがマウントされ使用されている間も、元の論理ボリュームとそのファイルシステムは引き続き更新され、正常に使用できます。
次の手順では、ボリュームグループ vg001 から origin という名前の論理ボリュームを作成し、その snap という名前のスナップショットを作成する方法を説明します。
前提条件
- 管理アクセスがある。
- ボリュームグループが作成されている。詳細は、LVM ボリュームグループの作成 を参照してください。
手順
ボリュームグループ vg001 から、論理ボリューム origin を作成します。
# lvcreate -L 1G -n origin vg001
サイズが 100 MB の /dev/vg001/origin LV の snap という名前のスナップショットを作成します。
# lvcreate --size 100M --name snap --snapshot /dev/vg001/origin
元のボリュームと、使用されているスナップショットボリュームの現在の割合を表示します。
# lvs -a -o +devices LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices origin vg001 owi-a-s--- 1.00g /dev/sde1(0) snap vg001 swi-a-s--- 100.00m origin 0.00 /dev/sde1(256)
関連情報
-
システム上の
lvcreate (8)
、lvextend (8)
、およびlvs (8) の
man ページ -
/etc/lvm/lvm.conf
ファイル
58.8.3. スナップショットと元のボリュームのマージ
--merge
オプションを指定して lvconvert
コマンドを使用し、スナップショットを元のボリューム (作成元) にマージします。データやファイルを失った場合や、システムを以前の状態に復元する必要がある場合に、システムのロールバックを実行できます。スナップショットボリュームをマージすると、作成された論理ボリュームには、元のボリュームの名前、マイナー番号、および UUID が含まれます。マージの進行中、作成元に対する読み取りまたは書き込みは、マージ中のスナップショットに対して実行されているかのように見えます。マージが完了すると、マージされたスナップショットは削除されます。
作成元のボリュームとスナップショットボリュームの両方が起動されておらず、アクティブでない場合、マージはすぐに開始されます。それ以外の場合は、作成元またはスナップショットのいずれかがアクティブ化され、両方が閉じられた後にマージが開始されます。スナップショットを閉じることができない作成元 (root
ファイルシステムなど) にマージできるのは、作成元のボリュームがアクティブ化された後です。
手順
スナップショットボリュームをマージします。以下のコマンドは、スナップショットボリューム vg001/snap をその 作成元 にマージします。
# lvconvert --merge vg001/snap Merging of volume vg001/snap started. vg001/origin: Merged: 100.00%
元のボリュームを表示します。
# lvs -a -o +devices LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices origin vg001 owi-a-s--- 1.00g /dev/sde1(0)
関連情報
-
システム上の
lvconvert(8)
man ページ
58.8.4. snapshot RHEL システムロールを使用して LVM スナップショットを作成する
新しい snapshot
RHEL システムロールを使用すると、LVM スナップショットを作成できます。また、snapshot_lvm_action
パラメーターを check
に設定すると、このシステムロールにより、作成したスナップショットに十分な領域があるかどうか、名前が競合していないかどうかがチェックされます。作成したスナップショットをマウントするには、snapshot_lvm_action
を mount
に設定します。
次の例では、nouuid
オプションが設定されています。これは XFS ファイルシステムを扱う場合にのみ必要です。XFS では、同じ UUID を持つ複数のファイルシステムを同時にマウントすることはサポートされていません。
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
- 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
sudo
権限がある。
手順
次の内容を含む Playbook ファイル (例:
~/playbook.yml
) を作成します。--- - name: Run the snapshot system role hosts: managed-node-01.example.com vars: snapshot_lvm_set: name: snapset1 volumes: - name: data1 snapshot vg: data_vg lv: data1 percent_space_required: 25 mountpoint: /data1_snapshot options: nouuid mountpoint_create: true - name: data2 snapshot vg: data_vg lv: data2 percent_space_required: 25 mountpoint: /data2_snapshot options: nouuid mountpoint_create: true tasks: - name: Create a snapshot set ansible.builtin.include_role: name: rhel-system-roles.snapshot vars: snapshot_lvm_action: snapshot - name: Verify the set of snapshots for the LVs ansible.builtin.include_role: name: rhel-system-roles.snapshot vars: snapshot_lvm_action: check snapshot_lvm_verify_only: true - name: Mount the snapshot set ansible.builtin.include_role: name: rhel-system-roles.snapshot vars: snapshot_lvm_action: mount
この場合、
snapshot_lvm_set
パラメーターは、同じボリュームグループ (VG) からの特定の論理ボリューム (LV) を示しています。このパラメーターを設定する際に、異なる VG からの LV を指定することもできます。Playbook の構文を検証します。
$ ansible-playbook --syntax-check ~/playbook.yml
このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
$ ansible-playbook ~/playbook.yml
検証
管理対象ノードで、作成されたスナップショットを表示します。
# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert data1 data_vg owi-a-s--- 1.00g data1_snapset1 data_vg swi-a-s--- 208.00m data1 0.00 data2 data_vg owi-a-s--- 1.00g data2_snapset1 data_vg swi-a-s--- 208.00m data2 0.00
管理対象ノードで、/data1_snapshot と /data2_snapshot の存在を確認して、マウント操作が成功したかどうかを確認します。
# ls -al /data1_snapshot # ls -al /data2_snapshot
関連情報
-
/usr/share/ansible/roles/rhel-system-roles.snapshot/README.md
ファイル -
/usr/share/doc/rhel-system-roles/snapshot/
ディレクトリー
58.8.5. snapshot RHEL システムロールを使用して LVM スナップショットをアンマウントする
snapshot_lvm_action
パラメーターを umount
に設定することで、特定のスナップショットまたはすべてのスナップショットをアンマウントできます。
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
- 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
sudo
権限がある。 - スナップショットセットに <_snapset1_> という名前を使用してスナップショットを作成した。
-
snapshot_lvm_action
をmount
に設定してスナップショットをマウントしたか、手動でスナップショットをマウントした。
手順
次の内容を含む Playbook ファイル (例:
~/playbook.yml
) を作成します。特定の LVM スナップショットをアンマウントします。
--- - name: Unmount the snapshot specified by the snapset hosts: managed-node-01.example.com vars: snapshot_lvm_snapset_name: snapset1 snapshot_lvm_action: umount snapshot_lvm_vg: data_vg snapshot_lvm_lv: data2 snapshot_lvm_mountpoint: /data2_snapshot roles: - rhel-system-roles.snapshot
この場合、
snapshot_lvm_lv
パラメーターは特定の論理ボリューム (LV) を表し、snapshot_lvm_vg
パラメーターは特定のボリュームグループ (VG) を示しています。LVM スナップショットのセットをアンマウントします。
--- - name: Unmount a set of snapshots hosts: managed-node-01.example.com vars: snapshot_lvm_action: umount snapshot_lvm_set: name: snapset1 volumes: - name: data1 snapshot vg: data_vg lv: data1 mountpoint: /data1_snapshot - name: data2 snapshot vg: data_vg lv: data2 mountpoint: /data2_snapshot roles: - rhel-system-roles.snapshot
この場合、
snapshot_lvm_set
パラメーターは、同じ VG からの特定の LV を示しています。このパラメーターを設定する際に、異なる VG からの LV を指定することもできます。
Playbook の構文を検証します。
$ ansible-playbook --syntax-check ~/playbook.yml
このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
$ ansible-playbook ~/playbook.yml
関連情報
-
/usr/share/ansible/roles/rhel-system-roles.snapshot/README.md
ファイル -
/usr/share/doc/rhel-system-roles/snapshot/
ディレクトリー
58.8.6. snapshot RHEL システムロールを使用して LVM スナップショットを拡張する
新しい snapshot
RHEL システムロールを使用して、snapshot_lvm_action
パラメーターを extend
に設定することで、LVM スナップショットを拡張できるようになりました。snapshot_lvm_percent_space_required
パラメーターを、スナップショットを拡張した後に割り当てる必要な領域に設定できます。
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
- 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
sudo
権限がある。 - 特定のボリュームグループおよび論理ボリュームのスナップショットを作成した。
手順
次の内容を含む Playbook ファイル (例:
~/playbook.yml
) を作成します。percent_space_required
パラメーターの値を指定して、すべての LVM スナップショットを拡張します。--- - name: Extend all snapshots hosts: managed-node-01.example.com vars: snapshot_lvm_action: extend snapshot_lvm_set: name: snapset1 volumes: - name: data1 snapshot vg: data_vg lv: data1 percent_space_required: 40 - name: data2 snapshot vg: data_vg lv: data2 percent_space_required: 40 roles: - rhel-system-roles.snapshot
この場合、
snapshot_lvm_set
パラメーターは、同じ VG からの特定の LV を示しています。このパラメーターを設定する際に、異なる VG からの LV を指定することもできます。セット内の VG と LV のペアごとに
percent_space_required
を異なる値に設定して、LVM スナップショットセットを拡張します。--- - name: Extend the snapshot hosts: managed-node-01.example.com vars: snapshot_extend_set: name: snapset1 volumes: - name: data1 snapshot vg: data_vg lv: data1 percent_space_required: 30 - name: data2 snapshot vg: data_vg lv: data2 percent_space_required: 40 tasks: - name: Extend data1 to 30% and data2 to 40% vars: snapshot_lvm_set: "{{ snapshot_extend_set }}" snapshot_lvm_action: extend ansible.builtin.include_role: name: rhel-system-roles.snapshot
Playbook の構文を検証します。
$ ansible-playbook --syntax-check ~/playbook.yml
このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
$ ansible-playbook ~/playbook.yml
検証
管理対象ノードで、30% 拡張されたスナップショットを表示します。
# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert data1 data_vg owi-a-s--- 1.00g data1_snapset1 data_vg swi-a-s--- 308.00m data1 0.00 data2 data_vg owi-a-s--- 1.00g data2_snapset1 data_vg1 swi-a-s--- 408.00m data2 0.00
関連情報
-
/usr/share/ansible/roles/rhel-system-roles.snapshot/README.md
ファイル -
/usr/share/doc/rhel-system-roles/snapshot/
ディレクトリー
58.8.7. snapshot RHEL システムロールを使用して LVM スナップショットを元に戻す
新しい snapshot
RHEL システムロールを使用して、snapshot_lvm_action
パラメーターを revert
に設定することで、LVM スナップショットを元のボリュームに戻すことができます。
論理ボリュームとスナップショットボリュームの両方が開いておらずアクティブでない場合は、元に戻す操作がすぐに開始されます。そうでない場合は、元のボリュームまたはスナップショットがアクティブ化され、両方が閉じられた後に元に戻す操作が開始されます。
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
- 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
sudo
権限がある。 - スナップセット名として <_snapset1_> を使用して、特定のボリュームグループおよび論理ボリュームのスナップショットを作成した。
手順
次の内容を含む Playbook ファイル (例:
~/playbook.yml
) を作成します。特定の LVM スナップショットを元のボリュームに戻します。
--- - name: Revert a snapshot to its original volume hosts: managed-node-01.example.com vars: snapshot_lvm_snapset_name: snapset1 snapshot_lvm_action: revert snapshot_lvm_vg: data_vg snapshot_lvm_lv: data2 roles: - rhel-system-roles.snapshot
この場合、
snapshot_lvm_lv
パラメーターは特定の論理ボリューム (LV) を表し、snapshot_lvm_vg
パラメーターは特定のボリュームグループ (VG) を示しています。LVM スナップショットのセットを元のボリュームに戻します。
--- - name: Revert a set of snapshot hosts: managed-node-01.example.com vars: snapshot_lvm_action: revert snapshot_lvm_set: name: snapset1 volumes: - name: data1 snapshot vg: data_vg lv: data1 - name: data2 snapshot vg: data_vg lv: data2 roles: - rhel-system-roles.snapshot
この場合、
snapshot_lvm_set
パラメーターは、同じ VG からの特定の LV を示しています。このパラメーターを設定する際に、異なる VG からの LV を指定することもできます。注記revert
操作は、完了するまでに時間がかかる場合があります。
Playbook の構文を検証します。
$ ansible-playbook --syntax-check ~/playbook.yml
このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
$ ansible-playbook ~/playbook.yml
ホストを再起動するか、次の手順に従って論理ボリュームを非アクティブ化してから再アクティブ化します。
$ umount /data1; umount /data2 $ lvchange -an data_vg/data1 data_vg/data2 $ lvchange -ay data_vg/data1 data_vg/data2 $ mount /data1; mount /data2
検証
管理対象ノードで、元に戻したスナップショットを表示します。
# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert data1 data_vg -wi-a----- 1.00g data2 data_vg -wi-a----- 1.00g
関連情報
-
/usr/share/ansible/roles/rhel-system-roles.snapshot/README.md
ファイル -
/usr/share/doc/rhel-system-roles/snapshot/
ディレクトリー
58.8.8. snapshot RHEL システムロールを使用して LVM スナップショットを削除する
新しい snapshot
RHEL システムロールを使用して、スナップショットの接頭辞またはパターンを指定し、snapshot_lvm_action
パラメーターを remove
に設定することで、すべての LVM スナップショットを削除できます。
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
- 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
sudo
権限がある。 - スナップセット名として <_snapset1_> を使用して、特定のスナップショットを作成した。
手順
次の内容を含む Playbook ファイル (例:
~/playbook.yml
) を作成します。特定の LVM スナップショットを削除します。
--- - name: Remove a snapshot hosts: managed-node-01.example.com vars: snapshot_lvm_snapset_name: snapset1 snapshot_lvm_action: remove snapshot_lvm_vg: data_vg roles: - rhel-system-roles.snapshot
この場合、
snapshot_lvm_vg
パラメーターは、ボリュームグループ (VG) からの特定の論理ボリューム (LV) を示しています。LVM スナップショットのセットを削除します。
--- - name: Remove a set of snapshots hosts: managed-node-01.example.com vars: snapshot_lvm_action: remove snapshot_lvm_set: name: snapset1 volumes: - name: data1 snapshot vg: data_vg lv: data1 - name: data2 snapshot vg: data_vg lv: data2 roles: - rhel-system-roles.snapshot
この場合、
snapshot_lvm_set
パラメーターは、同じ VG からの特定の LV を示しています。このパラメーターを設定する際に、異なる VG からの LV を指定することもできます。
Playbook の構文を検証します。
$ ansible-playbook --syntax-check ~/playbook.yml
このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
$ ansible-playbook ~/playbook.yml
関連情報
-
/usr/share/ansible/roles/rhel-system-roles.snapshot/README.md
ファイル -
/usr/share/doc/rhel-system-roles/snapshot/
ディレクトリー