home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / boot / i386 / rescue / etc / init.d / boot.localfs < prev    next >
Text File  |  2006-11-29  |  8KB  |  301 lines

  1. #! /bin/sh
  2. #
  3. # Copyright (c) 2001-2002 SuSE Linux AG, Nuernberg, Germany.
  4. # All rights reserved.
  5. #
  6. # /etc/init.d/boot.localfs
  7. #
  8. ### BEGIN INIT INFO
  9. # Provides:          boot.localfs
  10. # Required-Start:    boot.udev boot.rootfsck
  11. # Should-Start:      boot.md boot.lvm dasd_devfs_compat boot.scsidev boot.multipath boot.evms boot.loadmodules
  12. # Required-Stop:
  13. # Default-Start:     B
  14. # Default-Stop:
  15. # Description:       check and mount local filesystems except /
  16. ### END INIT INFO
  17.  
  18. . /etc/rc.status
  19.  
  20. # to get max number of parallel fsck processes
  21. . /etc/sysconfig/boot
  22. . /etc/sysconfig/kernel
  23. . /etc/sysconfig/sysctl
  24.  
  25. if [ -f /etc/sysconfig/dump ]; then
  26.     . /etc/sysconfig/dump
  27. fi
  28.  
  29. export FSCK_MAX_INST
  30.  
  31. # helper shell function
  32. #
  33. reverse ()
  34. {
  35.     local _line
  36.     while read -r _line ; do
  37.     reverse
  38.     echo "$_line"
  39.     break
  40.     done
  41. }
  42.  
  43. list_missed ()
  44. {
  45.     local dev
  46.     local mount_opts="-t nonfs,nonfs4,noproc,nodevpts,nosmbfs,nocifs -O no_netdev"
  47.  
  48.     mount -afnv $mount_opts 2> /dev/null | while read line ; do
  49.     dev="${line%% *}"
  50.     case "$line" in
  51.     *mounted*)
  52.         continue      ;;
  53.     *)  test -b $dev && continue
  54.         echo "${dev}" ;;
  55.     esac
  56.     done
  57. }
  58.  
  59. wait_for_udev ()
  60. {
  61.     missing=$(list_missed)
  62.     if [ -z "$missing" ]; then
  63.     return
  64.     fi
  65.     echo -n "Waiting for $missing "
  66.     timeout=30
  67.     while [ "$timeout" -gt 0 ] ; do
  68.     sleep 1
  69.     echo ". "
  70.     still_missing=""
  71.     for dev in $missing; do
  72.         if [ ! -b $dev ] ; then
  73.         still_missing="$dev $still_missing"
  74.         fi
  75.     done
  76.     if [ -z "$still_missing" ]; then
  77.         echo "ok"
  78.         break;
  79.     fi
  80.     missing="$still_missing"
  81.     if [ ! -d /dev/.udev/queue ] ; then
  82.         echo "no more events"
  83.         break;
  84.     fi
  85.     timeout=$(( $timeout - 1 ))
  86.     done
  87.     if [ "$timeout" -eq 0 ] ; then
  88.     echo "timeout"
  89.     fi
  90. }
  91.  
  92. rc_reset
  93.  
  94. case "$1" in
  95.   start)
  96.     # handle DMAPI_PROBE here, boot.sysctl is too late
  97.     if test "$DMAPI_PROBE" = "yes" ; then
  98.         test -d /proc/sys/fs/xfs || modprobe xfs
  99.         test -e /proc/sys/fs/xfs/probe_dmapi && echo 1 > /proc/sys/fs/xfs/probe_dmapi
  100.     fi
  101.  
  102.     # rootfs is mounted rw, lvm et al should be up now
  103.     wait_for_udev
  104.     #
  105.     # If we use a serial console, don't use the fsck progress bar
  106.     #
  107.     FSCK_PROGRESSBAR="-V"
  108.         [ -x /sbin/showconsole ] && [ "`/sbin/showconsole`" = "/dev/tty1" ] && FSCK_PROGRESSBAR="-C"
  109.     #
  110.     # do fsck and start sulogin, if it fails.
  111.     #
  112.     FSCK_RETURN=0
  113.     if test ! -f /fastboot -a -z "$fastboot" ; then
  114.         FSCK_FORCE=""
  115.         test -f /forcefsck && FSCK_FORCE="-f"
  116.             echo "Checking file systems..."
  117.             fsck $FSCK_PROGRESSBAR -R -A -m -a $FSCK_FORCE -t noopts=hotplug
  118.             # A return code of 1 indicates that file system errors
  119.             # were corrected, but that the boot may proceed.
  120.             # A return code of 2 or larger indicates failure.
  121.             FSCK_RETURN=$?
  122.         test $FSCK_RETURN -lt 4
  123.         rc_status -v1 -r
  124.         if test $FSCK_RETURN -gt 1 -a $FSCK_RETURN -lt 4 ; then
  125.             # if appropriate, switch bootsplash to verbose 
  126.             # mode to make text messages visible.
  127.             test -f /proc/splash && echo "verbose" > /proc/splash
  128.             echo
  129.             echo "fsck succeed, but reboot is required."
  130.             echo
  131.             sleep 1
  132.             sync
  133.             reboot -f
  134.         elif test $FSCK_RETURN -gt 3; then
  135.             # if appropriate, switch bootsplash to verbose 
  136.             # mode to make text messages visible.
  137.             test -f /proc/splash && echo "verbose" > /proc/splash
  138.             # Stop blogd since we reboot after sulogin
  139.             test -x /sbin/blogd && killproc -QUIT /sbin/blogd
  140.             if test -x /etc/init.d/kbd ; then
  141.             /etc/init.d/kbd start
  142.             fi
  143.                 echo
  144.                 echo "fsck failed for at least one filesystem (not /)."
  145.             echo "Please repair manually and reboot."
  146.             echo "The root file system is is already mounted read-write."
  147.                 echo
  148.                 echo "Attention: Only CONTROL-D will reboot the system in this"
  149.                 echo "maintanance mode. shutdown or reboot will not work."
  150.                 echo
  151.                 PS1="(repair filesystem) # "
  152.                 export PS1
  153.                 /sbin/sulogin /dev/console
  154.  
  155.                 # if the user has mounted something rw, this should be umounted
  156.                 echo "Unmounting file systems (ignore error messages)"
  157.                 umount -avn
  158.  
  159.                 # on umsdos fs this would lead to an error message.
  160.             # so direct errors to /dev/null
  161.                 mount -no remount,ro / 2> /dev/null
  162.  
  163.                 sync
  164.                 reboot -f
  165.             fi
  166.             if test $FSCK_RETURN -gt 0; then
  167.                 sync
  168.             touch /fsck_corrected_errors
  169.         fi
  170.     fi
  171.  
  172.     #
  173.     # clean up
  174.     #
  175.     rm -f /etc/nologin /nologin /fastboot /forcefsck /success
  176.  
  177.     rc_status -v -r
  178.  
  179.     #
  180.     # Mount local filesystems in '/etc/fstab' (and create an entry
  181.     # for / and /proc).
  182.     #
  183.     echo "Mounting local file systems..."
  184.     mount -fv -t proc proc /proc
  185.     mount -fv -t sysfs sysfs /sys
  186.     while read a b ; do
  187.         if test "$b" = "debugfs" ; then
  188.         mount -fv -t debugfs debugfs /sys/kernel/debug
  189.         fi
  190.     done < /proc/filesystems
  191.     mount -fv -t tmpfs udev /dev
  192.     rc_status
  193.     if test ! -d /sys/block/loop0 ; then
  194.         /sbin/modprobe loop
  195.     fi
  196.     optpts="-o mode=0620,gid=5"
  197.     mount -fv -t devpts $optpts devpts /dev/pts
  198.     rc_status
  199.     mount -av -t nonfs,nonfs4,noproc,nodevpts,nosmbfs,nocifs -O no_netdev
  200.     rc_status -v1 -r
  201.     ;;
  202.     stop)
  203.     mounts=/etc/fstab
  204.     test -r /proc/mounts && mounts=/proc/mounts
  205.  
  206.     # move to intermezzo package ?
  207.     # First umount intermezzo filesystems
  208.     if test -x /usr/sbin/umountizo ; then
  209.         while read line ; do
  210.         case "$line" in
  211.         *[Ii][Nn][Tt][Ee][Rr][Mm][Ee][Zz][Zz][Oo]*)
  212.             /usr/sbin/umountizo >/dev/null 2>&1
  213.         esac
  214.         done < $mounts
  215.     fi
  216.  
  217.     reverse < $mounts | \
  218.     while read des fs type rest; do
  219.         case "$des"  in
  220.             ""|\#*)    continue ;;
  221.             /dev/loop*)
  222.                        umount $fs
  223.                        losetup $des &> /dev/null
  224.                        test $? -eq 0 && losetup -d $des ;;
  225.         esac
  226.         case "$fs"   in
  227.             /proc)     continue ;;
  228.             /dev/pts)  continue ;;
  229.             /dev)      continue ;;
  230.             /dev/shm)  continue ;;
  231.         esac
  232.         case "$type" in
  233.             proc)      umount -t proc     $fs ;;
  234.             devpts)    umount -t devpts   $fs ;;
  235.             tmpfs)     umount -t tmpfs    $fs ;;
  236.             usbfs)     umount -t usbfs    $fs ;;
  237.         esac
  238.     done
  239.  
  240.     while read major minor blocks name ; do
  241.         des=/dev/$name
  242.         case "$name" in
  243.         ""|\#*)    continue ;;
  244.         loop*)
  245.                    des=/dev/loop/${name#loop}
  246.                    losetup $des &> /dev/null
  247.                    test $? -eq 0 && losetup -d $des
  248.                des=/dev/$name
  249.                    losetup $des &> /dev/null
  250.                    test $? -eq 0 && losetup -d $des
  251.         esac
  252.     done < /proc/partitions
  253.  
  254.     UMOUNT_FAILED=false
  255.     echo "Unmounting file systems"
  256.     umount -avt noproc,nonfs,nonfs4,nosmbfs,nocifs,notmpfs || {
  257.         rc_status
  258.         UMOUNT_FAILED=true
  259.     }
  260.     rc_status -v1 -r
  261.  
  262.     if test "$UMOUNT_FAILED" = true ; then
  263.         echo "Oops: umount failed :-(  --  trying to remount readonly..."
  264.         mounts=/etc/fstab
  265.         test -r /proc/mounts && mounts=/proc/mounts
  266.         # Use cat and a pipe because umount changes
  267.         # /proc/mounts during direct read call
  268.         cat $mounts | \
  269.         while read des fs type rest; do
  270.             case "$des" in ""|\#*) continue ;; esac
  271.             case "$type" in
  272.                 swap)     continue ;; # No umount on swap devices
  273.                 proc)     continue ;; # Required
  274.                 nfs|nfs4)      continue ;; # Avoid hanging reboot/halt
  275.                 smbfs|cifs)    continue ;; # Avoid hanging reboot/halt
  276.             esac
  277.             mount -v -n -o remount,ro $fs
  278.         done
  279.  
  280.         echo "extra sync..."
  281.         sync; sync
  282.         echo "... hope now it's ok to reboot."
  283.     fi
  284.     ;;
  285.     restart)
  286.     rc_failed 3
  287.     rc_status -v
  288.     ;;
  289.     status)
  290.     rc_failed 4
  291.     rc_status -v
  292.     ;;
  293.     *)
  294.     echo "Usage: $0 {start|stop|status|restart}"
  295.     exit 1
  296.     ;;
  297. esac
  298.  
  299. rc_exit
  300.  
  301.