forked from brl/citadel
149 lines
3.5 KiB
Bash
Executable File
149 lines
3.5 KiB
Bash
Executable File
#!/bin/sh
|
|
### BEGIN INIT INFO
|
|
# Provides: checkroot
|
|
# Required-Start: udev
|
|
# Required-Stop:
|
|
# Default-Start: S
|
|
# Default-Stop:
|
|
# Short-Description: Check to root file system.
|
|
### END INIT INFO
|
|
|
|
. /etc/default/rcS
|
|
|
|
#
|
|
# Set SULOGIN in /etc/default/rcS to yes if you want a sulogin to be spawned
|
|
# from this script *before anything else* with a timeout, like SCO does.
|
|
#
|
|
test "$SULOGIN" = yes && sulogin -t 30 $CONSOLE
|
|
|
|
#
|
|
# Read /etc/fstab.
|
|
#
|
|
exec 9< /etc/fstab
|
|
rootmode=rw
|
|
rootopts=rw
|
|
rootcheck=$ENABLE_ROOTFS_FSCK
|
|
swap_on_md=no
|
|
devfs=
|
|
while read fs mnt type opts dump pass junk <&9
|
|
do
|
|
case "$fs" in
|
|
""|\#*)
|
|
continue;
|
|
;;
|
|
/dev/md*)
|
|
# Swap on md device.
|
|
test "$type" = swap && swap_on_md=yes
|
|
;;
|
|
/dev/*)
|
|
;;
|
|
*)
|
|
# Might be a swapfile.
|
|
test "$type" = swap && swap_on_md=yes
|
|
;;
|
|
esac
|
|
test "$type" = devfs && devfs="$fs"
|
|
test "$mnt" != / && continue
|
|
rootopts="$opts"
|
|
test "$pass" = 0 -o "$pass" = "" && rootcheck=no
|
|
case "$opts" in
|
|
ro|ro,*|*,ro|*,ro,*)
|
|
rootmode=ro
|
|
;;
|
|
esac
|
|
done
|
|
exec 0>&9 9>&-
|
|
|
|
# Check for conflicting configurations
|
|
if [ "$rootmode" = "ro" -a "$ROOTFS_READ_ONLY" = "no" ] || \
|
|
[ "$rootmode" = "rw" -a "$ROOTFS_READ_ONLY" = "yes" ]; then
|
|
echo ""
|
|
echo "WARN: conflicting configurations in /etc/fstab and /etc/default/rcS"
|
|
echo " regarding the writability of rootfs. Please fix one of them."
|
|
echo ""
|
|
fi
|
|
|
|
|
|
#
|
|
# Activate the swap device(s) in /etc/fstab. This needs to be done
|
|
# before fsck, since fsck can be quite memory-hungry.
|
|
#
|
|
test "$VERBOSE" != no && echo "Activating swap"
|
|
[ -x /sbin/swapon ] && swapon -a
|
|
|
|
#
|
|
# Check the root filesystem.
|
|
#
|
|
if test -f /fastboot || test $rootcheck = no
|
|
then
|
|
test $rootcheck = yes && echo "Fast boot, no filesystem check"
|
|
else
|
|
#
|
|
# Ensure that root is quiescent and read-only before fsck'ing.
|
|
#
|
|
mount -n -o remount,ro /
|
|
if test $? = 0
|
|
then
|
|
if test -f /forcefsck
|
|
then
|
|
force="-f"
|
|
else
|
|
force=""
|
|
fi
|
|
if test "$FSCKFIX" = yes
|
|
then
|
|
fix="-y"
|
|
else
|
|
fix="-a"
|
|
fi
|
|
spinner="-C"
|
|
case "$TERM" in
|
|
dumb|network|unknown|"") spinner="" ;;
|
|
esac
|
|
test `uname -m` = s390 && spinner="" # This should go away
|
|
test "$VERBOSE" != no && echo "Checking root filesystem..."
|
|
fsck $spinner $force $fix /
|
|
#
|
|
# If there was a failure, drop into single-user mode.
|
|
#
|
|
# NOTE: "failure" is defined as exiting with a return code of
|
|
# 2 or larger. A return code of 1 indicates that filesystem
|
|
# errors were corrected but that the boot may proceed.
|
|
#
|
|
if test "$?" -gt 1
|
|
then
|
|
# Surprise! Re-directing from a HERE document (as in
|
|
# "cat << EOF") won't work, because the root is read-only.
|
|
echo
|
|
echo "fsck failed. Please repair manually and reboot. Please note"
|
|
echo "that the root filesystem is currently mounted read-only. To"
|
|
echo "remount it read-write:"
|
|
echo
|
|
echo " # mount -n -o remount,rw /"
|
|
echo
|
|
echo "CONTROL-D will exit from this shell and REBOOT the system."
|
|
echo
|
|
# Start a single user shell on the console
|
|
/sbin/sulogin $CONSOLE
|
|
reboot -f
|
|
fi
|
|
else
|
|
echo "*** ERROR! Cannot fsck root fs because it is not mounted read-only!"
|
|
echo
|
|
fi
|
|
fi
|
|
|
|
#
|
|
# If the root filesystem was not marked as read-only in /etc/fstab,
|
|
# remount the rootfs rw but do not try to change mtab because it
|
|
# is on a ro fs until the remount succeeded. Then clean up old mtabs
|
|
# and finally write the new mtab.
|
|
#
|
|
mount -n -o remount,$rootmode /
|
|
if test "$rootmode" = rw
|
|
then
|
|
ln -sf /proc/mounts /dev/mtab
|
|
fi
|
|
|
|
: exit 0
|