|
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 |