home *** CD-ROM | disk | FTP | other *** search
- #! /bin/sh
- #
- # Copyright (c) 2001-2002 SuSE Linux AG, Nuernberg, Germany.
- # All rights reserved.
- #
- # /etc/init.d/boot.rootfsck
- #
- ### BEGIN INIT INFO
- # Provides: boot.rootfsck
- # Required-Start: boot.udev
- # Required-Stop:
- # Default-Start: B
- # Default-Stop:
- # Description: check and mount root filesystem
- ### END INIT INFO
-
- . /etc/rc.status
-
- # to get max number of parallel fsck processes
- . /etc/sysconfig/boot
-
- if [ -f /etc/sysconfig/dump ]; then
- . /etc/sysconfig/dump
- fi
-
- export FSCK_MAX_INST
-
- rc_reset
-
- case "$1" in
- start)
- #
- # fsck may need a huge amount of memory, so make sure, it is there.
- #
- # However, in the case of an active LKCD configuration, we need to
- # recover the crash dump from the swap partition first, so we cannot
- # yet activate them.
- #
- if [ "$DUMP_ACTIVE" != "1" ]; then
- echo "Activating swap-devices in /etc/fstab..."
- swapon -ae &> /dev/null
- rc_status -v1 -r
- fi
-
- #
- # If we use a serial console, don't use the fsck progress bar
- #
- FSCK_PROGRESSBAR="-V"
- [ -x /sbin/showconsole ] && [ "`/sbin/showconsole`" = "/dev/tty1" ] && FSCK_PROGRESSBAR="-C"
- #
- # do fsck and start sulogin, if it fails.
- #
- FSCK_RETURN=0
- MAY_FSCK=1
-
- # we may get ROOTFS_BLKDEV passed from initrd, skip extra actions
- if [ -n "$ROOTFS_BLKDEV" ] ; then
- if [ -n "$ROOTFS_REALDEV" ] ; then
- ROOTFS_BLKDEV=$ROOTFS_REALDEV
- fi
- else
- # if not booted via initrd, /dev is empty.
- # use private devnode with proper permissions
- ROOTFS_BLKDEV="/dev/shm/root"
- rootcpio=`echo / | /bin/cpio --quiet -o -H newc`
- rootmajor=0x${rootcpio:62:8}
- rootminor=0x${rootcpio:70:8}
- if [ $((rootmajor)) -ne 0 ] ; then
- echo /bin/mknod -m600 $ROOTFS_BLKDEV b $((rootmajor)) $((rootminor))
- /bin/mknod -m600 $ROOTFS_BLKDEV b $((rootmajor)) $((rootminor))
- fi
- MAY_FSCK=0
- if test -n "$ROOTFS_BLKDEV" -a "$ROOTFS_BLKDEV" != "/" -a -b "$ROOTFS_BLKDEV" ; then
- MAY_FSCK=1
- fi
- fi
- #
- FSCK_FORCE=""
- if test -f /forcefsck ; then
- FSCK_FORCE="-f"
- ROOTFS_FSCK=""
- fi
- if test "$ROOTFS_FSCK" = "0" ; then
- # already checked and ok, skip the rest
- MAY_FSCK=0
- fi
- if test ! -f /fastboot -a -z "$fastboot" -a $MAY_FSCK -eq 1 ; then
- # on an umsdos root fs this mount will fail,
- # so direct error messages to /dev/null.
- # this seems to be ugly, but should not really be a problem.
- mount -n -o remount,ro / 2> /dev/null
- if test $? = 0; then
- if test -n "$ROOTFS_FSCK" ; then
- FSCK_RETURN=$ROOTFS_FSCK
- else
- echo "Checking root file system..."
- fsck $FSCK_PROGRESSBAR -a $FSCK_FORCE $ROOTFS_BLKDEV
- # A return code of 1 indicates that file system errors
- # were corrected, but that the boot may proceed.
- # A return code of 2 or larger indicates failure.
- FSCK_RETURN=$?
- fi
- test $FSCK_RETURN -lt 4
- rc_status -v1 -r
- if test $FSCK_RETURN -gt 1 -a $FSCK_RETURN -lt 4 ; then
- # if appropriate, switch bootsplash to verbose
- # mode to make text messages visible.
- test -f /proc/splash && echo "verbose" > /proc/splash
- echo
- echo "fsck succeed, but reboot is required."
- echo
- sleep 1
- sync
- reboot -f
- elif test $FSCK_RETURN -gt 3; then
- # if appropriate, switch bootsplash to verbose
- # mode to make text messages visible.
- test -f /proc/splash && echo "verbose" > /proc/splash
- # Stop blogd since we reboot after sulogin
- test -x /sbin/blogd && killproc -QUIT /sbin/blogd
- if test -x /etc/init.d/kbd ; then
- /etc/init.d/kbd start
- fi
- echo
- echo "fsck failed. Please repair manually and reboot. The root"
- echo "file system is currently mounted read-only. To remount it"
- echo "read-write do:"
- echo
- echo " bash# mount -n -o remount,rw /"
- echo
- echo "Attention: Only CONTROL-D will reboot the system in this"
- echo "maintanance mode. shutdown or reboot will not work."
- echo
- PS1="(repair filesystem) # "
- export PS1
- /sbin/sulogin /dev/console
-
- # if the user has mounted something rw, this should be umounted
- echo "Unmounting file systems (ignore error messages)"
- umount -avn
-
- # on umsdos fs this would lead to an error message.
- # so direct errors to /dev/null
- mount -no remount,ro / 2> /dev/null
-
- sync
- reboot -f
- fi
- sync
- mount -n -o remount,rw /
- test $FSCK_RETURN -gt 0 && touch /fsck_corrected_errors
- else
- echo
- echo '*** ERROR! Cannot fsck because root is not read-only!'
- echo
- fi
- else
- if test "$ROOTFS_FSCK" != "0" ; then
- echo "root file system (/) is NOT being checked."
- fi
- # remount in any case to apply additional options like xattr
- mount -n -o remount,rw /
- fi
- # start with a clean mtab and enter root fs entry
- rm -f /etc/mtab*
- mount -f /
- ;;
- stop)
- ;;
- restart)
- rc_failed 3
- rc_status -v
- ;;
- status)
- rc_failed 4
- rc_status -v
- ;;
- *)
- echo "Usage: $0 {start|stop|status|restart}"
- exit 1
- ;;
- esac
-
- rc_exit
-
-