nfs.initd 4.09 KB
Newer Older
Carlo Landmeter's avatar
Carlo Landmeter committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
#!/sbin/runscript
# Copyright 1999-2009 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/www/viewcvs.gentoo.org/raw_cvs/gentoo-x86/net-fs/nfs-utils/files/nfs.initd,v 1.18 2009/02/27 01:41:55 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}
	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
}