#!/bin/sh # invoked by backup scripts as # lvm snap $vardir $device $mountpoint # creates and mounts on $vardir/snap-mount # creates $vardir/snap-device -> device # lvm drop $vardir set -e nargs=$# opmode="$1" vardir="$2" device="$3" mountpoint="$4" lvm_lv=chiark-backup lvm_lvtools_opts='-A n' lvm_lvcreate_opts= lvm_lvcreate_args= test ! -f /etc/chiark-backup/settings.sh || . /etc/chiark-backup/settings.sh case "$nargs.$opmode" in 4.snap|2.drop) ;; *) cat >&2 <<'END' usage: .../lvm snap VARDIR DEV MOUNT .../lvm drop VARDIR END exit 1 ;; esac #---------- clean up anything snmnt="$vardir/snap-mount" umount -v "$snmnt" || true test ! -d "$snmnt" || rmdir -- "$snmnt" set +e old_lv_dev="$(readlink $vardir/snap-device)" rc=$? set -e if [ $rc = 0 ]; then set +e lvchange $lvm_lvtools_opts -a n $old_lv_dev lvremove -f $lvm_lvtools_opts $old_lv_dev set -e rm $vardir/snap-device fi if test "$opmode" = drop; then echo 'lvm snap dropped' exit 0 fi #---------- create snapshot fstype="$(mount | sed -n \ "s,^$device on $mountpoint type \([a-z0-9][a-z0-9]*\) .*,-t \1 ,p")" if [ -z "$lvm_lvsize_opts" ]; then df="$(df -k $device)" blocks="$(printf "%s" "$df" | sed -n '2,$s,^/dev/[^ ]*[ ][ ]*[0-9][0-9]*[ ][ ]*\([0-9][0-9]*\)[ ].*,\1,p')" lvm_lvsize_opts="-L $blocks"K fi lvpath="$(dirname "$device")/$lvm_lv" ln -s -- "$lvpath" "$vardir"/snap-device sync lvcreate -s \ $lvm_lvtools_opts \ $lvm_lvsize_opts \ -n $lvm_lv \ $lvm_lvcreate_opts "$device" $lvm_lvcreate_args mkdir -- "$snmnt" mount -v -r $fstype $lvm_mount_opts "$lvpath" "$snmnt" echo 'lvm snap activated'