2 # invoked by backup scripts as
3 # lvm snap $vardir $device $mountpoint
4 # creates and mounts on $vardir/snap-mount
5 # creates $vardir/snap-device -> device
17 lvm_lvtools_opts='-A n'
21 test ! -f /etc/chiark-backup/settings.sh || . /etc/chiark-backup/settings.sh
23 case "$nargs.$opmode" in
28 usage: .../lvm snap VARDIR DEV MOUNT
36 #---------- clean up anything
38 snmnt="$vardir/snap-mount"
39 umount -v "$snmnt" || true
40 test ! -d "$snmnt" || rmdir -- "$snmnt"
43 old_lv_dev="$(readlink $vardir/snap-device)"
49 lvchange $lvm_lvtools_opts -a n $old_lv_dev
50 lvremove -f $lvm_lvtools_opts $old_lv_dev
52 rm $vardir/snap-device
55 if test "$opmode" = drop; then
56 echo 'lvm snap dropped'
60 #---------- create snapshot
62 fstype="$(mount | sed -n \
63 "s,^$device on $mountpoint type \([a-z0-9][a-z0-9]*\) .*,-t \1 ,p")"
65 if [ -z "$lvm_lvsize_opts" ]; then
66 vggroup="${device#/dev/}"
67 vggroup="${vggroup%/*}"
68 vgdisplay_out="$(really vgdisplay -c "$vggroup")"
69 extents="$(printf "%s" "$vgdisplay_out" | awk -F: '{print $16}')"
71 lvdisplay_out="$(really lvdisplay -c "$device")"
72 extents2="$(printf "%s" "$lvdisplay_out" | awk -F: '{print $9}')"
73 extents2=$(( $extents2 + ($extents2+9)/10 - 1 ))
75 if [ $extents2 -lt $extents ]; then extents=$extents2; fi
77 lvm_lvsize_opts="-l $extents"
80 lvpath="$(dirname "$device")/$lvm_lv"
82 ln -s -- "$lvpath" "$vardir"/snap-device
89 $lvm_lvcreate_opts "$device" $lvm_lvcreate_args
92 mount -v -r $fstype $lvm_mount_opts "$lvpath" "$snmnt"
94 echo 'lvm snap activated'