aboutsummaryrefslogblamecommitdiffstats
path: root/main/nfs-utils/nfs.initd
blob: 6f6ba98ceb940bd4918397353c9ad324d52ce067 (plain) (tree)
1
2
3
4


                                                                  
                                                                                                           




















                                                                                                       
                                                               
                                                             
                   





























































































































                                                                               
#!/sbin/runscript
# Copyright 1999-2009 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/net-fs/nfs-utils/files/nfs.initd,v 1.19 2009/05/30 22:01:43 vapier Exp $

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
  mountd=/usr/sbin/rpc.mountd
    nfsd=/usr/sbin/rpc.nfsd
smnotify=/usr/sbin/sm-notify

depend() {
	local myneed=""
	if [ -e /etc/exports ] ; then
		if awk '!/^[[:space:]]*#/ && $2 ~ /sec=/ { exit 0 } END { exit 1 }' /etc/exports ; then
			myneed="${myneed} rpc.svcgssd"
		fi
	fi
	config /etc/exports
	need portmap rpc.statd ${myneed} ${NFS_NEEDED_SERVICES}
	use ypbind net dns rpc.rquotad rpc.idmapd rpc.svcgssd
	after quota
}

mkdir_nfsdirs() {
	local d
	for d in rpc_pipefs v4recovery v4root ; do
		d="/var/lib/nfs/${d}"
		[ ! -d "${d}" ] && mkdir -p "${d}"
	done
}

waitfor_exportfs() {
	local pid=$1
	( sleep ${EXPORTFS_TIMEOUT:-30}; kill -9 $pid 2>/dev/null ) &
	wait $1
}

mount_nfsd() {
	if [ -e /proc/modules ] ; then
		# Make sure nfs support is loaded in the kernel #64709
		if ! grep -qs nfsd /proc/filesystems ; then
			modprobe -q nfsd
		fi
		# Restart idmapd if needed #220747
		if grep -qs nfsd /proc/modules ; then
			killall -q -HUP rpc.idmapd
		fi
	fi

	# This is the new "kernel 2.6 way" to handle the exports file
	if grep -qs nfsd /proc/filesystems ; then
		if ! grep -qs "nfsd /proc/fs/nfsd" /proc/mounts ; then
			ebegin "Mounting nfsd filesystem in /proc"
			mount -t nfsd -o nodev,noexec,nosuid nfsd /proc/fs/nfsd
			eend $?
		fi
	fi
}

start_it() {
	ebegin "Starting NFS $1"
	shift
	"$@"
	eend $?
	ret=$((ret + $?))
}
start() {
	mount_nfsd
	mkdir_nfsdirs

	# 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 -qs '^[[:space:]]*/' /etc/exports ; then
		ebegin "Exporting NFS directories"
		${exportfs} -r &
		waitfor_exportfs $!
		eend $?
	fi

	local ret=0
	start_it mountd ${mountd} ${OPTS_RPC_MOUNTD}
	start_it daemon ${nfsd} ${OPTS_RPC_NFSD}
	[ -x "${smnotify}" ] && start_it smnotify ${smnotify} ${OPTS_SMNOTIFY}
	return ${ret}
}

stop() {
	local ret=0

	# 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 --oknodo --exec ${mountd}
	eend $?
	ret=$((ret + $?))

	# nfsd sets its process name to [nfsd] so don't look for $nfsd
	ebegin "Stopping NFS daemon"
	start-stop-daemon --stop --oknodo --name nfsd --user root --signal 2
	eend $?
	ret=$((ret + $?))
	# in case things don't work out ... #228127
	rpc.nfsd 0

	# 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 -o "${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 &
		waitfor_exportfs $!
		eend $?
	fi

	return ${ret}
}

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 $?
}

restart() {
	# See long comment in stop() regarding "restarting" and exportfs -ua
	restarting=yes
	svc_stop
	svc_start
}