#! /bin/sh ### BEGIN INIT INFO # Provides: umountfs # Required-Start: # Required-Stop: umountroot # Default-Start: # Default-Stop: 0 6 # Short-Description: Turn off swap and unmount all local file systems. # Description: ### END INIT INFO PATH=/sbin:/usr/sbin:/bin:/usr/bin . /lib/init/vars.sh . /lib/lsb/init-functions umask 022 do_stop () { PROTECTED_MOUNTS="$(sed -n ':a;/^[^ ]* \/ /!{H;n;ba};{H;s/.*//;x;s/\n//;p}' /proc/mounts)" WEAK_MTPTS="" # be gentle, don't use force REG_MTPTS="" TMPFS_MTPTS="" while read -r DEV MTPT FSTYPE REST do echo "$PROTECTED_MOUNTS" | grep -qs "^$DEV $MTPT " && continue case "$MTPT" in /|/proc|/dev|/.dev|/dev/pts|/dev/shm|/dev/.static/dev|/proc/*|/sys|/sys/*|/run|/run/*|/dev/vcs) continue ;; esac case "$FSTYPE" in proc|procfs|linprocfs|sysfs|usbfs|usbdevfs|devpts) continue ;; tmpfs) TMPFS_MTPTS="$MTPT $TMPFS_MTPTS" ;; *) if echo "$PROTECTED_MOUNTS" | grep -qs "^$DEV "; then WEAK_MTPTS="$MTPT $WEAK_MTPTS" else REG_MTPTS="$MTPT $REG_MTPTS" fi ;; esac done < /proc/mounts # # Make sure tmpfs file systems are umounted before turning off # swap, to avoid running out of memory if the tmpfs filesystems # use a lot of space. # if [ "$TMPFS_MTPTS" ] then if [ "$VERBOSE" = no ] then log_action_begin_msg "Unmounting temporary filesystems" fstab-decode umount $TMPFS_MTPTS log_action_end_msg $? else log_daemon_msg "Will now unmount temporary filesystems" fstab-decode umount -v $TMPFS_MTPTS log_end_msg $? fi fi # # Deactivate swap # if [ "$VERBOSE" = no ] then log_action_begin_msg "Deactivating swap" swapoff -a >/dev/null log_action_end_msg $? else log_daemon_msg "Will now deactivate swap" swapoff -a -v log_end_msg $? fi # # Unmount local filesystems # if [ "$WEAK_MTPTS" ]; then # Do not use -f umount option for WEAK_MTPTS if [ "$VERBOSE" = no ] then log_action_begin_msg "Unmounting weak filesystems" fstab-decode umount -r -d $WEAK_MTPTS log_action_end_msg $? else log_daemon_msg "Will now unmount weak filesystems" fstab-decode umount -v -r -d $WEAK_MTPTS log_end_msg $? fi fi if [ "$REG_MTPTS" ] then if [ "$VERBOSE" = no ] then log_action_begin_msg "Unmounting local filesystems" fstab-decode umount -f -r -d $REG_MTPTS log_action_end_msg $? else log_daemon_msg "Will now unmount local filesystems" fstab-decode umount -f -v -r -d $REG_MTPTS log_end_msg $? fi fi } case "$1" in start|status) # No-op ;; restart|reload|force-reload) echo "Error: argument '$1' not supported" >&2 exit 3 ;; stop) do_stop ;; *) echo "Usage: $0 start|stop" >&2 exit 3 ;; esac :