summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'init.d/checkroot')
-rwxr-xr-xinit.d/checkroot149
1 files changed, 149 insertions, 0 deletions
diff --git a/init.d/checkroot b/init.d/checkroot
new file mode 100755
index 00000000..c7fb66d3
--- /dev/null
+++ b/init.d/checkroot
@@ -0,0 +1,149 @@
+#!/sbin/runscript
+# Copyright 1999-2007 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+do_mtab() {
+ # Don't create mtab if /etc is readonly
+ if ! touch /etc/mtab 2> /dev/null ; then
+ ewarn "Skipping /etc/mtab initialization" "(ro root?)"
+ return 0
+ fi
+
+ # Clear the existing mtab
+ > /etc/mtab
+
+ # Add the entry for / to mtab
+ mount -f /
+
+ # Don't list root more than once
+ grep -v "^[^ ]* / " /proc/mounts >> /etc/mtab
+
+ # Now make sure /etc/mtab have additional info (gid, etc) in there
+ local mnt= mnts="$(mountinfo | sed -e "s/^/'/g" -e "s/$/'/g")"
+ eval set -- ${mnts}
+ for mnt in "$@" ; do
+ if fstabinfo --mount-cmd "${mnt}" >/dev/null ; then
+ mount -f -o remount "${mnt}"
+ fi
+ done
+
+ # Remove stale backups
+ rm -f /etc/mtab~ /etc/mtab~~
+}
+
+start() {
+ local retval=0
+
+ # Don't bother doing a fsck on these
+ if [ -n "${CDBOOT}" ] || is_net_fs / || is_union_fs / ; then
+ return 0
+ fi
+
+ if touch /.test.$$ 2> /dev/null ; then
+ einfo "root filesystem is mounted read-write - skipping"
+ rm -f /.test.$$
+ return 0
+ fi
+
+ if get_bootparam "forcefsck" ; then
+ ebegin "Checking root filesystem (full fsck forced)"
+ if [ "${RC_UNAME}" = "Linux" ] ; then
+ fsck -C -a -f /
+ else
+ fsck -F /
+ fi
+ # /forcefsck isn't deleted because checkfs needs it.
+ # it'll be deleted in that script.
+ retval=$?
+ else
+ # Obey the fs_passno setting for / (see fstab(5))
+ # - find the / entry
+ # - make sure we have 6 fields
+ # - see if fs_passno is something other than 0
+ local pass=$(fstabinfo --passno /)
+ if [ ${pass:-0} != "0" ] ; then
+ ebegin "Checking root filesystem"
+ if [ "${RC_UNAME}" = "Linux" ] ; then
+ fsck -C -T -a /
+ else
+ fsck -p -F /
+ fi
+ retval=$?
+ else
+ ebegin "Skipping root filesystem check" "(fstab's passno == 0)"
+ retval=0
+ fi
+ fi
+
+ if [ ${retval} -eq 0 ] ; then
+ eend 0
+ elif [ ${retval} -eq 1 ] ; then
+ ewend 1 "Filesystem repaired"
+ retval=0
+ elif [ ${retval} -eq 8 ] ; then
+ ewend 1 $"Operational error, continuing"
+ retval=0
+ elif [ ${retval} -eq 2 -o ${retval} -eq 3 ] ; then
+ ewend 1 "Filesystem repaired, but reboot needed!"
+ if [ "${RC_FORCE_AUTO}" != "yes" ] ; then
+ printf "\a"; sleep 1; printf "\a"; sleep 1
+ printf "\a"; sleep 1; printf "\a"; sleep 1
+ ewarn "Rebooting in 10 seconds ..."
+ sleep 10
+ fi
+ einfo "Rebooting"
+ /sbin/reboot -f
+ else
+ if [ "${RC_FORCE_AUTO}" = "yes" ] ; then
+ eend 2 "Rerunning fsck in force mode"
+ if [ "${RC_UNAME}" = "Linux" ] ; then
+ fsck -y -C -T /
+ else
+ fsck -y /
+ fi
+ retval=$?
+ else
+ eend 2 "Filesystem couldn't be fixed :("
+ [ "${RC_UNAME}" = "Linux" ] || return 1
+ sulogin "${CONSOLE}"
+ fi
+ if [ ${retval} != "0" ] ; then
+ einfo "Unmounting filesystems"
+ if [ "${RC_UNAME}" = "Linux" ] ; then
+ mount -a -o remount,ro /
+ else
+ mount -u -o ro /
+ fi
+ einfo "Rebooting"
+ reboot -f
+ fi
+ fi
+
+ ebegin "Remounting root filesystem read/write"
+ if [ "${RC_UNAME}" = "Linux" ] ; then
+ mount -n -o remount,rw /
+ else
+ mount -u -o rw /
+ fi
+ eend $? "Root filesystem could not be mounted read/write :(" || return 1
+
+ # Only Linux has mtab
+ [ "${RC_UNAME}" = "Linux" ] && do_mtab
+
+ # If the user's /dev/null or /dev/console are missing, we
+ # should help them out and explain how to rectify the situation
+ if [ ! -c /dev/null -o ! -c /dev/console ] ; then
+ if [ -e /usr/share/baselayout/issue.devfix ] ; then
+ # Backup current /etc/issue
+ if [ -e /etc/issue -a ! -e /etc/issue.devfix ] ; then
+ mv -f /etc/issue /etc/issue.devfix
+ fi
+ cp -f /usr/share/baselayout/issue.devfix /etc/issue
+ fi
+ fi
+
+ # We got here, so return 0
+ return 0
+}
+
+# vim: set ts=4 :