| #!/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 |