snapfsck.sh
changeset 10 577954f4f887
parent 9 a2875a6fd7b2
equal deleted inserted replaced
9:a2875a6fd7b2 10:577954f4f887
     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