diff options
Diffstat (limited to 'beagle/debian-rfs/etc/init.d/checkroot.sh')
| -rwxr-xr-x | beagle/debian-rfs/etc/init.d/checkroot.sh | 436 |
1 files changed, 436 insertions, 0 deletions
diff --git a/beagle/debian-rfs/etc/init.d/checkroot.sh b/beagle/debian-rfs/etc/init.d/checkroot.sh new file mode 100755 index 0000000..df84d22 --- /dev/null +++ b/beagle/debian-rfs/etc/init.d/checkroot.sh @@ -0,0 +1,436 @@ +#! /bin/sh +### BEGIN INIT INFO +# Provides: checkroot +# Required-Start: mountdevsubfs hostname +# Required-Stop: +# Should-Start: keymap hwclockfirst hdparm bootlogd +# Should-stop: +# Default-Start: S +# Default-Stop: +# X-Interactive: true +# Short-Description: Check to root file system. +### END INIT INFO + +# Include /usr/bin in path to find on_ac_power if /usr/ is on the root +# partition. +PATH=/sbin:/bin:/usr/bin +FSCK_LOGFILE=/var/log/fsck/checkroot +[ "$FSCKFIX" ] || FSCKFIX=no +[ "$SULOGIN" ] || SULOGIN=no +. /lib/init/vars.sh + +. /lib/lsb/init-functions +. /lib/init/mount-functions.sh +. /lib/init/splash-functions-base +. /lib/init/usplash-fsck-functions.sh + +do_start () { + # + # 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 sysv does. + # + [ "$SULOGIN" = yes ] && sulogin -t 30 $CONSOLE + + KERNEL="$(uname -s)" + MACHINE="$(uname -m)" + + # + # Read /etc/fstab, looking for: + # 1) The root filesystem, resolving LABEL=*|UUID=* entries to the + # device node, + # 2) Swap that is on a md device or a file that may be on a md + # device, + # + + exec 9<&0 </etc/fstab + + fstabroot=/dev/root + rootdev=none + roottype=none + rootopts=defaults + rootmode=rw + rootcheck=no + swap_on_lv=no + swap_on_file=no + + while read DEV MTPT FSTYPE OPTS DUMP PASS JUNK + do + case "$DEV" in + ""|\#*) + continue; + ;; + /dev/mapper/*) + [ "$FSTYPE" = "swap" ] && swap_on_lv=yes + ;; + /dev/*) + ;; + LABEL=*|UUID=*) + if [ "$MTPT" = "/" ] && [ -x /sbin/findfs ] + then + DEV="$(findfs "$DEV")" + fi + ;; + /*) + [ "$FSTYPE" = "swap" ] && swap_on_file=yes + ;; + *) + ;; + esac + [ "$MTPT" != "/" ] && continue + rootdev="$DEV" + fstabroot="$DEV" + rootopts="$OPTS" + roottype="$FSTYPE" + ( [ "$PASS" != 0 ] && [ "$PASS" != "" ] ) && rootcheck=yes + ( [ "$FSTYPE" = "nfs" ] || [ "$FSTYPE" = "nfs4" ] ) && rootcheck=no + case "$OPTS" in + ro|ro,*|*,ro|*,ro,*) + rootmode=ro + ;; + esac + done + + exec 0<&9 9<&- + + # + # Activate the swap device(s) in /etc/fstab. This needs to be done + # before fsck, since fsck can be quite memory-hungry. + # + ENABLE_SWAP=no + case "$KERNEL" in + Linux) + if [ "$NOSWAP" = yes ] + then + [ "$VERBOSE" = no ] || log_warning_msg "Not activating swap as requested via bootoption noswap." + ENABLE_SWAP=no + else + if [ "$swap_on_lv" = yes ] + then + [ "$VERBOSE" = no ] || log_warning_msg "Not activating swap on logical volume." + elif [ "$swap_on_file" = yes ] + then + [ "$VERBOSE" = no ] || log_warning_msg "Not activating swap on swapfile." + else + ENABLE_SWAP=yes + fi + fi + ;; + *) + ENABLE_SWAP=yes + ;; + esac + if [ "$ENABLE_SWAP" = yes ] + then + if [ "$VERBOSE" = no ] + then + log_action_begin_msg "Activating swap" + swapon -a -e >/dev/null 2>&1 + log_action_end_msg $? + else + log_daemon_msg "Activating swap" + swapon -a -v + log_end_msg $? + fi + fi + + # + # Does the root device in /etc/fstab match with the actual device ? + # If not we try to use the /dev/root alias device, and if that + # fails we create a temporary node in /lib/init/rw. + # + if [ "$rootcheck" = yes ] + then + ddev="$(mountpoint -qx $rootdev)" + rdev="$(mountpoint -d /)" + if [ "$ddev" != "$rdev" ] && [ "$ddev" != "4:0" ] + then + if [ "$(mountpoint -qx /dev/root)" = "4:0" ] + then + rootdev=/dev/root + else + if \ + rm -f /lib/init/rw/rootdev \ + && mknod -m 600 /lib/init/rw/rootdev b ${rdev%:*} ${rdev#*:} \ + && [ -e /lib/init/rw/rootdev ] + then + rootdev=/lib/init/rw/rootdev + else + rootfatal=yes + fi + fi + fi + fi + + # + # Bother, said Pooh. + # + if [ "$rootfatal" = yes ] + then + log_failure_msg "The device node $rootdev for the root filesystem is missing or incorrect +or there is no entry for the root filesystem listed in /etc/fstab. +The system is also unable to create a temporary node in /lib/init/rw. +This means you have to fix the problem manually." + log_warning_msg "A maintenance shell will now be started. +CONTROL-D will terminate this shell and restart the system." + # Start a single user shell on the console + if ! sulogin $CONSOLE + then + log_failure_msg "Attempt to start maintenance shell failed. +Will restart in 5 seconds." + sleep 5 + fi + [ "$VERBOSE" = no ] || log_action_msg "Will now restart" + reboot -f + fi + + # See if we're on AC Power. If not, we're not gonna run our + # check. If on_ac_power (in /usr/) is unavailable, behave as + # before and check all file systems needing it. +# Disabled AC power check until fsck can be told to only check the +# file system if it is corrupt when running on battery. (bug #526398) +# if which on_ac_power >/dev/null 2>&1 && [ "$rootcheck" = yes ] +# then +# on_ac_power >/dev/null 2>&1 +# if [ "$?" -eq 1 ] +# then +# log_warning_msg "On battery power, so skipping file system check." +# rootcheck=no +# fi +# fi + + # + # See if we want to check the root file system. + # + FSCKCODE=0 + if [ -f /fastboot ] || grep -s -w -i "fastboot" /proc/cmdline + then + [ "$rootcheck" = yes ] && log_warning_msg "Fast boot enabled, so skipping root file system check." + rootcheck=no + fi + + if [ "$rootcheck" = yes ] + then + # + # Ensure that root is quiescent and read-only before fsck'ing. + # + # mount -n -o remount,ro / would be the correct syntax but + # mount can get confused when there is a "bind" mount defined + # in fstab that bind-mounts "/" somewhere else. + # + # So we use mount -n -o remount,ro $rootdev / but that can + # fail on older kernels on sparc64/alpha architectures due + # to a bug in sys_mount(). + # + # As a compromise we try both. + # + if \ + ! mount -n -o remount,ro $rootdev / \ + && ! mount -n -o remount,ro -t dummytype $rootdev / 2>/dev/null \ + && ! mount -n -o remount,ro / 2>/dev/null + then + log_failure_msg "Cannot check root file system because it is not mounted read-only." + rootcheck=no + fi + fi + + # + # The actual checking is done here. + # + if [ "$rootcheck" = yes ] + then + if [ -f /forcefsck ] || grep -s -w -i "forcefsck" /proc/cmdline + then + force="-f" + else + force="" + fi + + if [ "$FSCKFIX" = yes ] + then + fix="-y" + else + fix="-a" + fi + + spinner="-C" + case "$TERM" in + dumb|network|unknown|"") + spinner="" ;; + esac + # This Linux/s390 special case should go away. + if [ "${KERNEL}:${MACHINE}" = Linux:s390 ] + then + spinner="" + fi + + if [ "$VERBOSE" = no ] + then + log_action_begin_msg "Checking root file system" + if [ "$roottype" = "ext2" -o "$roottype" = "ext3" -o "$roottype" = "ext4" ] && usplash_running; then + PROGRESS_FILE=`mktemp -p /lib/init/rw` || PROGRESS_FILE=/lib/init/rw/checkroot_fsck + set -m + logsave -s $FSCK_LOGFILE fsck -C3 $force $fix -t $roottype $rootdev >/dev/console 2>&1 3>$PROGRESS_FILE & + set +m + usplash_progress "$PROGRESS_FILE" + rm -f $PROGRESS_FILE + else + splash_start_indefinite + logsave -s $FSCK_LOGFILE fsck $spinner $force $fix -t $roottype $rootdev + FSCKCODE=$? + splash_stop_indefinite + fi + if [ "$FSCKCODE" = 0 ] + then + log_action_end_msg 0 + else + log_action_end_msg 1 "code $FSCKCODE" + fi + else + splash_start_indefinite + log_daemon_msg "Will now check root file system" + logsave -s $FSCK_LOGFILE fsck $spinner $force $fix -V -t $roottype $rootdev + FSCKCODE=$? + log_end_msg $FSCKCODE + splash_stop_indefinite + fi + fi + + # + # If there was a failure, drop into single-user mode. + # + # NOTE: "failure" is defined as exiting with a return code of + # 4 or larger. A return code of 1 indicates that file system + # errors were corrected but that the boot may proceed. A return + # code of 2 or 3 indicates that the system should immediately reboot. + # + if [ "$FSCKCODE" -gt 3 ] + then + # Surprise! Re-directing from a HERE document (as in "cat << EOF") + # does not work because the root is currently read-only. + log_failure_msg "An automatic file system check (fsck) of the root filesystem failed. +A manual fsck must be performed, then the system restarted. +The fsck should be performed in maintenance mode with the +root filesystem mounted in read-only mode." + log_warning_msg "The root filesystem is currently mounted in read-only mode. +A maintenance shell will now be started. +After performing system maintenance, press CONTROL-D +to terminate the maintenance shell and restart the system." + # Start a single user shell on the console + if ! sulogin $CONSOLE + then + log_failure_msg "Attempt to start maintenance shell failed. +Will restart in 5 seconds." + sleep 5 + fi + [ "$VERBOSE" = no ] || log_action_msg "Will now restart" + reboot -f + elif [ "$FSCKCODE" -gt 1 ] + then + log_failure_msg "The file system check corrected errors on the root partition +but requested that the system be restarted." + log_warning_msg "The system will be restarted in 5 seconds." + sleep 5 + [ "$VERBOSE" = no ] || log_action_msg "Will now restart" + reboot -f + fi + + # + # Remount root to final mode (rw or ro). + # + # See the comments above at the previous "mount -o remount" + # for an explanation why we try this twice. + # + if ! mount -n -o remount,$rootopts,$rootmode $fstabroot / 2>/dev/null + then + mount -n -o remount,$rootopts,$rootmode / + fi + + # + # We only create/modify /etc/mtab if the location where it is + # stored is writable. If /etc/mtab is a symlink into /proc/ + # then it is not writable. + # + INIT_MTAB_FILE=no + MTAB_PATH="$(readlink -f /etc/mtab || :)" + case "$MTAB_PATH" in + /proc/*) + ;; + /*) + if touch "$MTAB_PATH" >/dev/null 2>&1 + then + :> "$MTAB_PATH" + rm -f ${MTAB_PATH}~ + INIT_MTAB_FILE=yes + fi + ;; + "") + [ -L /etc/mtab ] && MTAB_PATH="$(readlink /etc/mtab)" + if [ "$MTAB_PATH" ] + then + log_failure_msg "Cannot initialize ${MTAB_PATH}." + else + log_failure_msg "Cannot initialize /etc/mtab." + fi + ;; + *) + log_failure_msg "Illegal mtab location '${MTAB_PATH}'." + ;; + esac + + if [ "$INIT_MTAB_FILE" = yes ] + then + [ "$roottype" != none ] && + mount -f -o $rootopts -t $roottype $fstabroot / + fi + + # + # Remove /lib/init/rw/rootdev if we created it. + # + rm -f /lib/init/rw/rootdev +} + +do_status () { + # If / is read-write or swap is enabled, this script have done + # its job. + rootrw=false + swapon=false + if [ -f /etc/mtab ] ; then + if grep " / " /etc/mtab |grep -q rw ; then + rootrw=true + fi + fi + if [ -f /proc/swaps ] ; then + if [ "$(cat /proc/swaps |grep -v ^Filename)" ] ; then + swapon=true + fi + fi + if [ true = "$rootrw" ] || [ true = "$swapon" ] ; then + return 0 + else + return 4 + fi +} + +case "$1" in + start|"") + do_start + ;; + restart|reload|force-reload) + echo "Error: argument '$1' not supported" >&2 + exit 3 + ;; + stop) + # No-op + ;; + status) + do_status + exit $? + ;; + *) + echo "Usage: checkroot.sh [start|stop]" >&2 + exit 3 + ;; +esac + +: |
