freebsd-dev/libexec/rc/rc.d/fsck
Leandro Lupori e9f87d29a8 Add fsck_flags config option
On UFS with SU+J, sometimes fsck's default recovery from journal marks the
filesystem as clean but some errors remain.

With SU only, default fsck in preen mode sometimes thinks all errors have
been fixed but some still remain.

To address the issues above, this change adds a new config option:
fsck_flags.  By default it's set to -p, but the user may change it to -y
or -f -y, for instance, to force a full fsck after a system crash.

Submitted by:	jhibbits@ (original version)
Reviewed by:	mckusick
Differential Revision:	https://reviews.freebsd.org/D24087
2020-03-18 13:09:47 +00:00

96 lines
1.6 KiB
Bash
Executable File

#!/bin/sh
#
# $FreeBSD$
#
# PROVIDE: fsck
# REQUIRE: swap
# KEYWORD: nojail
. /etc/rc.subr
name="fsck"
desc="Run file system checks"
start_cmd="fsck_start"
stop_cmd=":"
fsck_start()
{
if [ "$autoboot" = no ]; then
echo "Fast boot: skipping disk checks."
elif [ ! -r /etc/fstab ]; then
echo "Warning! No /etc/fstab: skipping disk checks."
elif [ "$autoboot" = yes ]; then
# During fsck ignore SIGQUIT
trap : 3
check_startmsgs && echo "Starting file system checks:"
# Background fsck can only be run with -p
if checkyesno background_fsck; then
fsck -F -p
else
fsck ${fsck_flags}
fi
err=$?
if [ ${err} -eq 3 ]; then
echo "Warning! Some of the devices might not be" \
"available; retrying"
root_hold_wait
check_startmsgs && echo "Restarting file system checks:"
# Background fsck can only be run with -p
if checkyesno background_fsck; then
fsck -F -p
else
fsck ${fsck_flags}
fi
err=$?
fi
case ${err} in
0)
;;
2)
stop_boot
;;
4)
echo "Rebooting..."
reboot
echo "Reboot failed; help!"
stop_boot
;;
8|16)
if checkyesno fsck_y_enable; then
echo "File system preen failed, trying fsck -y ${fsck_y_flags}"
fsck -y ${fsck_y_flags}
case $? in
0)
;;
*)
echo "Automatic file system check failed; help!"
stop_boot
;;
esac
else
echo "Automatic file system check failed; help!"
stop_boot
fi
;;
12)
echo "Boot interrupted."
stop_boot
;;
130)
stop_boot
;;
*)
echo "Unknown error ${err}; help!"
stop_boot
;;
esac
fi
}
load_rc_config $name
run_rc_command "$1"