diff options
author | Andrew Wilcox <andy@protium.com> | 2006-12-23 22:31:49 +0000 |
---|---|---|
committer | Andrew Wilcox <andy@protium.com> | 2006-12-23 22:31:49 +0000 |
commit | e5441b24a296d7ce2e17df3c9d3da8cfe7c06efd (patch) | |
tree | 6305715026eb5463b312d1e83d8033925a9b8255 | |
parent | 0b11231c7c8ccf42d17b3ea668bee2ac8f2af876 (diff) |
initscripts-openprotium: improved checking for the root filesystem in
checkroot.sh
3 files changed, 214 insertions, 53 deletions
diff --git a/packages/initscripts/initscripts-1.0/openprotium/checkroot.sh b/packages/initscripts/initscripts-1.0/openprotium/checkroot.sh new file mode 100755 index 0000000000..c69a773482 --- /dev/null +++ b/packages/initscripts/initscripts-1.0/openprotium/checkroot.sh @@ -0,0 +1,212 @@ +# +# checkroot.sh Check to root filesystem. +# +# Version: @(#)checkroot.sh 2.84 25-Jan-2002 miquels@cistron.nl +# + +. /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 + +# +# Ensure that bdflush (update) is running before any major I/O is +# performed (the following fsck is a good example of such activity :). +# +test -x /sbin/update && update + +# +# Read /etc/fstab. +# +exec 9>&0 </etc/fstab +rootmode=rw +rootopts=rw +test "$ENABLE_ROOTFS_FSCK" = yes && rootcheck="yes" || rootcheck="no" +swap_on_md=no +devfs= +while read fs mnt type opts dump pass junk +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" + + # Currently we do not care about the other entries + if test "$mnt" = "/" + then + #echo "[$fs] [$mnt] [$type] [$opts] [$dump] [$pass] [$junk]" + + rootopts="$opts" + roottype="$type" + + #The "spinner" is broken on busybox sh + TERM=dumb + + test "$pass" = 0 -o "$pass" = "" && rootcheck=no + + # Enable fsck for ext2 and ext3 rootfs, disable for everything else + case "$type" in + ext2|ext3) rootcheck=yes;; + *) rootcheck=no;; + esac + + if test "$rootcheck" = yes + then + if ! test -x "/sbin/fsck.${roottype}" + then + echo -e "\n * * * WARNING: /sbin/fsck.${roottype} is missing! * * *\n" + rootcheck=no + fi + fi + + case "$opts" in + ro|ro,*|*,ro|*,ro,*) + rootmode=ro + ;; + esac + fi +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. +# +doswap=no +test -d /proc/1 || mount -n /proc +case "`uname -r`" in + 2.[0123].*) + if test $swap_on_md = yes && grep -qs resync /proc/mdstat + then + test "$VERBOSE" != no && echo "Not activating swap - RAID array resyncing" + else + doswap=yes + fi + ;; + *) + doswap=yes + ;; +esac +if test $doswap = yes +then + test "$VERBOSE" != no && echo "Activating swap" + swapon -a 2> /dev/null +fi + +# +# 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. + # + + echo "RETURNCODE: [$RTC]" + + if test "$RTC" -gt 3 + then + + # Since this script is run very early in the boot-process, it should be safe to assume that the + # output is printed to VT1. However, some distributions use a bootsplash to hide the "ugly" boot + # messages and having the bootsplash "hang" due to a waiting fsck prompt is less than ideal + chvt 1 + + # 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. " + echo "Please note that the root filesystem is currently " + echo "mounted read-only. To remount it read-write:" + echo + echo " # mount -n -o remount,rw /" + echo + echo "CONTROL-D will exit from this shell" + echo "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 + +devrootfound=$(grep "/dev/root" /proc/mounts | \ + awk '{if ($4 = /rw/) print "found";}' ) + +if [ -n "$devrootfound" -a "$devrootfound" = "found" ]; then + echo "Read/write /dev/root found." + exit 0 +fi + +if mount -vf -o remount / 2> /dev/null | \ + awk '{if ($6 ~ /rw/) exit 0; else exit 1; }' && \ + ! touch -c / 2> /dev/null + then + echo " Remounting root filesystem read/write" + mount -n -o remount,$rootmode / +fi + +if test "$rootmode" = rw +then + if test ! -L /etc/mtab + then + rm -f /etc/mtab~ /etc/nologin + : > /etc/mtab + fi + mount -f -o remount / + mount -f /proc + test "$devfs" && grep -q '^devfs /dev' /proc/mounts && mount -f "$devfs" +fi + +: exit 0 diff --git a/packages/initscripts/initscripts-1.0/openprotium/devices.patch b/packages/initscripts/initscripts-1.0/openprotium/devices.patch deleted file mode 100644 index 2583b62f48..0000000000 --- a/packages/initscripts/initscripts-1.0/openprotium/devices.patch +++ /dev/null @@ -1,52 +0,0 @@ -# -# Patch to allow /dev to reside permanently in the file -# system. -# ---- old/devices 2005-05-28 21:51:39.012078699 -0700 -+++ new/devices 2005-06-12 00:16:29.222686303 -0700 -@@ -6,7 +6,7 @@ - . /etc/default/rcS - - # exit without doing anything if udev is active --if test -e /dev/.udev -o -e /dev/.udevdb; then -+if test -e /dev/.udev -o -e /dev/.udevdb -o -e /dev/.permanent; then - exit 0 - fi - -@@ -37,12 +37,20 @@ - mknod /dev/ppp c 108 0 - if test "$VERBOSE" != "no"; then echo "done"; fi - else -- if test "$VERBOSE" != "no"; then echo -n "Mounting /dev ramdisk: "; fi -- mount -t ramfs ramfs /dev || mount -t tmpfs ramfs /dev -- if test $? -ne 0; then -- if test "$VERBOSE" != "no"; then echo "failed"; fi -+ if test -e /dev/.noram -+ then -+ # There should be no files, any files will damage the -+ # makedevs script below. -+ rm $(find /dev -type f -print) -+ :>/dev/.noram - else -- if test "$VERBOSE" != "no"; then echo "done"; fi -+ if test "$VERBOSE" != "no"; then echo -n "Mounting /dev ramdisk: "; fi -+ mount -t ramfs ramfs /dev || mount -t tmpfs ramfs /dev -+ if test $? -ne 0; then -+ if test "$VERBOSE" != "no"; then echo "failed"; fi -+ else -+ if test "$VERBOSE" != "no"; then echo "done"; fi -+ fi - fi - if test "$VERBOSE" != "no"; then echo -n "Populating /dev: "; fi - cd / -@@ -60,6 +68,10 @@ - if test "$VERBOSE" != "no"; then echo "failed"; fi - else - if test "$VERBOSE" != "no"; then echo "done"; fi -+ if test -e /dev/.noram -+ then -+ :>/dev/.permanent -+ fi - fi - fi - diff --git a/packages/initscripts/initscripts-openprotium_1.0.bb b/packages/initscripts/initscripts-openprotium_1.0.bb index 4266211dba..31f25ce230 100644 --- a/packages/initscripts/initscripts-openprotium_1.0.bb +++ b/packages/initscripts/initscripts-openprotium_1.0.bb @@ -23,7 +23,7 @@ SRC_URI += "file://openprotium/devices" SRC_URI += "file://openprotium/halt" SRC_URI += "file://openprotium/reboot" SRC_URI += "file://openprotium/flashclean" -SRC_URI += "file://openprotium/devices.patch;patch=1" +SRC_URI += "file://openprotium/checkroot.sh" # Without this it is not possible to patch checkroot.sh S = "${WORKDIR}" @@ -43,6 +43,7 @@ do_install_append() { install -m 0755 ${WORKDIR}/openprotium/reboot ${D}${sysconfdir}/init.d install -m 0755 ${WORKDIR}/openprotium/devices ${D}${sysconfdir}/init.d install -m 0755 ${WORKDIR}/openprotium/flashclean ${D}${sysconfdir}/init.d + install -m 0755 ${WORKDIR}/openprotium/checkroot.sh ${D}${sysconfdir}/init.d # Remove the do install links (this detects a change to the # initscripts .bb file - it will cause a build failure here.) |