#!/sbin/runscript # Copyright 2007 Roy Marples # All rights reserved # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. description="Mounts disks and swap according to /etc/fstab." depend() { need checkfs } start() { # Mount local filesystems in /etc/fstab. local types="noproc" x= for x in ${net_fs_list}; do types="${types},${x}" done ebegin "Mounting local filesystems" mount -at "${types}" eend $? "Some local filesystem failed to mount" # Always return 0 - some local mounts may not be critical for boot return 0 } stop() { # Don't unmount anything for VPS systems [ "${RC_SYS}" = "VPS" ] && return 0 # We never unmount / or /dev or $RC_SVCDIR local x= no_umounts="/|/dev|/dev/.*|${RC_SVCDIR}" # RC_NO_UMOUNTS is an env var that can be set by plugins OIFS=${IFS} SIFS=${IFS-y} IFS=$IFS: for x in ${no_umounts} ${RC_NO_UMOUNTS}; do no_umounts="${no_umounts}|${x}" done if [ "${SIFS}" = "y" ]; then IFS=$OIFS else unset IFS fi if [ "${RC_UNAME}" = "Linux" ]; then no_umounts="${no_umounts}|/proc|/proc/.*|/sys|/sys/.*" fi no_umounts="^(${no_umounts})$" # Flush all pending disk writes now sync; sync # Try to unmount all tmpfs filesystems not in use, else a deadlock may # occure, bug #13599. # As $RC_SVCDIR may also be tmpfs we cd to it to lock it cd "${RC_SVCDIR}" umount -a -t tmpfs 2>/dev/null . "${RC_LIBDIR}"/sh/rc-mount.sh # Umount loopback devices einfo "Unmounting loopback devices" eindent do_unmount "umount -d" --skip-point-regex "${no_umounts}" \ --node-regex "^/dev/loop" eoutdent # Now everything else, except network filesystems as the # network should be down by this point. einfo "Unmounting filesystems" eindent local fs= for x in ${net_fs_list}; do fs="${fs}${fs:+|}${x}" done [ -n "${fs}" ] && fs="^(${fs})$" do_unmount "umount" --skip-point-regex "${no_umounts}" \ ${fs:+--skip-fstype-regex} ${fs} --nonetdev eoutdent return 0 } # vim: set ts=4 :