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
一連のコマンドをスクリプトにしておくと便利です。