diff options
Diffstat (limited to 'init.d/localmount')
-rwxr-xr-x | init.d/localmount | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/init.d/localmount b/init.d/localmount new file mode 100755 index 00000000..303f5a2c --- /dev/null +++ b/init.d/localmount @@ -0,0 +1,183 @@ +#!/sbin/runscript +# Copyright 1999-2007 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +depend() { + need checkfs +} + +start() { + # Mount local filesystems in /etc/fstab. + local types="noproc" x= + for x in ${RC_NET_FS_LIST} ; do + types="${types},${x}" + done + + ebegin "Mounting local filesystems" + mount -at "${types}" + eend $? "Some local filesystem failed to mount" + + # Change the mount options of already mounted paritions + # This is needed when /usr is separate and coming back from single user + if [ "${RC_UNAME}" != "Linux" ] ; then + mount -uao fstab -t "${types},linprocfs" + fi + + if [ -x /sbin/savecore ] ; then + local dumpdir=${KERNEL_DUMP_DIR:-/var/crash} + if ! [ -d "${dumpdir}" ]; then + mkdir -p "${dumpdir}" + chmod 700 "${dumpdir}" + fi + + # Don't quote ${KERNEL_DUMP_DEVICE}, so that if it's unset, savecore + # will check on the partitions listed in fstab without errors in the + # output + if savecore -C "${dumpdir}" ${KERNEL_DUMP_DEVICE} >/dev/null ; then + local savecoreopts="${dumpdir} ${KERNEL_DUMP_DEVICE}" + [ "${KERNEL_DUMP_COMPRESS}" = "yes" ] \ + && savecoreopts="-z ${savecoreopts}" + ebegin "Saving kernel core dump in" "${dumpdir}" + savecore ${savecoreopts} >/dev/null + eend $? + fi + fi + + # Sync bootlog now as /var should be mounted + if type bootlog >/dev/null 2>/dev/null ; then + bootlog sync 2>/dev/null + fi + + # Make sure we insert usbcore if its a module + if [ -f /proc/modules -a ! -d /proc/bus/usb ] ; then + # >/dev/null to hide errors from non-USB users + modprobe usbcore &> /dev/null + fi + + if [ -e /proc/filessystems ] ; then + # Check what USB fs the kernel support. Currently + # 2.5+ kernels, and later 2.4 kernels have 'usbfs', + # while older kernels have 'usbdevfs'. + if [ -d /proc/bus/usb -a ! -e /proc/bus/usb/devices ] ; then + local usbfs=$(grep -Fow usbfs /proc/filesystems || + grep -Fow usbdevfs /proc/filesystems) + + if [ -n "${usbfs}" ] ; then + ebegin $"Mounting USB device filesystem" "(${usbfs})" + local usbgid="$(getent group usb | \ + sed -e 's/.*:.*:\(.*\):.*/\1/')" + mount -t ${usbfs} \ + -o ${usbgid:+devmode=0664,devgid=${usbgid},}noexec,nosuid \ + usbfs /proc/bus/usb + eend $? + fi + fi + + # Setup Kernel Support for miscellaneous Binary Formats + if [ -d /proc/sys/fs/binfmt_misc ] ; then + if [ -n "$(grep -Fow binfmt_misc /proc/filesystems)" ] ; then + ebegin "Mounting misc binary format filesystem" + mount -t binfmt_misc -o nodev,noexec,nosuid \ + binfmt_misc /proc/sys/fs/binfmt_misc + eend $? + fi + fi + if [ -d /sys/kernel/security ] ; then + if [ -n "$(grep -Fow securityfs /proc/filesystems)" ] ; then + ebegin "Mounting security filesystem" + mount -t securityfs securityfs /sys/kernel/security \ + -o nodev,noexec,nosuid + eend $? + fi + fi + fi + + # We do our swapping here instead of rc so we can get urandom started + # before us for people that like an encrypted swap. + ebegin "Activating (possible) swap" + swapon -a >/dev/null + eend 0 # If swapon has nothing todo it errors, so always return 0 + + # Start dm-crypt mappings, if any + start_addon dm-crypt + + # Setup any user requested dump device + if [ -x /sbin/dumpon -a -n "${KERNEL_DUMP_DEVICE}" ] ; then + ebegin "Activating kernel core dump device" "(${KERNEL_DUMP_DEVICE})" + dumpon "${KERNEL_DUMP_DEVICE}" + eend $? + fi + + # 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_LIBDIR + local x= no_umounts="/|/dev|${RC_SVCDIR}" + + # NO_UMOUNTS is taken from /etc/conf.d/localmount + # RC_NO_UMOUNTS is taken from /etc/conf.d/rc and can also be + # set by plugins + local 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}|/dev/pts|/dev/shm|/proc|/proc/.*|/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 + + # As we're turning off swap below, we need to disable kernel dumps + [ -x /sbin/dumpon ] && dumpon off + + local swap_list= + # Turn off swap + if [ -r /proc/swaps ] ;then + swap_list=$(sed -e '1d' /proc/swaps) + else + swap_list=$(swapctl -l 2>/dev/null | sed -e '1d') + fi + if [ -n "${swap_list}" ] ; then + ebegin "Deactivating swap" + swapoff -a >/dev/null + eend $? + fi + + . "${RC_LIBDIR}"/sh/rc-mount.sh + + # Umount loopback devices + einfo "Unmounting loopback devices" + eindent + do_unmount "umount -d" "${no_umounts}" "^/dev/loop" + eoutdent + + # Now everything else + einfo "Unmounting filesystems" + eindent + do_unmount "umount" "${no_umounts}" + eoutdent + + return 0 +} + +# vim: set ts=4 : |