snapshot用の空きがないマシンでLVMのsnapshotをとる方法

HDDにsnapshot用の領域を確保していない状態でLVMのsnapshotをとる方法を思いついた。
実際に試したところうまくいった模様。

流れとしては、

  • メモリ上にsnapshot用のloopデバイスを作成
  • Volume Groupに追加

てな感じです。

いくつか条件があって、

  • メモリにある程度空きがあること(snapshot分)
  • tmpfsが有効であること

です。試したのはFedora Core 5のみですが、上記の条件を満たしていれば他のディストリビューションでも可能だと思います。

 [root@spirit shm]# mount
 /dev/mapper/VolGroup00-LogVol00 on / type xfs (rw)
 proc on /proc type proc (rw)
 sysfs on /sys type sysfs (rw)
 devpts on /dev/pts type devpts (rw,gid=5,mode=620)
 /dev/hda1 on /boot type ext3 (rw)
 tmpfs on /dev/shm type tmpfs (rw)
 none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
 sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
 automount(pid1766) on /net type autofs (rw,fd=4,pgrp=1766,minproto=2,maxproto=4)

 [root@spirit shm]# df -h
 Filesystem          サイズ  使用  残り 使用% マウント位置
 /dev/mapper/VolGroup00-LogVol00
                       147G  3.2G  144G   3% /
 /dev/hda1              99M  9.8M   84M  11% /boot
 tmpfs                 252M     0  252M   0% /dev/shm

試したマシンのファイルシステムはこんな感じです。

注意事項としては、ある程度メモリが必要なのとsnapshot取得後のバックアップ先を元のディスクには取れないことです。(バックアップファイルをディスクに書き込むとsnapshot領域が溢れる可能性がある)

詳しい手順

FedoraCore5を標準的(ファイルシステムはXFSに変更)したマシンの場合なので、適宜読みかえてください。

# dd if=/dev/zero of=/dev/shm/snapshot bs=1024k count=128
# losetup /dev/loop1 /dev/shm/snapshot
# pvcreate -v /dev/loop1
# vgextend VolGroup00 /dev/loop1
# lvcreate --snapshot --size=128M --name snap0 /dev/VolGroup00/LogVol00
# mount -t xfs -o nouuid /dev/VolGroup00/snap0 /mnt
ここでバックアップを取得します。

あとは通常通りsnapshotを破棄したのち、loopデバイスも開放します。
# lvremove /dev/VolGroup00/snap0
# vgreduce VolGroup00 /dev/loop1
# losetup -d /dev/loop1
# rm /dev/shm/snapshot

一連のコマンドをスクリプトにしておくと便利です。