LVMのスナップショットを作成する
背景
これまでRAIDとLVMを組み合わせた環境の構築や、RAIDの障害・構成ディスクの追加・削除を検証してきた。今回はLVMの機能であるスナップショットを対象に、作成からマウント、ロールバックまでの一連の操作を確認する。
検証目的
RAID上に作成したLVMに対してスナップショットを作成し、スナップショット情報の確認やマウントを行う。さらに元のLVMとスナップショットの間にデータの差分を発生させ、スナップショットが作成時点の状態を保持していることを確認する。最後にlvconvert --mergeで元のLVにロールバックできることも確認する。
構成
検証対象は、vg_labボリュームグループ上のlv_data(マウントポイント: /mnt/storage_lab)。
lsblk

実装
-
対象の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
-
スナップショットに割り当てられる容量を
dfとvgsで確認する。特にvgsのVFreeが十分に残っていることをチェックする。sudo vgs df -h /mnt/storage_lab/
-
lvcreate -s -n -Lでスナップショットを作成する。sudo lvcreate -s -n lv-data-snapshot -L 500M /dev/vg_lab/lv_data
作成したスナップショットは
lvsで詳細を確認できる。Origin列に元のLVであるlv_dataが表示される。
動作確認
-
スナップショット用のマウントポイントを作成し、読み取り専用でマウントする。
sudo mkdir -p /mnt/snapshot sudo mount -o ro /dev/vg_lab/lv-data-snapshot /mnt/snapshot/ lsblk -f
-
元のLVMからファイルを削除し、スナップショットとの差分を発生させる。
sudo rm /mnt/storage_lab/file_1 ls /mnt/storage_lab/ ls /mnt/snapshot/
file_1は/mnt/storage_labからは削除されているが、/mnt/snapshotにはスナップショット作成時点のファイルとして残っていることを確認できた。 -
元の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
同名のファイルであっても、元のLVMとスナップショットでハッシュ値が異なっており、スナップショット作成時点の内容が保持されていることが確認できた。
-
元のLVMとスナップショットをアンマウントし、
lvconvert --mergeでスナップショットの内容を元のLVにロールバックする。sudo umount /mnt/storage_lab sudo umount /mnt/snapshot sudo lvconvert --merge /dev/vg_lab/lv-data-snapshot

マージ中はロールバック対象のLVが非アクティブになるため、
lvdisplayで確認するとLV StatusがNOT availableと表示される。
-
lvchange -ayでロールバックしたLVを再度アクティブ化し、マウントできる状態に戻す。sudo lvchange -ay /dev/vg_lab/lv_data sudo lvdisplay
再アクティブ化後、
LV Statusがavailableに戻り、再度マウントできる状態になったことを確認した。
ハマった点
- スナップショット自体の容量が枯渇している場合、マウントポイントへのマウントが失敗する。
学んだこと
lvcreate -sでLVMのスナップショットを作成すると、lvsのOrigin列に元のLVが表示され、両者の関係が確認できる- スナップショットは作成時点のデータをCOW(Copy-on-Write)で保持しており、元のLVに対する削除・上書きの影響を受けない
lvconvert --mergeでスナップショットの内容を元のLVにロールバックできるが、マージ中は対象のLVが一時的に非アクティブになる- マージ完了後は
lvchange -ayで明示的に再アクティブ化しないと、LVをマウントできる状態に戻らない
次の課題
- TODO: 稼働中のLVに対してスナップショットを取得し、アプリケーションの整合性を保った状態でバックアップを取得できるか検証する
