diff options
author | Roy Marples <roy@marples.name> | 2007-04-05 11:18:42 +0000 |
---|---|---|
committer | Roy Marples <roy@marples.name> | 2007-04-05 11:18:42 +0000 |
commit | 5af58b45146ab5253ca964738f4e45287bf963d4 (patch) | |
tree | 68d3a9a61fa55dd7fe273db776c375f797edaa5b /init.d/localmount |
Rewrite the core parts in C. We now provide librc so other programs can
query runlevels, services and state without using bash. We also provide
libeinfo so other programs can easily use our informational functions.
As such, we have dropped the requirement of using bash as the init script
shell. We now use /bin/sh and have strived to make the scripts as portable
as possible. Shells that work are bash and dash. busybox works provided
you disable s-s-d. If you have WIPE_TMP set to yes in conf.d/bootmisc you
should disable find too.
zsh and ksh do not work at this time.
Networking support is currently being re-vamped also as it was heavily bash
array based. As such, a new config format is available like so
config_eth0="1.2.3.4/24 5.6.7.8/16"
or like so
config_eth0="'1.2.3.4 netmask 255.255.255.0' '5.6.7.8 netmask 255.255.0.0'"
We will still support the old bash array format provided that /bin/sh IS
a link it bash.
ChangeLog for baselayout-1 can be found in our SVN repo.
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 : |