LVM2でのLVMスナップショットの管理

LVMスナップショット

ここでは、より高度なLVM2トピックを見始めます。 次のブログでは、LVMでのシンプロビジョニングについて見ていきます。 LVMスナップショットは、LVM論理ボリュームのポイント-イン-タイム-コピーです。 これらは、データの格納を開始しないという点でスペース効果的ですが、ソースLVでデータがchengedされると、orignalデータがLVMスナップショットボリュームに書き込まれます。 このユースケースには次のものがあります:

  • バックアップ: LVMスナップショット自体は、同じボリュームグループ内に格納する必要があるため、効率的なバックアップではありません。 ただし、スナップショットを使用してバックアップを拡張できます。 ターゲットボリュームのスナップショットを作成し、スナップショットボリュームをバックアップするだけで、バックアップ中のファイルの同時実行に関す スナップショットは、バックアッププロセスの最後に削除できます
  • テストと破棄:LVMスナップショットは、元のLVの読み取り/書き込みコピーです。 複雑なスクリプトを含むLVのLVMスナップショットを作成し、必要なだけansdテストを変更し、終了したらデータを破棄することができます。 すべての元のスクリプトに影響を与えずに。
  • 新しいソフトウェア展開のテスト:新しいバージョンのソフトウェアのインストールには、多くのソフトウェアディレクトリを介して配置された数百 すべてのソフトウェアのターゲットの場所が単一のLVM論理ボリューム上にある場合、ソフトウェアを更新する前にスナップショットを作成できます。 ソフトウェアをテストした後、所望の方法で機能していない場合。 元のLVをスナップショットに戻すのは簡単な作業です。 もちろん、スナップショットには、スナップショットが取得された時点での元のソースボリュームのその時点のコピーが保持されます。

以下のリンクに従って、£1.99のコストで”LinuxでLVM2への完全なガイド”をダウンロードしてください! それがダウンロードされればeBookは必要であれば印刷することができる。

download eBook

LVMスナップショットを作成する準備

LVMスナップショットは、ソースLVと同じボリュームグループに作成する必要があります。 CoW(Copy on Write)技術を使用すると、基礎となるストレージは同じでなければなりません。 スナップショット内の変更されていないデータを元のLVソースから読み取ることができます。 ボリュームグループがいっぱいになっているので、既存の論理ボリュームを削除して、より小さなサイズに再作成します。 また、/mnt/originalと/mnt/snapの2つのマウントポイントも使用します。

この作業の後、lv1と呼ばれる新たにフォーマットされた論理ボリュームがある状況に戻りました。 これは現在、デモの目的で/mnt/originalにマウントされています。 ボリュームグループvg1に392MiBの空き領域を残して、600MiBでlv1を作成しました。 論理ボリュームと同じボリュームグループ内の空き領域のみに関係していることに注意してください。 スナップショットは、ソースLVと同じボリュームグループに作成する必要があります。vgsコマンドの出力を確認すると、使用可能な空き領域が表示されます:

# vgs VG #PV #LV #SN Attr VSize VFree vg1 2 1 0 wz--n- 992.00m 392.00m vg2 2 0 0 wz--n- 192.00m 192.00m

このコマンドは、前に見たように、ボリュームグループを要約するのに最適な方法です。 論理ボリュームlv1のポイントインタイムスナップショットを作成できるようにするには、いくつかのデータを追加する必要があります。 単純に/etc/servicesファイルを/mnt/originalにコピーします。また、私のUbuntuサーバー上のこのファイルには612行があることもわかります。 私たちは今、データを持っているので、上のクラックしてみましょう。

LVM2でのLVMスナップショットの作成

LVMスナップショットは、本質的には、いくつかの余分なグッズがボルトで固定された単純な論理ボリュームです。 したがって、それらはlvcreateコマンドと–sオプションを使用して作成されます。 また、スナップショットを作成するときにソースボリュームを指定する必要があります。

 # lvcreate -L 12m -s /dev/vg1/lv1 -n lv1_snap Logical volume "lv1_snap" created.

コマンドオプションから、最初にサイズを12MiBに指定していることがわかります。 ソースに加えた変更を保存するのに十分なスペースだけが必要です。 ソースLVに600MiBのデータを入力することもできましたが、12MiBしか変更されない場合は、12MiBのスナップショットボリュームのみが必要です。 スナップショットのサイズは、発生する変更のサイズに合わせて調整します。 オプション–sまたは-snapshotは、スナップショットを作成するソースボリュームを指定します。 前と同じように、-nオプションは、作成するLVの名前を設定します。スナップショットは読み取り/書き込みなのでマウントできます。 先に進んで、/mnt/snapディレクトリにマウントしましょう:

# mount /dev/vg1/lv1_snap /mnt/snap/

変更が行われていなくても、両方のディレクトリで同じコンテンツを見ることができます。 LVMスナップショットは、変更されるまで元のデータにリンクします。

ソースボリュームとスナップショットボリュームの両方の詳細を見ると、少し違って見えます。 まず、lv1_snapボリューム。 スナップショットLV.

# lvdisplay /dev/vg1/lv1_snap --- Logical volume --- LV Path /dev/vg1/lv1_snap LV Name lv1_snap VG Name vg1 LV UUID s8gBiX-IV1z-jiZK-q4dN-paG5-8mvq-TCQkuk LV Write Access read/write LV Creation host, time yogi, 2017-08-22 09:26:14 +0000 LV snapshot status active destination for lv1 LV Status available # open 1 LV Size 600.00 MiB Current LE 150 COW-table size 12.00 MiB COW-table LE 3 Allocated to snapshot 0.36% Snapshot chunk size 4.00 KiB Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 252:3

私たちは12MiBのサイズでこれを作成したことを思い出します。 ただし、LVサイズは600MiBと表示されます。 スナップショットのサイズは、COW-tableサイズで表示されます。 コピーオンライトは、ソース内のデータが変更され、元のデータがスナップショットボリュームにコピーされるときに発生します。 スナップショットボリュームには、変更されているかどうかに関係なく、常に元のスナップショッ スナップショットの作成時には、格納するCoWの変更がないため、割り当てられた値は開始するのに非常に低く、ソースデータに変更が加えられると増加し 今、lv1LVの表示詳細を見ると、それも少し異なります:

# lvdisplay /dev/vg1/lv1 --- Logical volume --- LV Path /dev/vg1/lv1 LV Name lv1 VG Name vg1 LV UUID dmVaWm-kA9V-xouM-OZBR-b7Id-aMUh-EWymB0 LV Write Access read/write LV Creation host, time yogi, 2017-08-21 18:51:57 +0000 LV snapshot status source of lv1_snap LV Status available # open 1 LV Size 600.00 MiB Current LE 150 Segments 2 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 252:0

lv1_snapのスナップショットのソースとして表示されていることがわかります。

LVMスナップショットデータの変更

ソースボリューム内のデータを変更すると、スナップショットボリューム内のデータの違いが表示され始めます。 スナップショットボリュームは元のデータを保持し、ソースLVは変更を保持します。 まず、ソースボリュームに新しいファイルを追加します:

# cp /etc/hosts /mnt/original/

これで、ソースのコンテンツがsnaphotボリューム

と異なることがわかります。 Lv1_snapのlvdisplayに戻ると、割り当てられたスナップショットの割合が増加しています。

# lvdisplay /dev/vg1/lv1_snap --- Logical volume --- LV Path /dev/vg1/lv1_snap LV Name lv1_snap VG Name vg1 LV UUID s8gBiX-IV1z-jiZK-q4dN-paG5-8mvq-TCQkuk LV Write Access read/write LV Creation host, time yogi, 2017-08-22 09:26:14 +0000 LV snapshot status active destination for lv1 LV Status available # open 1 LV Size 600.00 MiB Current LE 150 COW-table size 12.00 MiB COW-table LE 3 Allocated to snapshot 0.98% Snapshot chunk size 4.00 KiB Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 252:3

既存のデータを変更していないにもかかわらず、新しいデータを追加すると、スナップショットボリュームはスナップショットが撮影されたときのデータを表示する必要があるため、スナップショットにも影響します。 必要に応じて、元のデータをsnapshottedデータに戻すことができます。

次に、元の/etc/servicesファイルを上書きします:

# > /mnt/original/services

ファイル/mnt/original/servicesは空になります。 しかし、スナップショットファイルをチェックすると、データが残っています。 コマンドwcを使用して、各ファイルの行数を数えることができます:

 # wc -l /mnt/original/services /mnt/snap/services 0 /mnt/original/services 612 /mnt/snap/services 612 total

もちろん、lv1_snapのlvdisplayの出力を再チェックすると、スナップショットに割り当てられた割合が変更に伴って増加していることが示されます:

Allocated to snapshot 1.17%

LVMスナップショットのボリュームの変更

スナップショットの作成時に、ソースとスナップショットLvの両方の属性が変更されます。 これはコマンドlvdisplayで詳細に見ることができますが、コマンドlvsでよりよく要約されています:

左から右に読み取る10の属性があります:

lv1の場合、読:

  • ボリュームタイプ:起源。 スナップショットのソース
  • 権限:書き込み可能
  • 割り当てポリシー:ボリュームグループから継承
  • 固定マイナー番号が設定されていません
  • 状態:アクテ1844>

Lv1_Snapの場合、属性が読み込まれます:

  • ボリュームタイプ:スナップショットボリューム
  • 権限:書き込み可能
  • 割り当てポリシー: ボリュームグループから継承
  • 固定マイナー番号が設定されていません
  • 状態:アクティブとしてマークされています
  • デバイス:開いているかマウントされています
  • ターゲットタイプ:スナップショット、すなわちスナップショットに参加しています

元のLvとターゲットLvは、すでに述べたのと同じボリュームグループにある必要がありますが、それらはこれらのボリュームグループ内で同じデバイスを共有する必要はありません。 これは通常、私たちから抽象化されていますが、lvsコマンドにオプションを追加することができます:

オプションと+デバイスに–oを追加すると、LVを構成する基礎となるデバイスが表示されます。lv1は/dev/sdc1または/dev/sdc2のいずれかより大きく、両方にまたがることがわかります。 一方、vg1_snapは/dev/sdc2の残りのスペースを利用できます。 デバイス名の後の括弧内の数字は、LVがデバイスから開始する物理エクステント番号を示します。 Lv1は/dev/sdc1と/dev/sdc2の両方でエクステント0から始まり、lv1_snapは/dev/sdc2のエクステント26から始まることがわかります。 –Oオプションで使用可能なすべてのオプションを表示するには、次のコマンドを使用します:

# lvs -o help

リストが広範囲であるため、出力は含まれていません。

論理ボリュームを直接見るだけでなく、lsblkコマンドを使用することもできます。 ここでは、おそらくあなたが思うよりも多くの変更が表示されます:

 # lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT loop1 7:1 0 100M 0 loop sdb 8:16 0 256M 0 disk loop0 7:0 0 100M 0 loop sdc 8:32 0 1000M 0 disk ├─sdc2 8:34 0 500M 0 part │ ├─vg1-lv1-real 252:1 0 600M 0 lvm │ │ ├─vg1-lv1 252:0 0 600M 0 lvm /mnt/original │ │ └─vg1-lv1_snap 252:3 0 600M 0 lvm /mnt/snap │ └─vg1-lv1_snap-cow 252:2 0 12M 0 lvm │ └─vg1-lv1_snap 252:3 0 600M 0 lvm /mnt/snap └─sdc1 8:33 0 499M 0 part └─vg1-lv1-real 252:1 0 600M 0 lvm ├─vg1-lv1 252:0 0 600M 0 lvm /mnt/original └─vg1-lv1_snap 252:3 0 600M 0 lvm /mnt/snap sda 8:0 0 9.8G 0 disk /

すでにvg1-lv1デバイスとvg1-lv1_snapデバイスに精通しています。 これらは、私たちが取り組んできた基礎となるLVsでした。 LVM2で使用されるカーネルメジャー番号またはドライバは252です。 だから、我々は我々が所定の位置に持っているすべてのLVsのためにこれを参照してください。 最初のLVはvg1-lv1だったので、これは0のマイナー番号を持っています。 しかし、vg1-lv1_snapを見ると、これには3のマイナー番号があり、4番目のLVであり、2番目のLVではないことを示しています。 代わりに、スナップショット用にvg1-lv1-realとvg1-lv1_snap-cowの2つのラッパー Lvが作成されます。 これらは内部的に管理されており、lvm2がsnapshottingプロセスを管理するために使用するこれらのオブジェクトには関与しません。 ここに表示されている各LVには、対応するdevmapperデバイスもあります。 Dm-*に/devディレクトリとファイラーをリストすると、これらを表示できます。

# ls /dev/dm-* /dev/dm-0 /dev/dm-1 /dev/dm-2 /dev/dm-3

再び。 私たちは期待していたかもしれない4つのデバイスだけでなく、2つのデバイスを見ています。 だから、バックグラウンドでLVM2は私たちのために多くのことを管理し、私たちが必要とする要素にのみアクセスできるようにしています。

ボリュームをスナップショットに戻す

LVMスナップショットを使用したリカバリシナリオでは、スナップショットに戻すことができます。元のLVをポイントインタイムスナップショットに戻す必要があることがわかった場合は、そうすることができます。 スナップショットは、スナップショットの時点で元のボリュームを表していることに注意してください。 ソフトウェアアップグレードがテストされ、ソフトウェアアップグレードプロセスの前に撮影されたはずのスナップショットに戻す決定が行われた後、これを行うことがあります。 これをリアルタイムで確認できるようにするために、最初に両方のLvをアンマウントします:

# umount /mnt/{original,snap}

デバイスを閉じない場合は、元のLV、vg1が次に有効になるまで待つ必要があります。 多くの場合、これは再起動時です。 論理ボリュームの両方がアンマウントされて閉じられた状態で、lvconvertコマンドを使用してスナップショットを親またはオリジンとマージします。 これは、ソース論理ボリュームをスナップショットの内容に戻しています。 スナップショットは、プロセスの終了時に自動的に削除されます。

# lvconvert --merge /dev/vg1/lv1_snap Merging of volume lv1_snap started. lv1: Merged: 99.2% lv1: Merged: 100.0%

マージするデータのサイズとディスクの速度によっては、これに時間がかかる可能性があります。 プロセスを背景にするには、–bオプションを使用します。

もう一度lv1をマウントして内容を確認してください。 スナップショットが取得された後に追加されたhostsファイルが欠落しています。 サービスファイルは、私たちは今、私たちはoverwroteコンテンツを持っています。

 # mount /dev/vg1/lv1 /mnt/original/ # ls /mnt/original/ lost+found services # wc -l /mnt/original/services 612 /mnt/original/services

テストと開発

LVMスナップショットの別の用途は、テスト環境での使用です。 Snapshottedデータを直接操作することを好む場合は、可能性があります。 終了したら、スナップショットLVをアンマウントして削除するだけです。 元の元のLVは変更されません。 これは、おそらく元の制作スクリプトに影響を与えずにスクリプトで作業したい場所に最適です。

プロセスはほとんど同じですが、今は/mnt/snapディレクトリだけで動作します。 コマンドの概要は次のとおりです:

スナップショットサイズの拡張

スナップショットボリュームを作成するときは、スナップショットが配置されている間に元のLVに加えられたすべての変更を保存するのに十分であると感じるサイズを設定する必要があります。 ただし、必要に応じてスナップショットボリュームを自動的に拡張することはできます。

スナップショットが完全にいっぱいになると、スナップショットは自動的に削除されることに注意することが重要です。

デフォルト設定では、スナップショットを自動的に拡大することはできません。 これを有効にする必要があります。 LVM2の設定は/etc/lvm/lvmにあります。コンフ… Grepを使用して効果的な設定を検索すると:

 # grep -E '^\s*snapshot_auto' /etc/lvm/lvm.conf snapshot_autoextend_threshold = 100 snapshot_autoextend_percent = 20

snapshot_autoextend_thresholdを100%に設定することは、スナップショットが成長しないことを意味します。 100%のしきい値に達するとすぐに、スナップショットは削除されます。 Autoextendを有効にする必要がある場合は、これを70のように設定することを検討してください。 この場合、スナップショットが70%フルになると、サイズが増加します。 Snapshot_autoexend_percentによって制御される増加のサイズ。 デフォルトは20%に設定されており、サイズが必要になるたびにサイズが現在のサイズの20%増加します。

Write a Comment

メールアドレスが公開されることはありません。