#!/sbin/openrc-run # Copyright 1999-2024 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 extra_started_commands="reload" # 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="" # XXX: no way to detect NFSv4 is desired and so need rpc.idmapd myneed="${myneed} $( awk '!/^[[:space:]]*#/ { # clear the path to avoid spurious matches $1 = ""; if ($0 ~ /[(][^)]*sec=(krb|spkm)[^)]*[)]/) { print "rpc.svcgssd" exit 0 } }' /etc/exports /etc/exports.d/*.exports 2>/dev/null )" config /etc/exports /etc/exports.d/*.exports need portmap need 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 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 --signal=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 ! mountinfo -q /proc/fs/nfsd ; then ebegin "Mounting nfsd filesystem in /proc" mount -t nfsd -o nodev,noexec,nosuid nfsd /proc/fs/nfsd eend $? fi local o for o in ${OPTS_NFSD} ; do echo "${o#*=}" > "/proc/fs/nfsd/${o%%=*}" done 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 /etc/exports.d/*.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 ebegin "Stopping NFS mountd" start-stop-daemon --stop --exec ${mountd} eend $? ret=$((ret + $?)) ebegin "Stopping NFS daemon" # Do not attempt to signal kernel nfsd threads directly, #924309 ${nfsd} 0 eend $? ret=$((ret + $?)) # 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 [ "${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() { svc_stop svc_start }