Am 03.09.2010 11:40, schrieb Paul Bijnens:
> 
> Hi Stefan and fellow amanda-users,
> 
> Catching up on my mail...
> 
> Just to confirm that you may post the script.
> Anybody even use it and adapt it to his needs.
> It's free software (as in "free beer" and in "free speech").
> 
> Although the script is a bit dated for the current amanda...
> (Still need to catch up on that too.)

Ok, thanks, Paul ...

I post it with a short explanation:

The attached script gets called via crontab before and after amdump.

Something like:

# create snapshots before amdump
50 20 * * 1-5 /root/bin/make_snapshot_lvm2 -s 2g VG01:amhold:-
VG01:vm_data:15g VG01:vm_apps:25g VG01:rsnapshots:-

# remove snapshots before users start work
00 07 * * * /root/bin/make_snapshot_lvm2 -r

---

You add DLEs like

/snap/_mnt_vm_apps

where the script mounts the snapshots (under /snap as configured in the
script).

I use it for some years now and it works very well.

Thanks again, Paul, for sharing.

Let's see what other amanda-users think of it ...

Stefan
#!/bin/sh

# Create a snapshot for the backups

set -vx

USAGE="$0 [-r] [-n] [-s 512m]  [VG:LV:size] ..."
VERBOSE=
REMOVEONLY=
DONOTREMOVE=
SIZE=512m       # default size


SNAPTOP=/snap

test -d $SNAPTOP  ||  mkdir -p $SNAPTOP  ||  exit 1

while getopts vnrs: i
do
    case $i in
        v) VERBOSE=verbose ;;
        n) DONOTREMOVE=donotremove ;;
        r) REMOVEONLY=removeonly ;;
        s) SIZE=$OPTARG ;;      # default size
        \?) echo $USAGE
                exit 2 ;;
    esac
done
shift `expr $OPTIND - 1`

# SPECS in format 'VG00:LVvar:128m VG00:LVspace:4g VG00::LVother:-'
#    use size "-" to skip creating a snapshot for that volume
SPECS="$*";

PATH=/sbin:/usr/sbin:/bin:/usr/bin:$PATH; export PATH

test -n "$VERBOSE"  &&  lvs --sort lv_name
test -n "$VERBOSE"  &&  echo

lvs --noheadings --nosuffix --units m --options vg_name,lv_name,lv_size,origin 
--sort -origin |
while read vg_name lv_name lv_size origin
do
    test -n "$VERBOSE"  &&  echo Considering $vg_name $lv_name $lv_size 
origin=$origin
    lv__name=`echo $lv_name | sed -e 's/-/--/g'`

    if [ -n "$origin" -a -z "$DONOTREMOVE" ]
    then
        test -n "$VERBOSE"  &&  echo Removing $vg_name $lv_name

        ## original from Paul: /dev/$vg_name/$lv_name
        #if test -e /dev/$vg_name/$lv_name  &&  grep "^/dev/$vg_name/$lv_name " 
/proc/mounts >/dev/null
        ## SLES: /dev/mapper/VG01-_mnt_vm_apps.2009.05.11T14.33.01.CEST.snap
        if test -e /dev/$vg_name/$lv_name  &&  grep 
"^/dev/mapper/$vg_name-$lv_name " /proc/mounts >/dev/null
        then 
            test -n "$VERBOSE"  &&  echo Killing any processes having files 
open on $vg_name $lv_name
            fuser -kvm $SNAPTOP/$lv_name
            test -n "$VERBOSE"  &&  echo Umounting $vg_name $lv_name
            umount /dev/$vg_name/$lv_name
        fi
        test -n "$VERBOSE"  &&  echo Remove dir $SNAPTOP/$lvname
        rmdir $SNAPTOP/$lv_name
        test -n "$VERBOSE"  &&  echo Remove snapshot /dev/$vg_name/$lv_name
        lvremove -f /dev/$vg_name/$lv_name >/dev/null  ||  {
            echo Remove Snapshot /dev/$vg_name/$lv_name error
            exit 1
        }
        continue
    fi

    if [ -n "$origin"  -o  -n "$REMOVEONLY" ]
    then continue
    fi

    mountpoint=`mount | grep "$vg_name-$lv__name" | sed -e 's/.* on //' -e 's/ 
type .*//'`
    case $mountpoint in
        /)    continue ;;       # snapshots for root fs are not working (??)
        /tmp) continue ;;       # neither for /tmp
        "")   continue ;;       # e.g. swap
    esac

    vg_free=`vgs --noheadings --options vg_free $vg_name`
    snapsize=`echo $SPECS | sed -n 's/.*'"$vg_name"':'"$lv_name"':\([^, 
]*\).*/\1/p'`
    if [ "$snapsize" = "-" ]    # skip this volume
    then continue
    fi
    test -z $snapsize && snapsize=$SIZE

    mountpoint=`echo $mountpoint | tr '/' '_'`
    # Date in ISO 8601 format, see
    # http://www.iso.ch/iso/en/prods-services/popstds/datesandtime.html
    # but, colon is a forbidden char for snapshot names, 
    # and hyphens are doubled (could be but ok, creates confusion)
    # snapname=${mountpoint}.`date +%Y-%m-%dT%H:%M:%S`.snap
    snapname=${mountpoint}.`date +%Y.%m.%dT%H.%M.%S.%Z`.snap
    test -n "$VERBOSE"  &&  echo "Creating snapshot $vg_name $lv_name 
($snapsize): $snapname"
    lvcreate --snapshot --size $snapsize --name $snapname \
                /dev/$vg_name/$lv_name  >/dev/null  ||  {
            echo Create Snapshot $snapname error
            exit 1
        }
    snapdir=$SNAPTOP/$snapname
    mkdir $snapdir

    rm -f $SNAPTOP/$mountpoint
    ln -s $SNAPTOP/$snapname $SNAPTOP/$mountpoint        # symlink for Amanda

    test -n "$VERBOSE"  &&  echo Mounting $snapdir
    mount -o ro /dev/$vg_name/$snapname $snapdir

done

test -n "$VERBOSE"  &&  echo
test -n "$VERBOSE"  &&  lvs --sort lv_name
test -n "$VERBOSE"  &&  echo

Reply via email to