examples/backup
changeset 95 006cedfc3ce2
child 102 af5341476dc2
equal deleted inserted replaced
94:cffc45cd7e69 95:006cedfc3ce2
       
     1 #! /bin/bash -e
       
     2 
       
     3 export TMPDIR=/var/tmp
       
     4 export LC_ALL=C
       
     5 
       
     6 SNAPSIZE=1G
       
     7 DST=${1?need destination folder}
       
     8 VG=`hostname`
       
     9 DEV=/dev/sda1
       
    10 NICE=
       
    11 
       
    12 now=`date +%s`
       
    13 tmp=`mktemp`
       
    14 snaps=`mktemp`
       
    15 
       
    16 _lvremove() {
       
    17 	local dev=$1
       
    18 	local vg=${dev%/*}
       
    19 	local lv=${dev#*/}
       
    20 
       
    21 	udevadm settle || true
       
    22 	lvremove -f "$dev" || {
       
    23 		dmsetup remove /dev/$vg/$lv \
       
    24 		&& udevadm settle \
       
    25 		&& dmsetup remove /dev/$vg/$lv-cow \
       
    26 		&& udevadm settle \
       
    27 		&& lvremove -f "$dev" || true
       
    28 	}
       
    29 }
       
    30 
       
    31 cleanup() {
       
    32 
       
    33 	while read lvm dev orig cleanup; do
       
    34 		udevadm settle
       
    35 		test -e "$dev" && test "$cleanup" || continue
       
    36 		eval $cleanup || true
       
    37 	done < $snaps
       
    38 
       
    39 	rm -f $tmp $snaps
       
    40 }
       
    41 
       
    42 trap cleanup EXIT INT
       
    43 
       
    44 for dev in $DEV; do
       
    45 	if mount -o remount,ro $dev; then
       
    46 		echo "- $tmp - rm -fv $tmp" >>$snaps
       
    47 		cp -v $dev $tmp
       
    48 		mount -o remount,rw $dev
       
    49 		file -s $tmp | egrep -q "ext[234] filesystem" && e2fsck -C0 -f -y $tmp || true
       
    50 		imager save --now=$now -z $tmp:$dev $DST
       
    51 		rm -f $tmp
       
    52 	fi
       
    53 done
       
    54 
       
    55 
       
    56 lvs -o vg_name,lv_name,origin --noheadings $VG | while read vg lv origin; do
       
    57 	# LVM-name DEV-name ORIG-name (cleanup)
       
    58 
       
    59 	orig="$vg/$lv"
       
    60 	if test "$origin"; then
       
    61 		dev="/dev/$vg/$lv"
       
    62 		echo "$vg/$lv $dev $dev" >>$snaps
       
    63 		continue
       
    64 	fi
       
    65 	snap="$vg/$lv.snap.$now"
       
    66 	dev="/dev/$vg/$lv.snap.$now"
       
    67 	lvcreate -s -L $SNAPSIZE -n "$snap" "$orig"
       
    68 	echo "$snap $dev /dev/$vg/$lv _lvremove $snap" >>$snaps
       
    69 done
       
    70 
       
    71 udevadm settle
       
    72 
       
    73 while read snap dev name cleanup; do
       
    74 	test "$snap" = "-" && continue
       
    75 	for a in 1 2 3; do
       
    76 		file -s `readlink -f $dev` | egrep -q "ext[234] filesystem" && $NICE fsck -y "$dev" && break
       
    77 		case $? in
       
    78 			32)	exit;;
       
    79 			*)	true;;
       
    80 		esac
       
    81 	done
       
    82 	if test $? = 0; then
       
    83 		$NICE imager save --now=$now -z $dev:$name $DST 
       
    84 		case `lvs -o snap_percent --noheadings "$snap"` in
       
    85 			100*)	echo "****************** $snap is full!";;
       
    86 		esac
       
    87 	fi
       
    88 	test "$cleanup" && eval $cleanup || true
       
    89 done <$snaps
       
    90 date
       
    91 date  >/var/log/backup.done