diff options
Diffstat (limited to 'sys-freebsd/freebsd-usbin/files/nfs.initd')
-rwxr-xr-x | sys-freebsd/freebsd-usbin/files/nfs.initd | 209 |
1 files changed, 209 insertions, 0 deletions
diff --git a/sys-freebsd/freebsd-usbin/files/nfs.initd b/sys-freebsd/freebsd-usbin/files/nfs.initd new file mode 100755 index 0000000..d99017f --- /dev/null +++ b/sys-freebsd/freebsd-usbin/files/nfs.initd @@ -0,0 +1,209 @@ +#!/sbin/runscript +# Copyright 1999-2005 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/sys-freebsd/freebsd-usbin/files/nfs.initd,v 1.2 2007/04/06 14:47:17 uberlord Exp $ + +#--------------------------------------------------------------------------- +# This script starts/stops the following +# rpc.statd if necessary (also checked by init.d/nfsmount) +# rpc.rquotad if exists (from quota package) +# rpc.nfsd +# rpc.mountd +#--------------------------------------------------------------------------- + +# NB: Config is in /etc/conf.d/nfs + +opts="reload" + +# This variable is used for controlling whether or not to run exportfs -ua; +# see stop() for more information +restarting=no + +# The binary locations +exportfs=/usr/sbin/exportfs +statd=/usr/sbin/rpc.statd +idmapd=/usr/sbin/rpc.idmapd +rquotad=/usr/sbin/rpc.rquotad +nfsd=/usr/sbin/rpc.nfsd +mountd=/usr/sbin/rpc.mountd + +depend() { + use ypbind net + need rpcbind + after quota +} + +start_idmapd() { + [ ! -x "${idmapd}" ] && return 0 + + if grep -q rpc_pipefs /proc/filesystems ; then + if ! grep -q "rpc_pipefs /var/lib/nfs/rpc_pipefs" /proc/mounts ; then + [ ! -d /var/lib/nfs/rpc_pipefs ] && mkdir -p /var/lib/nfs/rpc_pipefs + ebegin "Mounting RPC pipefs" + mount -t rpc_pipefs rpc_pipefs /var/lib/nfs/rpc_pipefs + eend $? + fi + fi + + ebegin "Starting idmapd" + ${idmapd} ${RPCIDMAPDOPTS} + eend $? +} + +stop_idmapd() { + [ ! -x ${idmapd} ] && return 0 + + ebegin "Stopping idmapd" + start-stop-daemon --stop --quiet --exec ${idmapd} + ret=$? + eend ${ret} + + if [ $restarting = "no" -a "${RC_CMD}" != "restart" ] ; then + if grep -q "rpc_pipefs /var/lib/nfs/rpc_pipefs" /proc/mounts ; then + ebegin "Unmounting RPC pipefs" + umount /var/lib/nfs/rpc_pipefs + eend $? + fi + fi + + return ${ret} +} + +start_statd() { + # Don't start rpc.statd if already started by init.d/nfsmount + killall -0 rpc.statd 2>/dev/null && return 0 + ebegin "Starting NFS statd" + start-stop-daemon --start --quiet --exec \ + $statd -- $RPCSTATDOPTS 1>&2 + eend $? "Error starting NFS statd" +} + +stop_statd() { + # Don't stop rpc.statd if it's in use by init.d/nfsmount. + mount -t nfs | grep -q . && return 0 + # Make sure it's actually running + killall -0 rpc.statd 2>/dev/null || return 0 + # Okay, all tests passed, stop rpc.statd + ebegin "Stopping NFS statd" + start-stop-daemon --stop --quiet --exec $statd 1>&2 + eend $? "Error stopping NFS statd" +} + +waitfor_exportfs() { + local pid=$1 + ( sleep ${EXPORTFSTIMEOUT:-30}; kill -9 $pid 2>/dev/null ) & + wait $1 +} + +start() { + # Make sure nfs support is loaded in the kernel #64709 + if [ -e /proc/modules ] ; then + modprobe nfsd &> /dev/null + fi + + # This is the new "kernel 2.6 way" to handle the exports file + if grep -q nfsd /proc/filesystems 2>/dev/null; then + if ! grep -q "nfsd /proc/fs/nfs" /proc/mounts 2>/dev/null; then + ebegin "Mounting nfsd filesystem in /proc" + mount -t nfsd nfsd /proc/fs/nfs + eend $? "Error mounting nfsd filesystem in /proc" + fi + fi + # now that nfsd is mounted inside /proc, we can safely start mountd later + + start_idmapd + start_statd + + # Exportfs likes to hang if networking isn't working. + # If that's the case, then try to kill it so the + # bootup process can continue. + if grep -q '^/' /etc/exports 2>/dev/null; then + ebegin "Exporting NFS directories" + $exportfs -r 1>&2 & + waitfor_exportfs $! + eend $? "Error exporting NFS directories" + fi + + if [ -x "${rquotad}" ]; then + ebegin "Starting NFS rquotad" + start-stop-daemon --start --quiet --exec \ + $rquotad -- $RPCRQUOTADOPTS 1>&2 + eend $? "Error starting NFS rquotad" + fi + + ebegin "Starting NFS daemon" + start-stop-daemon --start --quiet --exec \ + $nfsd -- $RPCNFSDCOUNT 1>&2 + eend $? "Error starting NFS daemon" + + # Start mountd + ebegin "Starting NFS mountd" + start-stop-daemon --start --quiet --exec \ + $mountd -- $RPCMOUNTDOPTS 1>&2 + eend $? "Error starting NFS mountd" +} + +stop() { + # Don't check NFSSERVER variable since it might have changed, + # instead use --oknodo to smooth things over + ebegin "Stopping NFS mountd" + start-stop-daemon --stop --quiet --oknodo \ + --exec $mountd 1>&2 + eend $? "Error stopping NFS mountd" + + # nfsd sets its process name to [nfsd] so don't look for $nfsd + ebegin "Stopping NFS daemon" + start-stop-daemon --stop --quiet --oknodo \ + --name nfsd --user root --signal 2 1>&2 + eend $? "Error stopping NFS daemon" + + if [ -x $rquotad ]; then + ebegin "Stopping NFS rquotad" + start-stop-daemon --stop --quiet --oknodo \ + --exec $rquotad 1>&2 + eend $? "Error stopping NFS rquotad" + fi + + # When restarting the NFS server, running "exportfs -ua" probably + # isn't what the user wants. Running it causes all entries listed + # in xtab to be removed from the kernel export tables, and the + # xtab file is cleared. This effectively shuts down all NFS + # activity, leaving all clients holding stale NFS filehandles, + # *even* when the NFS server has restarted. + # + # That's what you would want if you were shutting down the NFS + # server for good, or for a long period of time, but not when the + # NFS server will be running again in short order. In this case, + # then "exportfs -r" will reread the xtab, and all the current + # clients will be able to resume NFS activity, *without* needing + # to umount/(re)mount the filesystem. + if [ "$restarting" = no -a "${RC_CMD}" != "restart" ]; then + ebegin "Unexporting NFS directories" + # Exportfs likes to hang if networking isn't working. + # If that's the case, then try to kill it so the + # shutdown process can continue. + $exportfs -ua 1>&2 & + waitfor_exportfs $! + eend $? "Error unexporting NFS directories" + fi + + stop_statd + stop_idmapd +} + +reload() { + # Exportfs likes to hang if networking isn't working. + # If that's the case, then try to kill it so the + # bootup process can continue. + ebegin "Reloading /etc/exports" + $exportfs -r 1>&2 & + waitfor_exportfs $! + eend $? "Error exporting NFS directories" +} + +restart() { + # See long comment in stop() regarding "restarting" and exportfs -ua + restarting=yes + svc_stop + svc_start +} |