Make pishrink always try to repair the filesystem
There were far too many people having to repair the filesystems by hand. Since the image would be mostly unusable anyway, I feel confident doing it on the image without copying.
This commit is contained in:
parent
27f8780508
commit
97b9a5db39
83
pishrink.sh
83
pishrink.sh
|
@ -1,6 +1,6 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
version="v0.1.1"
|
version="v0.1.2"
|
||||||
|
|
||||||
CURRENT_DIR=$(pwd)
|
CURRENT_DIR=$(pwd)
|
||||||
SCRIPTNAME="${0##*/}"
|
SCRIPTNAME="${0##*/}"
|
||||||
|
@ -10,28 +10,6 @@ function info() {
|
||||||
echo "$SCRIPTNAME: $1..."
|
echo "$SCRIPTNAME: $1..."
|
||||||
}
|
}
|
||||||
|
|
||||||
# Returns 0 for success, <> 0 for failure
|
|
||||||
function retry() { # command maxretry failuretest
|
|
||||||
|
|
||||||
local tries=1
|
|
||||||
local command="$1" # command to retry
|
|
||||||
local maxRetry=$2 # number of retries
|
|
||||||
local successtest="$3" # success test
|
|
||||||
|
|
||||||
while (( tries <= maxRetry )); do
|
|
||||||
info "Trying to recover corrupted filesystem. Trial $tries"
|
|
||||||
eval "$command"
|
|
||||||
rc=$?
|
|
||||||
eval "$successtest"
|
|
||||||
if (( ! $? )); then
|
|
||||||
info "Recovered filesystem error"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
(( tries++ ))
|
|
||||||
done
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
function error() {
|
function error() {
|
||||||
echo -n "$SCRIPTNAME: ERROR occured in line $1: "
|
echo -n "$SCRIPTNAME: ERROR occured in line $1: "
|
||||||
shift
|
shift
|
||||||
|
@ -56,43 +34,28 @@ function logVariables() {
|
||||||
local v var
|
local v var
|
||||||
for var in "$@"; do
|
for var in "$@"; do
|
||||||
eval "v=\$$var"
|
eval "v=\$$var"
|
||||||
echo "$var: $v" >> $LOGFILE
|
echo "$var: $v" >> "$LOGFILE"
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function checkFilesystem() {
|
function checkFilesystem() {
|
||||||
|
|
||||||
local stdTest="(( rc < 4 ))"
|
|
||||||
[[ $paranoia == true ]] && stdTest="(( rc == 0 ))"
|
|
||||||
|
|
||||||
local rc
|
|
||||||
info "Checking filesystem"
|
info "Checking filesystem"
|
||||||
retry "e2fsck -pfttv \"$loopback\"" 3 "$stdTest"
|
e2fsck -pf "$loopback"
|
||||||
rc=$?
|
(( $? < 4 )) && return
|
||||||
|
|
||||||
(( ! rc )) && return
|
info "Filesystem error detected!"
|
||||||
|
|
||||||
info "Filesystem error detected"
|
info "Trying to recover corrupted filesystem"
|
||||||
|
e2fsck -y "$loopback"
|
||||||
|
(( $? < 4 )) && return
|
||||||
|
|
||||||
if [[ $paranoia != true ]]; then
|
if [[ $repair == true ]]; then
|
||||||
error $LINENO "e2fsck failed. Filesystem corrupted. Try option -r or option -p."
|
info "Trying to recover corrupted filesystem - Phase 2"
|
||||||
exit -9
|
e2fsck -fy -b 32768 "$loopback"
|
||||||
fi
|
(( $? < 4 )) && return
|
||||||
|
fi
|
||||||
info "Trying to recover corrupted filesystem (Phase1)"
|
error $LINENO "Filesystem recoveries failed. Giving up..."
|
||||||
retry "e2fsck -pftt \"$loopback\"" 3 "stdTest"
|
|
||||||
(( ! $? )) && return
|
|
||||||
|
|
||||||
info "Trying to recover corrupted filesystem (Phase2)."
|
|
||||||
retry "e2fsck -yv \"$loopback\"" 3 "$stdTest"
|
|
||||||
(( ! $? )) && return
|
|
||||||
|
|
||||||
info "Trying to recover corrupted filesystem (Phase3)."
|
|
||||||
retry "e2fsck -fttvy -b 32768 \"$loopback\"" 3 "$stdTest"
|
|
||||||
(( ! $? )) && return
|
|
||||||
|
|
||||||
error $LINENO "Filesystem recoveries failed. Giving up to fix corrupted filesystem."
|
|
||||||
exit -9
|
exit -9
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -102,8 +65,7 @@ help() {
|
||||||
read -r -d '' help << EOM
|
read -r -d '' help << EOM
|
||||||
-s: Don't expand filesystem when image is booted the first time
|
-s: Don't expand filesystem when image is booted the first time
|
||||||
-d: Write debug messages in a debug log file
|
-d: Write debug messages in a debug log file
|
||||||
-r: Try to repair corrupted filesystem
|
-r: Use advanced repair option
|
||||||
-p: Try to repair corrupted filesystem in paranoia mode
|
|
||||||
EOM
|
EOM
|
||||||
echo "$help"
|
echo "$help"
|
||||||
exit -1
|
exit -1
|
||||||
|
@ -111,10 +73,9 @@ EOM
|
||||||
|
|
||||||
usage() {
|
usage() {
|
||||||
echo "Usage: $0 [-sdrph] imagefile.img [newimagefile.img]"
|
echo "Usage: $0 [-sdrph] imagefile.img [newimagefile.img]"
|
||||||
echo "-s: skip autoexpand"
|
echo "-s: Skip autoexpand"
|
||||||
echo "-d: debug mode on"
|
echo "-d: Debug mode on"
|
||||||
echo "-r: try to repair filesystem errors"
|
echo "-r: Use advanced repair options"
|
||||||
echo "-p: try to repair filesystem errors (paranoia mode)"
|
|
||||||
echo "-h: display help text"
|
echo "-h: display help text"
|
||||||
exit -1
|
exit -1
|
||||||
}
|
}
|
||||||
|
@ -122,14 +83,12 @@ usage() {
|
||||||
should_skip_autoexpand=false
|
should_skip_autoexpand=false
|
||||||
debug=false
|
debug=false
|
||||||
repair=false
|
repair=false
|
||||||
paranoia=false
|
|
||||||
|
|
||||||
while getopts ":sdrph" opt; do
|
while getopts ":sdrh" opt; do
|
||||||
case "${opt}" in
|
case "${opt}" in
|
||||||
s) should_skip_autoexpand=true ;;
|
s) should_skip_autoexpand=true ;;
|
||||||
d) debug=true;;
|
d) debug=true;;
|
||||||
r) repair=true;;
|
r) repair=true;;
|
||||||
p) paranoia=true;;
|
|
||||||
h) help;;
|
h) help;;
|
||||||
*) usage ;;
|
*) usage ;;
|
||||||
esac
|
esac
|
||||||
|
@ -277,9 +236,7 @@ else
|
||||||
fi
|
fi
|
||||||
|
|
||||||
#Make sure filesystem is ok
|
#Make sure filesystem is ok
|
||||||
if [[ $repair == true ]]; then
|
checkFilesystem
|
||||||
checkFilesystem
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ! minsize=$(resize2fs -P "$loopback"); then
|
if ! minsize=$(resize2fs -P "$loopback"); then
|
||||||
rc=$?
|
rc=$?
|
||||||
|
|
Loading…
Reference in New Issue