#! /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