Log Entry
LVM

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

背景

これまでRAIDとLVMを組み合わせた環境の構築や、RAIDの障害・構成ディスクの追加・削除を検証してきた。今回はLVMの機能であるスナップショットを対象に、作成からマウント、ロールバックまでの一連の操作を確認する。

検証目的

RAID上に作成したLVMに対してスナップショットを作成し、スナップショット情報の確認やマウントを行う。さらに元のLVMとスナップショットの間にデータの差分を発生させ、スナップショットが作成時点の状態を保持していることを確認する。最後にlvconvert --mergeで元のLVにロールバックできることも確認する。

構成

検証対象は、vg_labボリュームグループ上のlv_data(マウントポイント: /mnt/storage_lab)。

lsblk

lsblkで対象のLVMを確認

実装

  1. 対象のLVM(/mnt/storage_lab)にテスト用のデータをいくつか書き込む。

    for i in {1..10}; do
      sudo dd if=/dev/urandom of=/mnt/storage_lab/file_${i} bs=1M count=1
    done

    storage_lab配下に作成したテストファイル

  2. スナップショットに割り当てられる容量をdfvgsで確認する。特にvgsVFreeが十分に残っていることをチェックする。

    sudo vgs
    df -h /mnt/storage_lab/

    vgsとdfで空き容量を確認

  3. lvcreate -s -n -Lでスナップショットを作成する。

    sudo lvcreate -s -n lv-data-snapshot -L 500M /dev/vg_lab/lv_data

    lvcreateでスナップショットを作成

    作成したスナップショットはlvsで詳細を確認できる。Origin列に元のLVであるlv_dataが表示される。

    lvsでスナップショットの詳細を確認

動作確認

  1. スナップショット用のマウントポイントを作成し、読み取り専用でマウントする。

    sudo mkdir -p /mnt/snapshot
    sudo mount -o ro /dev/vg_lab/lv-data-snapshot /mnt/snapshot/
    lsblk -f

    スナップショットを読み取り専用でマウント

  2. 元のLVMからファイルを削除し、スナップショットとの差分を発生させる。

    sudo rm /mnt/storage_lab/file_1
    ls /mnt/storage_lab/
    ls /mnt/snapshot/

    元のLVMとスナップショットのファイル差分

    file_1/mnt/storage_labからは削除されているが、/mnt/snapshotにはスナップショット作成時点のファイルとして残っていることを確認できた。

  3. 元のLVMのファイルを上書きし、sha256sumでハッシュ値が異なることを確認する。

    sudo dd if=/dev/urandom of=/mnt/storage_lab/file_2 bs=10M count=10 conv=fsync
    sha256sum /mnt/storage_lab/file_2 /mnt/snapshot/file_2

    上書き後のsha256sumの差分

    同名のファイルであっても、元のLVMとスナップショットでハッシュ値が異なっており、スナップショット作成時点の内容が保持されていることが確認できた。

  4. 元のLVMとスナップショットをアンマウントし、lvconvert --mergeでスナップショットの内容を元のLVにロールバックする。

    sudo umount /mnt/storage_lab
    sudo umount /mnt/snapshot
    sudo lvconvert --merge /dev/vg_lab/lv-data-snapshot

    umount後にlvconvert –mergeでロールバック lvconvert –mergeの実行結果

    マージ中はロールバック対象のLVが非アクティブになるため、lvdisplayで確認するとLV StatusNOT availableと表示される。

    マージ中はLV Statusがnot available

  5. lvchange -ayでロールバックしたLVを再度アクティブ化し、マウントできる状態に戻す。

    sudo lvchange -ay /dev/vg_lab/lv_data
    sudo lvdisplay

    lvchange -ayで再アクティブ化しLV Statusがavailableに

    再アクティブ化後、LV Statusavailableに戻り、再度マウントできる状態になったことを確認した。

ハマった点

  • スナップショット自体の容量が枯渇している場合、マウントポイントへのマウントが失敗する。

学んだこと

  • lvcreate -sでLVMのスナップショットを作成すると、lvsOrigin列に元のLVが表示され、両者の関係が確認できる
  • スナップショットは作成時点のデータをCOW(Copy-on-Write)で保持しており、元のLVに対する削除・上書きの影響を受けない
  • lvconvert --mergeでスナップショットの内容を元のLVにロールバックできるが、マージ中は対象のLVが一時的に非アクティブになる
  • マージ完了後はlvchange -ayで明示的に再アクティブ化しないと、LVをマウントできる状態に戻らない

次の課題

  • TODO: 稼働中のLVに対してスナップショットを取得し、アプリケーションの整合性を保った状態でバックアップを取得できるか検証する