All pastes #33022 Raw Edit

Anonymous

public text v1 · immutable
#33022 ·published 2005-12-08 22:12 UTC
rendered paste body
#! /bin/sh
### BEGIN INIT INFO
# Provides:          mountvirtfs
# Required-Start:
# Required-Stop:
# Default-Start:     S
# Default-Stop:
# Short-Description: Mount virtual (kernel) file systems.
# Description:       Mount all the virtual filesystems the kernel
#                    provides and that are required by default.
#
#                    This script can be called several times without
#                    damage; it tries to mount the virtual filesystems
#                    only if not mounted yet, and only updates /etc/mtab
#                    if it is writable and there is a need to.
#
#                    This functionality was previously provided by
#                    mountkernfs from the glibc package.
### END INIT INFO
#
# Version:      @(#)mountvirtfs  2.85-23  29-Jul-2004  miquels
#

# Script needs to be robust and continue when parts fail,
# so we're not setting the "-e" flag.
#set -e

PATH=/lib/init:/bin:/sbin

. /lib/init/functions.sh

TTYGRP=5
TTYMODE=620
if [ -f /etc/default/devpts ]
then
        . /etc/default/devpts
fi

TMPFS_SIZE=
if [ -f /etc/default/tmpfs ]
then
        . /etc/default/tmpfs
fi

KERNEL=`uname -s`
umask 022

domount () {

        # Directory present ?
        if [ ! -d $3 ]
        then
                return
        fi

        # Do we support this filesystem type ?
        TYPE=
        if [ "$1" = proc ]
        then
                case "$KERNEL" in
                        Linux|GNU)
                                TYPE=proc
                                ;;
                        *FreeBSD)
                                TYPE=linprocfs
                                ;;
                        *)
                                TYPE=procfs
                                ;;
                esac
        elif grep -E -qs "$1\$" /proc/filesystems
        then
                TYPE=$1
        elif grep -E -qs "$2\$" /proc/filesystems
        then
                TYPE=$2
        fi
        if [ "$TYPE" = "" ]
        then
                return
        fi

        #
        #       Get the options from /etc/fstab.
        #
        OPTS=
        if [ -f /etc/fstab ]
        then
                exec 9<&0 0</etc/fstab
                while read FDEV FDIR FTYPE FOPTS REST
                do
                        case "$FDEV" in
                                ""|\#*)
                                        continue
                                        ;;
                        esac
                        if [ "$3" != "$FDIR" ] || [ "$TYPE" != "$FTYPE" ]
                        then
                                continue
                        fi
                        case "$FOPTS" in
                                noauto|*,noauto|noauto,*|*,noauto,*)
                                        return
                                        ;;
                                ?*)
                                        OPTS="-o$FOPTS"
                                        ;;
                        esac
                        break
                done
                exec 0<&9 9<&-
        fi

        # See if anything is mounted yet
        if ! mountpoint -q $3
        then
                # No, do it now
                mount $MOUNT_N -t $TYPE $OPTS $4 $TYPE $3
        else
                # Need to update mtab only ?
                if [ -n "$DO_MTAB" ] &&
                   ! grep -E -sq "^([^ ]+) +$3 +" /etc/mtab
                then
                                mount -f -t $TYPE $OPTS $4 $TYPE $3
                fi
        fi
}
do_start () {
        #
        #       If /etc/mtab is a symlink into /proc/ then we assume
        #       it is not writable.
        #
        DO_MTAB=
        MOUNT_N=-n
        MTAB_PATH="`readlink -f /etc/mtab || :`"
        case "$MTAB_PATH" in
                /proc/*)
                        ;;
                /*)
                        # Only update mtab if it is writable
                        if touch $MTAB_PATH > /dev/null 2>&1
                        then
                                DO_MTAB=Yes
                                MOUNT_N=
                        fi
                        ;;
        esac

        if [ -n "$DO_MTAB" ] && [ ! -f /etc/mtab ]
        then
                :> /etc/mtab
        fi

        if selinux_enabled && [ -x /sbin/restorecon ] && [ -r /etc/mtab ]; then
                /sbin/restorecon /etc/mtab
        fi

        # Mount standard /proc and /sys.
        domount proc "" /proc
        domount sysfs "" /sys

        # Mount /dev/pts. Create master ptmx node if needed.
        #
        # As of 2.5.68, devpts is not automounted when using devfs. So we
        # mount devpts if it is compiled in (older devfs didn't require it
        # to be compiled in at all).
        #
        if [ "$KERNEL" = Linux ]
        then
                #
                #       Since kernel 2.5.something, devfs doesn't include
                #       a standard /dev/pts directory anymore. So if devfs
                #       is mounted on /dev we need to create that directory
                #       manually.
                #
                if grep -qs '/dev devfs' /proc/mounts
                then
                        if [ ! -d /dev/pts ]
                        then
                                mkdir /dev/pts
                        fi
                fi
                if [ -d /dev/pts ]
                then
                        if dir_writable /dev && [ ! -c /dev/ptmx ]
                        then
                                mknod --mode=666 /dev/ptmx c 5 2
                        fi
                        domount devpts "" /dev/pts -ogid=$TTYGRP,mode=$TTYMODE
                fi
        fi

        # Mount tmpfs.
        #
        # Around kernel version 2.3.3x, a memory based filesystem was
        # introduced to support POSIX shared memory, called shmfs.
        # Later this filesystem was extended for general usage -
        # provided you set the CONFIG_TMPFS compile option and mount
        # it as type tmpfs.
        #
        # Early in the 2.4 kernel series, shmfs was renamed to tmpfs, but
        # you could mount it using both type shmfs and tmpfs. Starting
        # at kernel version 2.5.44, the shmfs alias was dropped.
        #
        # Confusingly, in kernels 2.3.x - 2.5.43 where both shmfs and
        # tmpfs are present, disabling CONFIG_TMPFS actually removes
        # support for shmfs, but tmpfs is still listed in /proc/filesystems
        # to support SYSV and POSIX shared memory, and it should still be
        # mounted under /dev/shm.
        #
        # Recommendation: always enable CONFIG_TMPFS and always mount
        # using the tmpfs type. Forget about shmfs.
        #
        # Tmpfs can be used as memory filesystem, so you can limit tmpfs
        # max size using /etc/default/tmpfs to prevent tmpfs from using
        # up all system memory.
        #
        if [ -n "$TMPFS_SIZE" ]
        then
                tmpfs_opt="-osize=${TMPFS_SIZE}"
        fi
        domount tmpfs shmfs /dev/shm $tmpfs_opt

        # Mount usbfs/usbdevfs if /proc/bus/usb is present.
        #
        # Usbfs/usbdevfs is used for USB related binaries/libraries.
        # "usbfs" and "usbdevfs" are the exact same filesystem.
        # "usbdevfs" was renamed to "usbfs" by linux usb developers,
        # because people sometimes mistook it as a part of devfs. Usbfs
        # will be superseded by other filesystems (e.g. sysfs), and when
        # it becomes obsolete the mount action below should be removed.
        #
        if [ -d /proc/bus/usb ]
        then
                domount usbfs usbdevfs /proc/bus/usb
        fi
}

case "$1" in
    start)
        do_start
        ;;
    restart|reload|force-reload)
        echo "Error: argument '$1' not supported" >&2
        exit 3
        ;;
    stop)
        ;;
    *)
        echo "Usage: $0 start|stop" >&2
        exit 3
        ;;
esac