diff -r 000000000000 -r 1ce20afb2058 snapfsck.bash --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/snapfsck.bash Wed Aug 10 09:45:54 2011 +0200 @@ -0,0 +1,60 @@ +#!/bin/bash + +SNAPSIZE='500M' + +warn() { + echo $@ >&2 +} + +die() { + if [ $# -ne 0 ]; then + echo $@ >&2 + else + echo something went wrong + fi + exit -1 +} + +usage() { + +cat <<__U +usage: + $0 /dev// + or + $0 / + but not (yet?) + $0 /dev/mapper/- +__U + +exit -1 + +} + +p=${1:?device required} +p=${p#/dev} +vg=${p%%/*} +lv=${p##*/} +lvs="snap.${lv}" + +[ -n "${vg}" -a -n "${lv}" -a "${vg}" != "${p}" -a "${lv}" != "${p}" ] || usage + +lvcreate -n"$lvs" -L"$SNAPSIZE" -s "$vg/$lv" || die +if e2fsck -p "/dev/$vg/$lvs"; then + tune2fs -C 1 -T now "/dev/$vg/$lv" || die + # removing /dev/$vg/snap.$lv or just $vg/snap.$lv does not work reliably + # removing /dev/mapper/$vg-snap.$lv does not work reliably either + waittime=1 # second + tries=60 + i=1 + until lvremove -f "$vg/$lvs"; do + if [ $i -lt $tries ]; then + warn retrying + sleep $waittime + i=$((i+1)) + else + die giving up + fi + done +else + die fsck failed +fi