summaryrefslogtreecommitdiff
path: root/init.d/localmount.in
diff options
context:
space:
mode:
Diffstat (limited to 'init.d/localmount.in')
-rw-r--r--init.d/localmount.in87
1 files changed, 87 insertions, 0 deletions
diff --git a/init.d/localmount.in b/init.d/localmount.in
new file mode 100644
index 0000000..bc16f70
--- /dev/null
+++ b/init.d/localmount.in
@@ -0,0 +1,87 @@
+#!/sbin/runscript
+# Copyright 2007-2008 Roy Marples <roy@marples.name>
+# All rights reserved. Released under the 2-clause BSD license.
+
+description="Mounts disks and swap according to /etc/fstab."
+
+depend()
+{
+ need fsck
+ use modules mtab
+ keyword nojail noprefix
+}
+
+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
+}