diff options
Diffstat (limited to 'init.d/checkroot')
-rwxr-xr-x | init.d/checkroot | 149 |
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 : |