equal
deleted
inserted
replaced
1 #!/bin/bash |
|
2 |
|
3 set -e |
|
4 |
|
5 SNAPSIZE='500M' |
|
6 |
|
7 warn() { |
|
8 echo $@ >&2 |
|
9 } |
|
10 |
|
11 die() { |
|
12 if [ $# -ne 0 ]; then |
|
13 echo $@ >&2 |
|
14 else |
|
15 echo something went wrong |
|
16 fi |
|
17 exit 1 |
|
18 } |
|
19 |
|
20 usage() { |
|
21 |
|
22 cat <<__U |
|
23 usage: |
|
24 $0 [-s snapsize] /dev/<vgname>/<lvname> |
|
25 or |
|
26 $0 [-s snapsize] <vgname>/<lvname> |
|
27 but not (yet?) |
|
28 $0 [-s snapsize] /dev/mapper/<vgname>-<lvname> |
|
29 __U |
|
30 |
|
31 exit 1 |
|
32 |
|
33 } |
|
34 |
|
35 cleanup() { |
|
36 |
|
37 # if you have problems removing volumes then you may have the 'udisks' |
|
38 # package installed; see: |
|
39 # http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=549691#74 |
|
40 # https://bugzilla.redhat.com/show_bug.cgi?id=577798#c5 |
|
41 # https://www.redhat.com/archives/linux-lvm/2010-August/msg00029.html |
|
42 lvs "$vg/$lvs" && lvremove -f "$vg/$lvs" |
|
43 |
|
44 } |
|
45 |
|
46 while getopts "s:" opt; do |
|
47 case $opt in |
|
48 s) |
|
49 SNAPSIZE="$OPTARG" |
|
50 ;; |
|
51 \?) |
|
52 usage |
|
53 ;; |
|
54 esac |
|
55 done |
|
56 shift $((OPTIND-1)) |
|
57 |
|
58 p=${1:?device required} |
|
59 p=${p#/dev/} |
|
60 vg=${p%/*} |
|
61 lv=${p##*/} |
|
62 lvs="snap.${lv}" |
|
63 |
|
64 trap cleanup EXIT |
|
65 |
|
66 [ -n "${vg}" -a -n "${lv}" -a "${vg}" != "${p}" -a "${lv}" != "${p}" ] || usage |
|
67 |
|
68 d=$(date +%Y%m%d%H%M%S) |
|
69 lvcreate -n"$lvs" -L"$SNAPSIZE" -s "$vg/$lv" |
|
70 # fix any noncritical problems automatically and don't make any noise (on |
|
71 # stderr) about it; note that these problems remain present on the origin |
|
72 # volume |
|
73 e2fsck -fp "/dev/$vg/$lvs" 2>&1 || true |
|
74 if e2fsck -fy "/dev/$vg/$lvs" 2>&1; then |
|
75 tune2fs -C 1 -T "$d" "/dev/$vg/$lv" |
|
76 else |
|
77 die fsck returned nonzero: this may indicate filesystem corruption on the origin volume. |
|
78 fi |
|