diff options
Diffstat (limited to 'systemd')
31 files changed, 2377 insertions, 0 deletions
diff --git a/systemd/60-nfs.rules b/systemd/60-nfs.rules new file mode 100644 index 0000000..188423c --- /dev/null +++ b/systemd/60-nfs.rules @@ -0,0 +1,21 @@ +# Ensure all NFS systctl settings get applied when modules load + +# sunrpc module supports "sunrpc.*" sysctls +ACTION=="add", SUBSYSTEM=="module", KERNEL=="sunrpc", \ + RUN+="/sbin/sysctl -q --pattern ^sunrpc --system" + +# rpcrdma module supports sunrpc.svc_rdma.* +ACTION=="add", SUBSYSTEM=="module", KERNEL=="rpcrdma", \ + RUN+="/sbin/sysctl -q --pattern ^sunrpc.svc_rdma --system" + +# lockd module supports "fs.nfs.nlm*" and "fs.nfs.nsm*" sysctls +ACTION=="add", SUBSYSTEM=="module", KERNEL=="lockd", \ + RUN+="/sbin/sysctl -q --pattern ^fs.nfs.n[sl]m --system" + +# nfsv4 module supports "fs.nfs.*" sysctls (nfs_callback_tcpport and idmap_cache_timeout) +ACTION=="add", SUBSYSTEM=="module", KERNEL=="nfsv4", \ + RUN+="/sbin/sysctl -q --pattern ^fs.nfs.(nfs_callback_tcpport|idmap_cache_timeout) --system" + +# nfs module supports "fs.nfs.*" sysctls +ACTION=="add", SUBSYSTEM=="module", KERNEL=="nfs", \ + RUN+="/sbin/sysctl -q --pattern ^fs.nfs --system" diff --git a/systemd/Makefile.am b/systemd/Makefile.am new file mode 100644 index 0000000..b448322 --- /dev/null +++ b/systemd/Makefile.am @@ -0,0 +1,88 @@ +## Process this file with automake to produce Makefile.in + +MAINTAINERCLEANFILES = Makefile.in + +udev_rulesdir = /usr/lib/udev/rules.d/ +udev_files = 60-nfs.rules + +unit_files = \ + nfs-client.target \ + rpc_pipefs.target \ + \ + nfs-mountd.service \ + nfs-server.service \ + nfs-utils.service \ + rpc-statd-notify.service \ + rpc-statd.service \ + \ + proc-fs-nfsd.mount \ + fsidd.service + +rpc_pipefs_mount_file = \ + var-lib-nfs-rpc_pipefs.mount + +if CONFIG_NFSV4 +unit_files += \ + nfs-idmapd.service +endif + +if CONFIG_NFSV4SERVER +unit_files += \ + nfsv4-exportd.service \ + nfsv4-server.service +endif + +if CONFIG_NFSV41 +unit_files += \ + nfs-blkmap.service +endif + +if CONFIG_GSS +unit_files += \ + auth-rpcgss-module.service \ + rpc-gssd.service + +if CONFIG_SVCGSS +unit_files += \ + rpc-svcgssd.service +endif +endif + +if CONFIG_NFSDCLD +unit_files += \ + nfsdcld.service +endif + +man5_MANS = nfs.conf.man +man7_MANS = nfs.systemd.man +EXTRA_DIST = $(unit_files) $(udev_files) $(man5_MANS) $(man7_MANS) + +generator_dir = $(unitdir)/../system-generators + +EXTRA_PROGRAMS = nfs-server-generator rpc-pipefs-generator +genexecdir = $(generator_dir) + +COMMON_SRCS = systemd.c systemd.h + +nfs_server_generator_SOURCES = $(COMMON_SRCS) nfs-server-generator.c + +rpc_pipefs_generator_SOURCES = $(COMMON_SRCS) rpc-pipefs-generator.c + +nfs_server_generator_LDADD = ../support/export/libexport.a \ + ../support/nfs/libnfs.la \ + ../support/misc/libmisc.a \ + ../support/reexport/libreexport.a \ + $(LIBPTHREAD) + + +rpc_pipefs_generator_LDADD = ../support/nfs/libnfs.la + +if INSTALL_SYSTEMD +genexec_PROGRAMS = nfs-server-generator rpc-pipefs-generator +install-data-hook: $(unit_files) $(udev_files) + mkdir -p $(DESTDIR)/$(unitdir) + cp $(unit_files) $(DESTDIR)/$(unitdir) + cp $(rpc_pipefs_mount_file) $(DESTDIR)/$(unitdir)/$(rpc_pipefsmount) + mkdir -p $(DESTDIR)/$(udev_rulesdir) + cp $(udev_files) $(DESTDIR)/$(udev_rulesdir) +endif diff --git a/systemd/Makefile.in b/systemd/Makefile.in new file mode 100644 index 0000000..108deae --- /dev/null +++ b/systemd/Makefile.in @@ -0,0 +1,937 @@ +# Makefile.in generated by automake 1.16.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2021 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@CONFIG_NFSV4_TRUE@am__append_1 = \ +@CONFIG_NFSV4_TRUE@ nfs-idmapd.service + +@CONFIG_NFSV4SERVER_TRUE@am__append_2 = \ +@CONFIG_NFSV4SERVER_TRUE@ nfsv4-exportd.service \ +@CONFIG_NFSV4SERVER_TRUE@ nfsv4-server.service + +@CONFIG_NFSV41_TRUE@am__append_3 = \ +@CONFIG_NFSV41_TRUE@ nfs-blkmap.service + +@CONFIG_GSS_TRUE@am__append_4 = \ +@CONFIG_GSS_TRUE@ auth-rpcgss-module.service \ +@CONFIG_GSS_TRUE@ rpc-gssd.service + +@CONFIG_GSS_TRUE@@CONFIG_SVCGSS_TRUE@am__append_5 = \ +@CONFIG_GSS_TRUE@@CONFIG_SVCGSS_TRUE@ rpc-svcgssd.service + +@CONFIG_NFSDCLD_TRUE@am__append_6 = \ +@CONFIG_NFSDCLD_TRUE@ nfsdcld.service + +EXTRA_PROGRAMS = nfs-server-generator$(EXEEXT) \ + rpc-pipefs-generator$(EXEEXT) +@INSTALL_SYSTEMD_TRUE@genexec_PROGRAMS = \ +@INSTALL_SYSTEMD_TRUE@ nfs-server-generator$(EXEEXT) \ +@INSTALL_SYSTEMD_TRUE@ rpc-pipefs-generator$(EXEEXT) +subdir = systemd +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/aclocal/ax_gcc_func_attribute.m4 \ + $(top_srcdir)/aclocal/bsdsignals.m4 \ + $(top_srcdir)/aclocal/getrandom.m4 \ + $(top_srcdir)/aclocal/ipv6.m4 \ + $(top_srcdir)/aclocal/kerberos5.m4 \ + $(top_srcdir)/aclocal/keyutils.m4 \ + $(top_srcdir)/aclocal/libblkid.m4 \ + $(top_srcdir)/aclocal/libcap.m4 \ + $(top_srcdir)/aclocal/libevent.m4 \ + $(top_srcdir)/aclocal/libpthread.m4 \ + $(top_srcdir)/aclocal/libsqlite3.m4 \ + $(top_srcdir)/aclocal/libtirpc.m4 \ + $(top_srcdir)/aclocal/libxml2.m4 \ + $(top_srcdir)/aclocal/nfs-utils.m4 \ + $(top_srcdir)/aclocal/rpcsec_vers.m4 \ + $(top_srcdir)/aclocal/tcp-wrappers.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/support/include/config.h +CONFIG_CLEAN_FILES = rpc-gssd.service rpc_pipefs.target \ + var-lib-nfs-rpc_pipefs.mount +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(genexecdir)" "$(DESTDIR)$(man5dir)" \ + "$(DESTDIR)$(man7dir)" +PROGRAMS = $(genexec_PROGRAMS) +am__objects_1 = systemd.$(OBJEXT) +am_nfs_server_generator_OBJECTS = $(am__objects_1) \ + nfs-server-generator.$(OBJEXT) +nfs_server_generator_OBJECTS = $(am_nfs_server_generator_OBJECTS) +am__DEPENDENCIES_1 = +nfs_server_generator_DEPENDENCIES = ../support/export/libexport.a \ + ../support/nfs/libnfs.la ../support/misc/libmisc.a \ + ../support/reexport/libreexport.a $(am__DEPENDENCIES_1) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +am_rpc_pipefs_generator_OBJECTS = $(am__objects_1) \ + rpc-pipefs-generator.$(OBJEXT) +rpc_pipefs_generator_OBJECTS = $(am_rpc_pipefs_generator_OBJECTS) +rpc_pipefs_generator_DEPENDENCIES = ../support/nfs/libnfs.la +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/support/include +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/nfs-server-generator.Po \ + ./$(DEPDIR)/rpc-pipefs-generator.Po ./$(DEPDIR)/systemd.Po +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(nfs_server_generator_SOURCES) \ + $(rpc_pipefs_generator_SOURCES) +DIST_SOURCES = $(nfs_server_generator_SOURCES) \ + $(rpc_pipefs_generator_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +man5dir = $(mandir)/man5 +man7dir = $(mandir)/man7 +NROFF = nroff +MANS = $(man5_MANS) $(man7_MANS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/rpc-gssd.service.in \ + $(srcdir)/rpc_pipefs.target.in \ + $(srcdir)/var-lib-nfs-rpc_pipefs.mount.in \ + $(top_srcdir)/depcomp README +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CPPFLAGS = @AM_CPPFLAGS@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CFLAGS_FOR_BUILD = @CFLAGS_FOR_BUILD@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CPPFLAGS_FOR_BUILD = @CPPFLAGS_FOR_BUILD@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CXXFLAGS_FOR_BUILD = @CXXFLAGS_FOR_BUILD@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILECMD = @FILECMD@ +GREP = @GREP@ +GSSAPI_CFLAGS = @GSSAPI_CFLAGS@ +GSSAPI_LIBS = @GSSAPI_LIBS@ +GSSD = @GSSD@ +GSSGLUE_CFLAGS = @GSSGLUE_CFLAGS@ +GSSGLUE_LIBS = @GSSGLUE_LIBS@ +GSSKRB_CFLAGS = @GSSKRB_CFLAGS@ +GSSKRB_LIBS = @GSSKRB_LIBS@ +HAVE_GETRANDOM = @HAVE_GETRANDOM@ +HAVE_LIBWRAP = @HAVE_LIBWRAP@ +HAVE_TCP_WRAPPER = @HAVE_TCP_WRAPPER@ +IDMAPD = @IDMAPD@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +K5VERS = @K5VERS@ +KRBCFLAGS = @KRBCFLAGS@ +KRBDIR = @KRBDIR@ +KRBLDFLAGS = @KRBLDFLAGS@ +KRBLIBS = @KRBLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LDFLAGS_FOR_BUILD = @LDFLAGS_FOR_BUILD@ +LIBBLKID = @LIBBLKID@ +LIBBSD = @LIBBSD@ +LIBCAP = @LIBCAP@ +LIBCRYPT = @LIBCRYPT@ +LIBEVENT = @LIBEVENT@ +LIBKEYUTILS = @LIBKEYUTILS@ +LIBMOUNT = @LIBMOUNT@ +LIBMOUNT_CFLAGS = @LIBMOUNT_CFLAGS@ +LIBMOUNT_LIBS = @LIBMOUNT_LIBS@ +LIBNSL = @LIBNSL@ +LIBOBJS = @LIBOBJS@ +LIBPTHREAD = @LIBPTHREAD@ +LIBS = @LIBS@ +LIBSOCKET = @LIBSOCKET@ +LIBSQLITE = @LIBSQLITE@ +LIBTIRPC = @LIBTIRPC@ +LIBTOOL = @LIBTOOL@ +LIBWRAP = @LIBWRAP@ +LIBXML2 = @LIBXML2@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_PLUGINS = @PATH_PLUGINS@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RELEASE = @RELEASE@ +RPCGEN_PATH = @RPCGEN_PATH@ +RPCSECGSS_CFLAGS = @RPCSECGSS_CFLAGS@ +RPCSECGSS_LIBS = @RPCSECGSS_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +SVCGSSD = @SVCGSSD@ +TIRPC_CFLAGS = @TIRPC_CFLAGS@ +TIRPC_LIBS = @TIRPC_LIBS@ +VERSION = @VERSION@ +XML2_CFLAGS = @XML2_CFLAGS@ +XML2_LIBS = @XML2_LIBS@ +_rpc_pipefsmount = @_rpc_pipefsmount@ +_statedir = @_statedir@ +_sysconfdir = @_sysconfdir@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +enable_gss = @enable_gss@ +enable_ipv6 = @enable_ipv6@ +enable_mountconfig = @enable_mountconfig@ +enable_nfsv4 = @enable_nfsv4@ +enable_nfsv41 = @enable_nfsv41@ +enable_svcgss = @enable_svcgss@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +kprefix = @kprefix@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +mountfile = @mountfile@ +nfsconfig = @nfsconfig@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +rpc_pipefsmount = @rpc_pipefsmount@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +startstatd = @startstatd@ +statdpath = @statdpath@ +statduser = @statduser@ +statedir = @statedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +unitdir = @unitdir@ +MAINTAINERCLEANFILES = Makefile.in +udev_rulesdir = /usr/lib/udev/rules.d/ +udev_files = 60-nfs.rules +unit_files = nfs-client.target rpc_pipefs.target nfs-mountd.service \ + nfs-server.service nfs-utils.service rpc-statd-notify.service \ + rpc-statd.service proc-fs-nfsd.mount fsidd.service \ + $(am__append_1) $(am__append_2) $(am__append_3) \ + $(am__append_4) $(am__append_5) $(am__append_6) +rpc_pipefs_mount_file = \ + var-lib-nfs-rpc_pipefs.mount + +man5_MANS = nfs.conf.man +man7_MANS = nfs.systemd.man +EXTRA_DIST = $(unit_files) $(udev_files) $(man5_MANS) $(man7_MANS) +generator_dir = $(unitdir)/../system-generators +genexecdir = $(generator_dir) +COMMON_SRCS = systemd.c systemd.h +nfs_server_generator_SOURCES = $(COMMON_SRCS) nfs-server-generator.c +rpc_pipefs_generator_SOURCES = $(COMMON_SRCS) rpc-pipefs-generator.c +nfs_server_generator_LDADD = ../support/export/libexport.a \ + ../support/nfs/libnfs.la \ + ../support/misc/libmisc.a \ + ../support/reexport/libreexport.a \ + $(LIBPTHREAD) + +rpc_pipefs_generator_LDADD = ../support/nfs/libnfs.la +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu systemd/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu systemd/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +rpc-gssd.service: $(top_builddir)/config.status $(srcdir)/rpc-gssd.service.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +rpc_pipefs.target: $(top_builddir)/config.status $(srcdir)/rpc_pipefs.target.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +var-lib-nfs-rpc_pipefs.mount: $(top_builddir)/config.status $(srcdir)/var-lib-nfs-rpc_pipefs.mount.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +install-genexecPROGRAMS: $(genexec_PROGRAMS) + @$(NORMAL_INSTALL) + @list='$(genexec_PROGRAMS)'; test -n "$(genexecdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(genexecdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(genexecdir)" || exit 1; \ + fi; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p \ + || test -f $$p1 \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(genexecdir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(genexecdir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-genexecPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(genexec_PROGRAMS)'; test -n "$(genexecdir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' \ + `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(genexecdir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(genexecdir)" && rm -f $$files + +clean-genexecPROGRAMS: + @list='$(genexec_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +nfs-server-generator$(EXEEXT): $(nfs_server_generator_OBJECTS) $(nfs_server_generator_DEPENDENCIES) $(EXTRA_nfs_server_generator_DEPENDENCIES) + @rm -f nfs-server-generator$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(nfs_server_generator_OBJECTS) $(nfs_server_generator_LDADD) $(LIBS) + +rpc-pipefs-generator$(EXEEXT): $(rpc_pipefs_generator_OBJECTS) $(rpc_pipefs_generator_DEPENDENCIES) $(EXTRA_rpc_pipefs_generator_DEPENDENCIES) + @rm -f rpc-pipefs-generator$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(rpc_pipefs_generator_OBJECTS) $(rpc_pipefs_generator_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nfs-server-generator.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rpc-pipefs-generator.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/systemd.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-man5: $(man5_MANS) + @$(NORMAL_INSTALL) + @list1='$(man5_MANS)'; \ + list2=''; \ + test -n "$(man5dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man5dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man5dir)" || exit 1; \ + { for i in $$list1; do echo "$$i"; done; \ + if test -n "$$list2"; then \ + for i in $$list2; do echo "$$i"; done \ + | sed -n '/\.5[a-z]*$$/p'; \ + fi; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man5dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man5dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man5dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man5dir)" || exit $$?; }; \ + done; } + +uninstall-man5: + @$(NORMAL_UNINSTALL) + @list='$(man5_MANS)'; test -n "$(man5dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + dir='$(DESTDIR)$(man5dir)'; $(am__uninstall_files_from_dir) +install-man7: $(man7_MANS) + @$(NORMAL_INSTALL) + @list1='$(man7_MANS)'; \ + list2=''; \ + test -n "$(man7dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man7dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man7dir)" || exit 1; \ + { for i in $$list1; do echo "$$i"; done; \ + if test -n "$$list2"; then \ + for i in $$list2; do echo "$$i"; done \ + | sed -n '/\.7[a-z]*$$/p'; \ + fi; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^7][0-9a-z]*$$,7,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man7dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man7dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man7dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man7dir)" || exit $$?; }; \ + done; } + +uninstall-man7: + @$(NORMAL_UNINSTALL) + @list='$(man7_MANS)'; test -n "$(man7dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^7][0-9a-z]*$$,7,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + dir='$(DESTDIR)$(man7dir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) $(MANS) +installdirs: + for dir in "$(DESTDIR)$(genexecdir)" "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(man7dir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +@INSTALL_SYSTEMD_FALSE@install-data-hook: +clean: clean-am + +clean-am: clean-generic clean-genexecPROGRAMS clean-libtool \ + mostlyclean-am + +distclean: distclean-am + -rm -f ./$(DEPDIR)/nfs-server-generator.Po + -rm -f ./$(DEPDIR)/rpc-pipefs-generator.Po + -rm -f ./$(DEPDIR)/systemd.Po + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-man + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-genexecPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: install-man5 install-man7 + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f ./$(DEPDIR)/nfs-server-generator.Po + -rm -f ./$(DEPDIR)/rpc-pipefs-generator.Po + -rm -f ./$(DEPDIR)/systemd.Po + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-genexecPROGRAMS uninstall-man + +uninstall-man: uninstall-man5 uninstall-man7 + +.MAKE: install-am install-data-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ + clean-generic clean-genexecPROGRAMS clean-libtool \ + cscopelist-am ctags ctags-am distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-data-hook install-dvi \ + install-dvi-am install-exec install-exec-am \ + install-genexecPROGRAMS install-html install-html-am \ + install-info install-info-am install-man install-man5 \ + install-man7 install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ + uninstall-am uninstall-genexecPROGRAMS uninstall-man \ + uninstall-man5 uninstall-man7 + +.PRECIOUS: Makefile + +@INSTALL_SYSTEMD_TRUE@install-data-hook: $(unit_files) $(udev_files) +@INSTALL_SYSTEMD_TRUE@ mkdir -p $(DESTDIR)/$(unitdir) +@INSTALL_SYSTEMD_TRUE@ cp $(unit_files) $(DESTDIR)/$(unitdir) +@INSTALL_SYSTEMD_TRUE@ cp $(rpc_pipefs_mount_file) $(DESTDIR)/$(unitdir)/$(rpc_pipefsmount) +@INSTALL_SYSTEMD_TRUE@ mkdir -p $(DESTDIR)/$(udev_rulesdir) +@INSTALL_SYSTEMD_TRUE@ cp $(udev_files) $(DESTDIR)/$(udev_rulesdir) + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/systemd/README b/systemd/README new file mode 100644 index 0000000..da23d6f --- /dev/null +++ b/systemd/README @@ -0,0 +1,79 @@ + +Notes about systemd unit files for nfs-utils. + +The unit files provided here should be sufficient for systemd +to manage all daemons and related services provides by nfs-utils. + +They do *not* include any unit files for separate services such as +rpc.rquotad (in the 'quota' package) or rpcbind. + +There are 4 units that can be 'enabled' or 'disabled' by systemctl, or +by a suitable 'preset' setting: + + nfs-server.service + If enabled, nfs service is started together with dependencies + such as mountd, statd, rpc.idmapd + This is a "service" file rather than a "target" (which is the + normal grouping construct) so that + systemctl start nfs-server + can work (if no type is given, ".service" is assumed). + + nfs-client.target + If enabled, daemons needed for an nfs client are enabled. + This does *not* include rpc.statd. The rpc-statd.service unit + is started by /usr/sbin/start-statd which mount.nfs will run + if statd is needed. + + nfs-blkmap.service + If enabled, then blkmapd will be run when nfs-client.target is + started. + +Another special unit is "nfs-utils.service". This doesn't really do +anything, but exists so that other units may declare themselves as +"PartOf" nfs-utils.service. +The effect of this is that + systemctl restart nfs-utils +will restart all nfs-utils daemons as maybe be required during +software update. It isn't possible to make + systemctl try-restart nfs-server nfs-client.target +do this as some daemon are included in both, and rpc.statd would +not be restarted if nfs-server were not active (as nfs-client doesn't +Want it - it is started by mount.nfs running start-statd). + +It is possible that we should have an nfs-statd.target which can +selectively enable statd being stared by -server and sm-notify +being started by -server or -client. That way it could be disabled +completely on V4-only configurations. Currently statd is always +started on the server and sm-notify is always run if server or +client is enabled. + +Stopping nfs-server will also stop rpc.mountd, and rpc.svcgssd. +It cannot stop rpc.statd or rpc.gssd as they may be in use by the +client and systemd cannot specify is two-pronged reverse dependency. +(i.e. stop this unit if none of these units are running) + +Distro specific configuration can be included in /etc/nfs.conf, or +by providing drop-in files which replace the ExecStart line for a given +service, and possibly add an EnvironmentFile line. + +For example, if systemd/system/nfs-mountd.service.d/local.conf +contained + [Service] + EnvironmentFile=/etc/sysconfig/nfs + ExecStart= + ExecStart=/usr/sbin/rpc.mountd $RPCMOUNTDOPTS + +then the setting of RPCMOUNTDOPTS in /etc/sysconfig/nfs would be +passed to rpc.mountd. + +rpc.gssd and rpc.svcgssd are assumed to be needed if /etc/krb5.keytab +is present. +If a site needs this file present but does not want the gss daemons +running, it should create + /etc/systemd/system/rpc-gssd.service.d/01-disable.conf +and + /etc/systemd/system/rpc-svcgssd.service.d/01-disable.conf + +containing + [Unit] + ConditionNull=false diff --git a/systemd/auth-rpcgss-module.service b/systemd/auth-rpcgss-module.service new file mode 100644 index 0000000..4a69a7b --- /dev/null +++ b/systemd/auth-rpcgss-module.service @@ -0,0 +1,18 @@ +# We want to start gss-proxy on kernels that support it and rpc.svcgssd +# on those that don't. Those services check for support by checking +# for existence of the path /proc/net/rpc/use-gss-proxy. Before they +# can perform that check, they need this module loaded. (Unless +# rpcsec_gss support is built directly into the kernel, in which case this +# unit will fail. But that's OK.) +[Unit] +Description=Kernel Module supporting RPCSEC_GSS +DefaultDependencies=no +Before=gssproxy.service rpc-svcgssd.service rpc-gssd.service +Wants=gssproxy.service rpc-gssd.service +ConditionPathExists=/etc/krb5.keytab +ConditionVirtualization=!container + +[Service] +Type=oneshot +ExecStart=/sbin/modprobe -q auth_rpcgss +RemainAfterExit=yes diff --git a/systemd/fsidd.service b/systemd/fsidd.service new file mode 100644 index 0000000..9cb480e --- /dev/null +++ b/systemd/fsidd.service @@ -0,0 +1,10 @@ +[Unit] +Description=NFS FSID Daemon +After=local-fs.target +Before=nfs-mountd.service nfs-server.service + +[Service] +ExecStart=/usr/sbin/fsidd + +[Install] +RequiredBy=nfs-mountd.service nfs-server.service diff --git a/systemd/nfs-blkmap.service b/systemd/nfs-blkmap.service new file mode 100644 index 0000000..6aa45ba --- /dev/null +++ b/systemd/nfs-blkmap.service @@ -0,0 +1,16 @@ +[Unit] +Description=pNFS block layout mapping daemon +DefaultDependencies=no +Conflicts=umount.target +After=rpc_pipefs.target +Requires=rpc_pipefs.target + +PartOf=nfs-utils.service + +[Service] +Type=forking +PIDFile=/run/blkmapd.pid +ExecStart=/usr/sbin/blkmapd + +[Install] +WantedBy=nfs-client.target diff --git a/systemd/nfs-client.target b/systemd/nfs-client.target new file mode 100644 index 0000000..8a8300a --- /dev/null +++ b/systemd/nfs-client.target @@ -0,0 +1,16 @@ +[Unit] +Description=NFS client services +Before=remote-fs-pre.target +Wants=remote-fs-pre.target + +# Note: we don't "Wants=rpc-statd.service" as "mount.nfs" will arrange to +# start that on demand if needed. +Wants=rpc-statd-notify.service + +# GSS services dependencies and ordering +Wants=auth-rpcgss-module.service +After=rpc-gssd.service rpc-svcgssd.service gssproxy.service + +[Install] +WantedBy=multi-user.target +WantedBy=remote-fs.target diff --git a/systemd/nfs-idmapd.service b/systemd/nfs-idmapd.service new file mode 100644 index 0000000..198ca87 --- /dev/null +++ b/systemd/nfs-idmapd.service @@ -0,0 +1,12 @@ +[Unit] +Description=NFSv4 ID-name mapping service +DefaultDependencies=no +Requires=rpc_pipefs.target +After=rpc_pipefs.target local-fs.target network-online.target +Wants=network-online.target + +BindsTo=nfs-server.service + +[Service] +Type=forking +ExecStart=/usr/sbin/rpc.idmapd diff --git a/systemd/nfs-mountd.service b/systemd/nfs-mountd.service new file mode 100644 index 0000000..e8ece53 --- /dev/null +++ b/systemd/nfs-mountd.service @@ -0,0 +1,13 @@ +[Unit] +Description=NFS Mount Daemon +DefaultDependencies=no +Requires=proc-fs-nfsd.mount +Wants=network-online.target +After=proc-fs-nfsd.mount +After=network-online.target local-fs.target +After=rpcbind.socket +BindsTo=nfs-server.service + +[Service] +Type=forking +ExecStart=/usr/sbin/rpc.mountd diff --git a/systemd/nfs-server-generator.c b/systemd/nfs-server-generator.c new file mode 100644 index 0000000..eec98fd --- /dev/null +++ b/systemd/nfs-server-generator.c @@ -0,0 +1,158 @@ +/* + * nfs-server-generator: + * systemd generator to create ordering dependencies between + * nfs-server and various filesystem mounts + * + * 1/ nfs-server should start Before any 'nfs' mountpoints are + * mounted, in case they are loop-back mounts. This ordering is particularly + * important for the shutdown side, so the nfs-server is stopped + * after the filesystems are unmounted. + * 2/ nfs-server should start After all exported filesystems are mounted + * so there is no risk of exporting the underlying directory. + * This is particularly important for _net mounts which + * are not caught by "local-fs.target". + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <sys/stat.h> +#include <sys/types.h> +#include <unistd.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h> +#include <stdio.h> +#include <mntent.h> +#include <alloca.h> + +#include "misc.h" +#include "nfslib.h" +#include "exportfs.h" +#include "systemd.h" + +/* A simple "set of strings" to remove duplicates + * found in /etc/exports + */ +struct list { + struct list *next; + char *name; +}; +static int is_unique(struct list **lp, char *path) +{ + struct list *l = *lp; + + while (l) { + if (strcmp(l->name, path) == 0) + return 0; + l = l->next; + } + l = malloc(sizeof(*l)); + if (l == NULL) + return 0; + l->name = path; + l->next = *lp; + *lp = l; + return 1; +} + +static int has_noauto_flag(char *path) +{ + FILE *fstab; + struct mntent *mnt; + + fstab = setmntent("/etc/fstab", "r"); + if (!fstab) + return 0; + + while ((mnt = getmntent(fstab)) != NULL) { + int l = strlen(mnt->mnt_dir); + if (strncmp(mnt->mnt_dir, path, l) != 0) + continue; + if (path[l] && path[l] != '/') + continue; + if (hasmntopt(mnt, "noauto")) + break; + } + fclose(fstab); + return mnt != NULL; +} + +int main(int argc, char *argv[]) +{ + char *path, *spath; + char dirbase[] = "/nfs-server.service.d"; + char filebase[] = "/order-with-mounts.conf"; + nfs_export *exp; + int i; + struct list *list = NULL; + FILE *f, *fstab; + struct mntent *mnt; + + /* Avoid using any external services */ + xlog_syslog(0); + + if (argc != 4 || argv[1][0] != '/') { + fprintf(stderr, "nfs-server-generator: create systemd dependencies for nfs-server\n"); + fprintf(stderr, "Usage: normal-dir early-dir late-dir\n"); + exit(1); + } + + path = alloca(strlen(argv[1]) + sizeof(dirbase) + sizeof(filebase)); + if (!path) + exit(2); + if (export_read(_PATH_EXPORTS, 1) + + export_d_read(_PATH_EXPORTS_D, 1) == 0) + /* Nothing is exported, so nothing to do */ + exit(0); + + strcat(strcpy(path, argv[1]), dirbase); + mkdir(path, 0755); + strcat(path, filebase); + f = fopen(path, "w"); + if (!f) + exit(1); + fprintf(f, "# Automatically generated by nfs-server-generator\n\n[Unit]\n"); + + for (i = 0; i < MCL_MAXTYPES; i++) { + for (exp = exportlist[i].p_head; exp; exp = exp->m_next) { + if (!is_unique(&list, exp->m_export.e_path)) + continue; + if (exp->m_export.e_mountpoint) + continue; + if (has_noauto_flag(exp->m_export.e_path)) + continue; + if (strchr(exp->m_export.e_path, ' ')) + fprintf(f, "RequiresMountsFor=\"%s\"\n", + exp->m_export.e_path); + else + fprintf(f, "RequiresMountsFor=%s\n", + exp->m_export.e_path); + } + } + + fstab = setmntent("/etc/fstab", "r"); + if (!fstab) + exit(1); + + while ((mnt = getmntent(fstab)) != NULL) { + if (strcmp(mnt->mnt_type, "nfs") != 0 && + strcmp(mnt->mnt_type, "nfs4") != 0) + continue; + + spath = systemd_escape(mnt->mnt_dir, ".mount"); + if (!spath) { + fprintf(stderr, + "nfs-server-generator: convert path failed: %s\n", + mnt->mnt_dir); + continue; + } + fprintf(f, "Before=%s\n", spath); + } + + fclose(fstab); + fclose(f); + + exit(0); +} diff --git a/systemd/nfs-server.service b/systemd/nfs-server.service new file mode 100644 index 0000000..2cdd786 --- /dev/null +++ b/systemd/nfs-server.service @@ -0,0 +1,33 @@ +[Unit] +Description=NFS server and services +DefaultDependencies=no +Requires=network.target proc-fs-nfsd.mount +Requires=nfs-mountd.service +Wants=rpcbind.socket network-online.target +Wants=rpc-statd.service nfs-idmapd.service +Wants=rpc-statd-notify.service +Wants=nfsdcld.service + +After=network-online.target local-fs.target +After=proc-fs-nfsd.mount rpcbind.socket nfs-mountd.service +After=nfs-idmapd.service rpc-statd.service +After=nfsdcld.service +Before=rpc-statd-notify.service + +# GSS services dependencies and ordering +Wants=auth-rpcgss-module.service rpc-svcgssd.service +After=rpc-gssd.service gssproxy.service rpc-svcgssd.service + +[Service] +Type=oneshot +RemainAfterExit=yes +ExecStartPre=-/usr/sbin/exportfs -r +ExecStart=/usr/sbin/rpc.nfsd +ExecStop=/usr/sbin/rpc.nfsd 0 +ExecStopPost=/usr/sbin/exportfs -au +ExecStopPost=/usr/sbin/exportfs -f + +ExecReload=-/usr/sbin/exportfs -r + +[Install] +WantedBy=multi-user.target diff --git a/systemd/nfs-utils.service b/systemd/nfs-utils.service new file mode 100644 index 0000000..54b6314 --- /dev/null +++ b/systemd/nfs-utils.service @@ -0,0 +1,17 @@ +[Unit] +Description=NFS server and client services +# This service should never be stopped, only restarted. +# When it is re-started, all other services which declare +# themselves to be "PartOf" this service will also be +# restarted. Thus +# systemctl restart nfs-utils +# will restart all daemons which are part of nfs-utils +# and which are running. This is useful after a software +# update. + +# This is a "service" rather than "target" so that we +# don't need to say "systemctl restart nfs-utils.target". +[Service] +Type=oneshot +RemainAfterExit=yes +ExecStart=/bin/true diff --git a/systemd/nfs-v4client.target b/systemd/nfs-v4client.target new file mode 100644 index 0000000..3d1064e --- /dev/null +++ b/systemd/nfs-v4client.target @@ -0,0 +1,12 @@ +[Unit] +Description=NFS client services +Before=remote-fs-pre.target +Wants=remote-fs-pre.target + +# GSS services dependencies and ordering +Wants=auth-rpcgss-module.service +After=rpc-gssd.service rpc-svcgssd.service gssproxy.service + +[Install] +WantedBy=multi-user.target +WantedBy=remote-fs.target diff --git a/systemd/nfs.conf.man b/systemd/nfs.conf.man new file mode 100644 index 0000000..866939a --- /dev/null +++ b/systemd/nfs.conf.man @@ -0,0 +1,330 @@ +.TH NFS.CONF 5 +.SH NAME +nfs.conf \- general configuration for NFS daemons and tools +.SH SYNOPSIS +.I /etc/nfs.conf +.SH DESCRIPTION +.PP +This file contains site-specific configuration for various NFS daemons +and other processes. Most configuration can also be passed to +processes via command line arguments, but it can be more convenient to +have a central file. In particular, this encourages consistent +configuration across different processes. +.PP +When command line options are provided, they override values set in +this file. When this file does not specify a particular parameter, +and no command line option is provided, each tool provides its own +default values. +.PP +The file format supports multiple sections, each of which can contain +multiple value assignments. A section is introduced by a line +containing the section name enclosed in square brackets, so +.RS +.B [global] +.RE +would introduce a section called +.BR global . +A value assignment is a single line that has the name of the value, an +equals sign, and a setting for the value, so +.RS +.B threads = 4 +.RE +would set the value named +.B threads +in the current section to +.BR 4 . +Leading and trailing spaces and tab +are ignored, as are spaces and tabs surrounding the equals sign. +Single and double quotes surrounding the assigned value are also +removed. If the resulting string is empty, the whole assignment +is ignored. +.PP +Any line starting with +.RB \*(lq # \*(rq +or +.RB \*(lq ; \*(rq +is ignored, as is any blank line. +.PP +If the assigned value started with a +.RB \*(lq $ \*(rq +then the remainder is treated as a name and looked for in the section +.B [environment] +or in the processes environment (see +.BR environ (7)). +The value found is used for this value. +.PP +The value name +.B include +is special. If a section contains +.RS +.B include = /some/file/name +.RE +then the named file will be read, and any value assignments found +there-in will be added to the current section. If the file contains +section headers, then new sections will be created just as if the +included file appeared in place of the +.B include +line. +If the file name starts with a hyphen then that is stripped off +before the file is opened, and if file doesn't exist no warning is +given. Normally a non-existent include file generates a warning. +.PP +Lookup of section and value names is case-insensitive. + +Where a Boolean value is expected, any of +.BR true , +.BR t , +.BR yes , +.BR y , +.BR on ", or" +.B 1 +can be used for "true", while +.BR false , +.BR f , +.BR no , +.BR n , +.BR off ", or" +.B 0 +can be used for "false". Comparisons are case-insensitive. + +.SH SECTIONS +The following sections are known to various programs, and can contain +the given named values. Most sections can also contain a +.B debug +value, which can be one or more from the list +.BR general , +.BR call , +.BR auth , +.BR parse , +.BR all . +When a list is given, the members should be comma-separated. +The values +.BR 0 +and +.BR 1 +are also accepted, with '0' making no changes to the debug level, and '1' equivalent to specifying 'all'. + +.TP +.B general +Recognized values: +.BR pipefs-directory . + +See +.BR blkmapd (8), +.BR rpc.idmapd (8), +and +.BR rpc.gssd (8) +for details. + +.TP +.B exports +Recognized values: +.BR rootdir . + +Setting +.B rootdir +to a valid path causes the nfs server to act as if the +supplied path is being prefixed to all the exported entries. For +instance, if +.BR rootdir=/my/root , +and there is an entry in /etc/exports for +.BR /filesystem , +then the client will be able to mount the path as +.BR /filesystem , +but on the server, this will resolve to the path +.BR /my/root/filesystem . + +.TP +.B exportd +Recognized values: +.BR manage-gids , +.BR threads , +.BR cache-use-ipaddr , +.BR ttl , +.BR state-directory-path + +See +.BR exportd (8) +for details. + +Note that setting +.B "\[dq]debug = auth\[dq]" +for +.B exportd +is equivalent to providing the +.B \-\-log\-auth +option. + +.TP +.B nfsdcltrack +Recognized values: +.BR storagedir . + +The +.B nfsdcltrack +program is run directly by the Linux kernel and there is no +opportunity to provide command line arguments, so the configuration +file is the only way to configure this program. See +.BR nfsdcltrack (8) +for details. + +.TP +.B nfsd +Recognized values: +.BR threads , +.BR host , +.BR scope , +.BR port , +.BR grace-time , +.BR lease-time , +.BR udp , +.BR tcp , +.BR vers3 , +.BR vers4 , +.BR vers4.0 , +.BR vers4.1 , +.BR vers4.2 , +.BR rdma , + +Version and protocol values are Boolean values as described above, +and are also used by +.BR rpc.mountd . +Threads and the two times are integers. +.B port +and +.B rdma +are service names or numbers. See +.BR rpc.nfsd (8) +for details. + +.TP +.B mountd +Recognized values: +.BR manage-gids , +.BR descriptors , +.BR port , +.BR threads , +.BR reverse-lookup , +.BR cache-use-ipaddr , +.BR ttl , +.BR state-directory-path , +.BR ha-callout . + +These, together with the protocol and version values in the +.B [nfsd] +section, are used to configure mountd. See +.BR rpc.mountd (8) +for details. + +Note that setting +.B "\[dq]debug = auth\[dq]" +for +.B mountd +is equivalent to providing the +.B \-\-log\-auth +option. + +The +.B state-directory-path +value in the +.B [mountd] +section is also used by +.BR exportfs (8). + +.TP +.B statd +Recognized values: +.BR port , +.BR outgoing-port , +.BR name , +.BR state-directory-path , +.BR ha-callout . + +See +.BR rpc.statd (8) +for details. + +.TP +.B lockd +Recognized values: +.B port +and +.BR udp-port . + +See +.BR rpc.statd (8) +for details. + +.TP +.B sm-notify +Recognized values: +.BR retry-time , +.BR outgoing-port ", and" +.BR outgoing-addr . + +See +.BR sm-notify (8) +for details. + +.TP +.B gssd +Recognized values: +.BR verbosity , +.BR rpc-verbosity , +.BR use-memcache , +.BR use-machine-creds , +.BR use-gss-proxy , +.BR avoid-dns , +.BR limit-to-legacy-enctypes , +.BR context-timeout , +.BR rpc-timeout , +.BR keytab-file , +.BR cred-cache-directory , +.BR preferred-realm , +.BR set-home . + +See +.BR rpc.gssd (8) +for details. + +.TP +.B svcgssd +Recognized values: +.BR principal . + +See +.BR rpc.svcgssd (8) +for details. + +.TP +.B exportfs +Only +.B debug= +is recognized. + +.TP +.B nfsrahead +Recognized values: +.BR nfs , +.BR nfsv4 , +.BR default . + +See +.BR nfsrahead (5) +for deatils. + +.SH FILES +.TP 10n +.I /etc/nfs.conf +Default NFS client configuration file +.TP 10n +.I /etc/nfs.conf.d +When this directory exists and files ending +with ".conf" exist, those files will be +used to set configuration variables. These +files will override variables set in /etc/nfs.conf +.SH SEE ALSO +.BR nfsdcltrack (8), +.BR rpc.nfsd (8), +.BR rpc.mountd (8), +.BR nfsmount.conf (5). diff --git a/systemd/nfs.systemd.man b/systemd/nfs.systemd.man new file mode 100644 index 0000000..46b476a --- /dev/null +++ b/systemd/nfs.systemd.man @@ -0,0 +1,177 @@ +.TH NFS.SYSTEMD 7 +.SH NAME +nfs.systemd \- managing NFS services through systemd. +.SH SYNOPSIS +nfs-utils.service +.br +nfs-server.service +.br +nfs-client.target +.br +.I etc +.SH DESCRIPTION +The +.I nfs-utils +package provides a suite of +.I systemd +unit files which allow the various services to be started and +managed. These unit files ensure that the services are started in the +correct order, and the prerequisites are active before dependant +services start. As there are quite few unit files, it is not +immediately obvious how best to achieve certain results. The +following subsections attempt to cover the issues that are most likely +to come up. +.SS Configuration +The standard systemd unit files do not provide any easy way to pass +any command line arguments to daemons so as to configure their +behavior. In many case such configuration can be performed by making +changes to +.I /etc/nfs.conf +or other configuration files. When that is not convenient, a +distribution might provide systemd "drop-in" files which replace the +.B ExecStart= +setting to start the program with different arguments. For example a +drop-in file +.B systemd/system/nfs-mountd.service.d/local.conf +containing +.RS +.nf +[Service] +EnvironmentFile=/etc/sysconfig/nfs +ExecStart= +ExecStart= /usr/sbin/rpc.mountd $RPCMOUNTDOPTS +.fi +.RE +would cause the +.B nfs-mountd.service +unit to run the +.I rpc.mountd +program using, for arguments, the value given for +.B RPCMOUNTDOPTS +in +.IR /etc/sysconfig/nfs . +This allows for seamless integration with existing configuration +tools. +.SS Enabling unit files +There are three unit files which are designed to be manually enabled. +All others are automatically run as required. The three are: +.TP +.B nfs-client.target +This should be enabled on any host which ever serves as an NFS client. +There is little cost in transparently enabling it whenever NFS client +software is installed. +.TP +.B nfs-server.service +This must be enabled to provide NFS service to clients. It starts and +configures the required daemons in the required order. +.TP +.B nfs-blkmap.service +The +.B blkmapd +daemon is only required on NFS clients which are using pNFS (parallel +NFS), and particularly using the +.B blocklayout +layout protocol. If you might use this particular extension to NFS, +the +.B nfs-blkmap.service +unit should be enabled. +.PP +Several other units which might be considered to be optional, such as +.I rpc-gssd.service +are careful to only start if the required configuration file exists. +.I rpc-gssd.service +will not start if the +.I krb5.keytab +file does not exist (typically in +.IR /etc ). +.SS Restarting NFS services +Most NFS daemons can be restarted at any time. They will reload any +state that they need, and continue servicing requests. This is rarely +necessary though. +.PP +When configuration changesare make, it can be hard to know exactly +which services need to be restarted to ensure that the configuration +takes effect. The simplest approach, which is often the best, is to +restart everything. To help with this, the +.B nfs-utils.service +unit is provided. It declares appropriate dependencies with other +unit files so that +.RS +.B systemctl restart nfs-utils +.RE +will restart all NFS daemons that are running. This will cause all +configuration changes to take effect +.I except +for changes to mount options lists in +.I /etc/fstab +or +.IR /etc/nfsmount.conf . +Mount options can only be changed by unmounting and remounting +filesystem. This can be a disruptive operation so it should only be +done when the value justifies the cost. The command +.RS +.B umount -a -t nfs; mount -a -t nfs +.RE +should unmount and remount all NFS filesystems. +.SS Masking unwanted services +Rarely there may be a desire to prohibit some services from running +even though there are normally part of a working NFS system. This may +be needed to reduce system load to an absolute minimum, or to reduce +attack surface by not running daemons that are not absolutely +required. +.PP +Three particular services which this can apply to are +.IR rpcbind , +.IR idmapd , +and +.IR rpc-gssd . +.I rpcbind +is not part of the +.I nfs-utils +package, but it used by several NFS services. However it is +.B not +needed when only NFSv4 is in use. If a site will never use NFSv3 (or +NFSv2) and does not want +.I rpcbind +to be running, the correct approach is to run +.RS +.B systemctl mask rpcbind +.RE +This will disable +.IR rpcbind , +and the various NFS services which depend on it (and are only needed +for NFSv3) will refuse to start, without interfering with the +operation of NFSv4 services. In particular, +.I rpc.statd +will not run when +.I rpcbind +is masked. +.PP +.I idmapd +is only needed for NFSv4, and even then is not needed when the client +and server agree to use user-ids rather than user-names to identify the +owners of files. If +.I idmapd +is not needed and not wanted, it can be masked with +.RS +.B systemctl mask idmapd +.RE +.I rpc-gssd +is assumed to be needed if the +.I krb5.keytab +file is present. If a site needs this file present but does not want +.I rpc-gssd +running, it can be masked with +.RS +.B systemctl mask rpc-gssd +.RE +.SH FILES +/etc/nfs.conf +.br +/etc/nfsmount.conf +.br +/etc/idmapd.conf +.SH SEE ALSO +.BR systemd.unit (5), +.BR nfs.conf (5), +.BR nfsmount.conf (5). diff --git a/systemd/nfsdcld.service b/systemd/nfsdcld.service new file mode 100644 index 0000000..a32d243 --- /dev/null +++ b/systemd/nfsdcld.service @@ -0,0 +1,10 @@ +[Unit] +Description=NFSv4 Client Tracking Daemon +DefaultDependencies=no +Conflicts=umount.target +Requires=rpc_pipefs.target proc-fs-nfsd.mount +After=rpc_pipefs.target proc-fs-nfsd.mount + +[Service] +Type=forking +ExecStart=/usr/sbin/nfsdcld diff --git a/systemd/nfsv4-exportd.service b/systemd/nfsv4-exportd.service new file mode 100644 index 0000000..11d663a --- /dev/null +++ b/systemd/nfsv4-exportd.service @@ -0,0 +1,12 @@ +[Unit] +Description=NFSv4 Mount Daemon +DefaultDependencies=no +Requires=proc-fs-nfsd.mount +Wants=network-online.target +After=proc-fs-nfsd.mount +After=network-online.target local-fs.target +BindsTo=nfsv4-server.service + +[Service] +Type=forking +ExecStart=/usr/sbin/nfsv4.exportd diff --git a/systemd/nfsv4-server.service b/systemd/nfsv4-server.service new file mode 100644 index 0000000..6497568 --- /dev/null +++ b/systemd/nfsv4-server.service @@ -0,0 +1,31 @@ +[Unit] +Description=NFSv4 server and services +DefaultDependencies=no +Requires=network.target proc-fs-nfsd.mount +Requires=nfsv4-exportd.service +Wants=network-online.target +Wants=nfs-idmapd.service +Wants=nfsdcld.service + +After=network-online.target local-fs.target +After=proc-fs-nfsd.mount nfsv4-exportd.service +After=nfs-idmapd.service +After=nfsdcld.service + +# GSS services dependencies and ordering +Wants=auth-rpcgss-module.service +After=rpc-gssd.service gssproxy.service rpc-svcgssd.service + +[Service] +Type=oneshot +RemainAfterExit=yes +ExecStartPre=-/usr/sbin/exportfs -r +ExecStart=/usr/sbin/rpc.nfsd -N 3 +ExecStop=/usr/sbin/rpc.nfsd 0 +ExecStopPost=/usr/sbin/exportfs -au +ExecStopPost=/usr/sbin/exportfs -f + +ExecReload=-/usr/sbin/exportfs -r + +[Install] +WantedBy=multi-user.target diff --git a/systemd/proc-fs-nfsd.mount b/systemd/proc-fs-nfsd.mount new file mode 100644 index 0000000..931a5ce --- /dev/null +++ b/systemd/proc-fs-nfsd.mount @@ -0,0 +1,7 @@ +[Unit] +Description=NFSD configuration filesystem + +[Mount] +What=nfsd +Where=/proc/fs/nfsd +Type=nfsd diff --git a/systemd/rpc-gssd.service.in b/systemd/rpc-gssd.service.in new file mode 100644 index 0000000..6807db3 --- /dev/null +++ b/systemd/rpc-gssd.service.in @@ -0,0 +1,14 @@ +[Unit] +Description=RPC security service for NFS client and server +DefaultDependencies=no +Conflicts=umount.target +Requires=rpc_pipefs.target +After=rpc_pipefs.target + +ConditionPathExists=@_sysconfdir@/krb5.keytab + +PartOf=nfs-utils.service + +[Service] +Type=forking +ExecStart=/usr/sbin/rpc.gssd diff --git a/systemd/rpc-pipefs-generator.c b/systemd/rpc-pipefs-generator.c new file mode 100644 index 0000000..3aaeaea --- /dev/null +++ b/systemd/rpc-pipefs-generator.c @@ -0,0 +1,152 @@ +/* + * rpc-pipefs-generator: + * systemd generator to create ordering dependencies between + * nfs services and the rpc_pipefs mountpoint + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <sys/stat.h> +#include <sys/types.h> +#include <unistd.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h> +#include <stdio.h> +#include <mntent.h> + +#include "nfslib.h" +#include "conffile.h" +#include "systemd.h" + +#define RPC_PIPEFS_DEFAULT NFS_STATEDIR "/rpc_pipefs" + +static int generate_mount_unit(const char *pipefs_path, const char *pipefs_unit, + const char *dirname) +{ + char *path; + FILE *f; + size_t size = (strlen(dirname) + 1 + strlen(pipefs_unit) + 1); + + path = malloc(size); + if (!path) + return 1; + snprintf(path, size, "%s/%s", dirname, pipefs_unit); + f = fopen(path, "w"); + if (!f) + { + free(path); + return 1; + } + + fprintf(f, "# Automatically generated by rpc-pipefs-generator\n\n[Unit]\n"); + fprintf(f, "Description=RPC Pipe File System\n"); + fprintf(f, "DefaultDependencies=no\n"); + fprintf(f, "After=systemd-tmpfiles-setup.service\n"); + fprintf(f, "Conflicts=umount.target\n"); + fprintf(f, "\n[Mount]\n"); + fprintf(f, "What=sunrpc\n"); + fprintf(f, "Where=%s\n", pipefs_path); + fprintf(f, "Type=rpc_pipefs\n"); + + fclose(f); + free(path); + return 0; +} + +static +int generate_target(char *pipefs_path, const char *dirname) +{ + char *path; + char filebase[] = "/rpc_pipefs.target"; + char *pipefs_unit; + FILE *f; + int ret = 0; + + pipefs_unit = systemd_escape(pipefs_path, ".mount"); + if (!pipefs_unit) + return 1; + + ret = generate_mount_unit(pipefs_path, pipefs_unit, dirname); + if (ret) { + free(pipefs_unit); + return ret; + } + + path = malloc(strlen(dirname) + 1 + sizeof(filebase)); + if (!path) { + free(pipefs_unit); + return 2; + } + sprintf(path, "%s", dirname); + mkdir(path, 0755); + strcat(path, filebase); + f = fopen(path, "w"); + if (!f) + { + free(path); + free(pipefs_unit); + return 1; + } + + fprintf(f, "# Automatically generated by rpc-pipefs-generator\n\n[Unit]\n"); + fprintf(f, "Requires=%s\n", pipefs_unit); + fprintf(f, "After=%s\n", pipefs_unit); + fclose(f); + free(path); + free(pipefs_unit); + + return 0; +} + +static int is_non_pipefs_mountpoint(char *path) +{ + FILE *mtab; + struct mntent *mnt; + + mtab = setmntent("/etc/mtab", "r"); + if (!mtab) + return 0; + + while ((mnt = getmntent(mtab)) != NULL) { + if (strlen(mnt->mnt_dir) != strlen(path)) + continue; + if (strncmp(mnt->mnt_dir, path, strlen(mnt->mnt_dir))) + continue; + if (strncmp(mnt->mnt_type, "rpc_pipefs", strlen(mnt->mnt_type))) + break; + } + fclose(mtab); + return mnt != NULL; +} + +int main(int argc, char *argv[]) +{ + int ret; + char *s; + + /* Avoid using any external services */ + xlog_syslog(0); + + if (argc != 4 || argv[1][0] != '/') { + fprintf(stderr, "rpc-pipefs-generator: create systemd dependencies for nfs services\n"); + fprintf(stderr, "Usage: normal-dir early-dir late-dir\n"); + exit(1); + } + + conf_init_file(NFS_CONFFILE); + s = conf_get_str("general", "pipefs-directory"); + if (!s) + exit(0); + if (strlen(s) == strlen(RPC_PIPEFS_DEFAULT) && + strcmp(s, RPC_PIPEFS_DEFAULT) == 0) + exit(0); + + if (is_non_pipefs_mountpoint(s)) + exit(1); + + ret = generate_target(s, argv[1]); + exit(ret); +} diff --git a/systemd/rpc-statd-notify.service b/systemd/rpc-statd-notify.service new file mode 100644 index 0000000..aad4c0d --- /dev/null +++ b/systemd/rpc-statd-notify.service @@ -0,0 +1,16 @@ +[Unit] +Description=Notify NFS peers of a restart +DefaultDependencies=no +Wants=network-online.target +After=local-fs.target network-online.target nss-lookup.target + +# if we run an nfs server, it needs to be running before we +# tell clients that it has restarted. +After=nfs-server.service + +PartOf=nfs-utils.service + +[Service] +Type=forking +ExecStart=-/usr/sbin/sm-notify +RemainAfterExit=yes diff --git a/systemd/rpc-statd.service b/systemd/rpc-statd.service new file mode 100644 index 0000000..392750d --- /dev/null +++ b/systemd/rpc-statd.service @@ -0,0 +1,17 @@ +[Unit] +Description=NFS status monitor for NFSv2/3 locking. +DefaultDependencies=no +Conflicts=umount.target +Requires=nss-lookup.target rpcbind.socket +Wants=network-online.target +Wants=rpc-statd-notify.service +After=network-online.target nss-lookup.target rpcbind.service + +PartOf=nfs-utils.service +IgnoreOnIsolate=yes + +[Service] +Environment=RPC_STATD_NO_NOTIFY=1 +Type=forking +PIDFile=/run/rpc.statd.pid +ExecStart=/usr/sbin/rpc.statd diff --git a/systemd/rpc-svcgssd.service b/systemd/rpc-svcgssd.service new file mode 100644 index 0000000..cb2bcd4 --- /dev/null +++ b/systemd/rpc-svcgssd.service @@ -0,0 +1,15 @@ +[Unit] +Description=RPC security service for NFS server +DefaultDependencies=no +After=local-fs.target +PartOf=nfs-server.service +PartOf=nfs-utils.service + +After=gssproxy.service +ConditionPathExists=|!/run/gssproxy.pid +ConditionPathExists=|!/proc/net/rpc/use-gss-proxy +ConditionPathExists=/etc/krb5.keytab + +[Service] +Type=forking +ExecStart=/usr/sbin/rpc.svcgssd diff --git a/systemd/rpc_pipefs.target b/systemd/rpc_pipefs.target new file mode 100644 index 0000000..01d4d27 --- /dev/null +++ b/systemd/rpc_pipefs.target @@ -0,0 +1,3 @@ +[Unit] +Requires=var-lib-nfs-rpc_pipefs.mount +After=var-lib-nfs-rpc_pipefs.mount diff --git a/systemd/rpc_pipefs.target.in b/systemd/rpc_pipefs.target.in new file mode 100644 index 0000000..332f62b --- /dev/null +++ b/systemd/rpc_pipefs.target.in @@ -0,0 +1,3 @@ +[Unit] +Requires=@_rpc_pipefsmount@ +After=@_rpc_pipefsmount@ diff --git a/systemd/systemd.c b/systemd/systemd.c new file mode 100644 index 0000000..c7bdb4d --- /dev/null +++ b/systemd/systemd.c @@ -0,0 +1,134 @@ +/* + * Helper functions for systemd generators in nfs-utils. + * + * Currently just systemd_escape(). + */ + +#include <stdio.h> +#include <stdlib.h> +#include <ctype.h> +#include <string.h> +#include "systemd.h" + +static const char hex[16] = +{ + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', +}; + +/* + * determine length of the string that systemd_escape() needs to allocate + */ +static int systemd_len(char *path) +{ + char *p; + int len = 0; + + p = path; + while (*p == '/') + /* multiple leading "/" are ignored */ + p++; + + if (!*p) + /* root directory "/" becomes is encoded as a single "-" */ + return 1; + + if (*p == '.') + /* + * replace "." with "\x2d" escape sequence if + * it's the first character in escaped path + * */ + len += 4; + + while (*p) { + unsigned char c = *p++; + + if (c == '/') { + /* multiple non-trailing slashes become '-' */ + while (*p == '/') + p++; + if (*p) + len++; + } else if (isalnum(c) || c == ':' || c == '.' || c == '_') + /* these characters are not replaced */ + len++; + else + /* replace with "\x2d" escape sequence */ + len += 4; + } + + return len; +} + +/* + * convert c to "\x2d" escape sequence and append to string + * at position p, advancing p + */ +static char *hexify(unsigned char c, char *p) +{ + *p++ = '\\'; + *p++ = 'x'; + *p++ = hex[c >> 4]; + *p++ = hex[c & 0xf]; + return p; +} + +/* + * convert a path to a unit name according to the logic in systemd.unit(5): + * + * Basically, given a path, "/" is replaced by "-", and all other + * characters which are not ASCII alphanumerics are replaced by C-style + * "\x2d" escapes (except that "_" is never replaced and "." is only + * replaced when it would be the first character in the escaped path). + * The root directory "/" is encoded as single dash, while otherwise the + * initial and ending "/" are removed from all paths during + * transformation. + * + * NB: Although the systemd.unit(5) doesn't mention it, the ':' character + * is not escaped. + */ +char *systemd_escape(char *path, char *suffix) +{ + char *result; + char *p; + int len; + + len = systemd_len(path); + result = malloc(len + strlen(suffix) + 1); + p = result; + while (*path == '/') + /* multiple leading "/" are ignored */ + path++; + if (!*path) { + /* root directory "/" becomes is encoded as a single "-" */ + *p++ = '-'; + goto out; + } + if (*path == '.') + /* + * replace "." with "\x2d" escape sequence if + * it's the first character in escaped path + * */ + p = hexify(*path++, p); + + while (*path) { + unsigned char c = *path++; + + if (c == '/') { + /* multiple non-trailing slashes become '-' */ + while (*path == '/') + path++; + if (*path) + *p++ = '-'; + } else if (isalnum(c) || c == ':' || c == '.' || c == '_') + /* these characters are not replaced */ + *p++ = c; + else + /* replace with "\x2d" escape sequence */ + p = hexify(c, p); + } + +out: + sprintf(p, "%s", suffix); + return result; +} diff --git a/systemd/systemd.h b/systemd/systemd.h new file mode 100644 index 0000000..25235ec --- /dev/null +++ b/systemd/systemd.h @@ -0,0 +1,6 @@ +#ifndef SYSTEMD_H +#define SYSTEMD_H + +char *systemd_escape(char *path, char *suffix); + +#endif /* SYSTEMD_H */ diff --git a/systemd/var-lib-nfs-rpc_pipefs.mount b/systemd/var-lib-nfs-rpc_pipefs.mount new file mode 100644 index 0000000..26d1c76 --- /dev/null +++ b/systemd/var-lib-nfs-rpc_pipefs.mount @@ -0,0 +1,10 @@ +[Unit] +Description=RPC Pipe File System +DefaultDependencies=no +After=systemd-tmpfiles-setup.service +Conflicts=umount.target + +[Mount] +What=sunrpc +Where=/var/lib/nfs/rpc_pipefs +Type=rpc_pipefs diff --git a/systemd/var-lib-nfs-rpc_pipefs.mount.in b/systemd/var-lib-nfs-rpc_pipefs.mount.in new file mode 100644 index 0000000..4c5d6ce --- /dev/null +++ b/systemd/var-lib-nfs-rpc_pipefs.mount.in @@ -0,0 +1,10 @@ +[Unit] +Description=RPC Pipe File System +DefaultDependencies=no +After=systemd-tmpfiles-setup.service +Conflicts=umount.target + +[Mount] +What=sunrpc +Where=@_statedir@/rpc_pipefs +Type=rpc_pipefs |