Re: [nfs-utils PATCH] systemd: add generators for the rpc_pipefs mountpoint

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, 29 Mar 2017, Steve Dickson wrote:

> Hello,
> 
> On 03/28/2017 09:37 AM, Scott Mayhew wrote:
> > The nfs.conf and idmapd.conf files both have config options for the
> > pipefs mountpoint.  Currently, changing these from the defaults also
> > requires manually overriding the systemd unit files that are hard-coded
> > to mount the filesystem on /var/lib/nfs/rpc_pipefs.
> The Pipefs-Directory config variable is not documented in either
> idmapd.conf(5) or rpc.idmapd(8) or nfsidmap(5) so the only way
> to know about it as to read the code. I would not call that
> a supported interface and can easily be removed. IMHO.
> The same thing goes for the Cache-Expiration variable. 

So you're saying to document the Pipefs-Directory and Cache-Expiration
variables, not remove them... right?  I think they should be documented
in idmapd.conf(5) since the other pages both refer to idmapd.conf(5).
> 
> > 
> > This patch adds two generators to create drop-in config files to
> > override the dependencies for the systemd units that require the pipefs.
> > There are two because rpc.idmapd uses a separate configuration file.  If
> > idmapd's configurations are ever folded into the nfs.conf, then the
> > idmapd-rpc-pipefs-generator.c can be deleted and generate=1 can be
> > specified for idmapd in rpc-pipefs-generator.c.
> So I'm thinking we just read Pipefs-Directory out of 
> one spot that would be /etc/nfs.conf.

I agree but then rpc.idmapd and nfsidmap should be modified to read
/etc/nfs.conf instead of /etc/idmapd.conf by default, but that could be
confusing unless some of the section names and/or variable names from
/etc/idmapd.conf were changed up a bit.  That's quite a bit more than
I'm trying to accomplish here.

> That way we would only 
> have to support one of these generators.

If your issue is that there are two generators then I can fold them into
single one... then if the idmapd.conf ever get folded into nfs.conf it's
simply a matter of deleting a few lines of code.  The only reason I made
two generators is becuase it made more sense to me that way.  I'm fine
either way.

> 
> Also please document the Pipefs-Directory variable in both
> the nfs.conf man page and in the example nfs.conf file
> in the git tree. 

It's actually already documented in both, under the gssd section.

> 
> > 
> > This patch also adds a unit file to mount the pipefs on /run/rpc_pipefs,
> > since that is the most logical alternate location for the pipefs
> > filesystem.  Users wanting to use some other location besides
> > /var/lib/nfs/rpc_pipefs or /run/rpc_pipefs would have to create their
> > own systemd mount unit file, but the generators would take care of the
> > rest.
> I'm not sure I understand why this new unit file, run-rpc_pipefs.mount,
> is needed, especially since it is not being install (aka no updates
> to the Makefile.am files).

I forgot to update the Makefile.am by mistake.  I definitely want the
new unit file.  The idea is to give users a choice between
/var/lib/nfs/rpc_pipes and /run/rpc_pipefs without requiring them to go
manually messing around with systemd configs.

-Scott

> 
> steved.
> 
> > 
> > Finally, this patch removes the dependency on the pipefs from the
> > rpc-svcgssd.service unit file.  rpc.svcgssd uses the sunrpc cache
> > mechanism to exchange data with the kernel, not the pipefs.
> > 
> > Signed-off-by: Scott Mayhew <smayhew@xxxxxxxxxx>
> > ---
> >  systemd/Makefile.am                   |   5 +-
> >  systemd/idmapd-rpc-pipefs-generator.c |  99 ++++++++++++++++++++++
> >  systemd/rpc-pipefs-generator.c        | 153 ++++++++++++++++++++++++++++++++++
> >  systemd/rpc-svcgssd.service           |   3 +-
> >  systemd/run-rpc_pipefs.mount          |  10 +++
> >  5 files changed, 267 insertions(+), 3 deletions(-)
> >  create mode 100644 systemd/idmapd-rpc-pipefs-generator.c
> >  create mode 100644 systemd/rpc-pipefs-generator.c
> >  create mode 100644 systemd/run-rpc_pipefs.mount
> > 
> > diff --git a/systemd/Makefile.am b/systemd/Makefile.am
> > index 0d15b9f..f09be00 100644
> > --- a/systemd/Makefile.am
> > +++ b/systemd/Makefile.am
> > @@ -42,12 +42,15 @@ EXTRA_DIST = $(unit_files) $(man5_MANS) $(man7_MANS)
> >  unit_dir = /usr/lib/systemd/system
> >  generator_dir = /usr/lib/systemd/system-generators
> >  
> > -EXTRA_PROGRAMS	= nfs-server-generator
> > +EXTRA_PROGRAMS	= nfs-server-generator rpc-pipefs-generator idmapd-rpc-pipefs-generator
> >  genexecdir = $(generator_dir)
> >  nfs_server_generator_LDADD = ../support/export/libexport.a \
> >  			     ../support/nfs/libnfs.a \
> >  			     ../support/misc/libmisc.a
> >  
> > +rpc_pipefs_generator_LDADD = ../support/nfs/libnfs.a
> > +idmapd_rpc_pipefs_generator_LDADD = ../support/nfs/libnfs.a
> > +
> >  if INSTALL_SYSTEMD
> >  genexec_PROGRAMS = nfs-server-generator
> >  install-data-hook: $(unit_files)
> > diff --git a/systemd/idmapd-rpc-pipefs-generator.c b/systemd/idmapd-rpc-pipefs-generator.c
> > new file mode 100644
> > index 0000000..6b0e382
> > --- /dev/null
> > +++ b/systemd/idmapd-rpc-pipefs-generator.c
> > @@ -0,0 +1,99 @@
> > +/*
> > + * idmapd-rpc-pipefs-generator:
> > + *   systemd generator to create ordering dependencies between
> > + *   the nfs-idmapd service and the rpc_pipefs mount
> > + */
> > +
> > +#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 "nfslib.h"
> > +#include "conffile.h"
> > +
> > +#define RPC_PIPEFS_DEFAULT "/var/lib/nfs/rpc_pipefs"
> > +char *conf_path = _PATH_IDMAPDCONF;
> > +
> > +/* We need to convert a path name to a systemd unit
> > + * name.  This requires some translation ('/' -> '-')
> > + * and some escaping.
> > + */
> > +static void systemd_escape(FILE *f, char *path)
> > +{
> > +	while (*path == '/')
> > +		path++;
> > +	if (!*path) {
> > +		/* "/" becomes "-", otherwise leading "/" is ignored */
> > +		fputs("-", f);
> > +		return;
> > +	}
> > +	while (*path) {
> > +		char c = *path++;
> > +
> > +		if (c == '/') {
> > +			/* multiple non-trailing slashes become '-' */
> > +			while (*path == '/')
> > +				path++;
> > +			if (*path)
> > +				fputs("-", f);
> > +		} else if (isalnum(c) || c == ':' || c == '.' || c == '_')
> > +			fputc(c, f);
> > +		else
> > +			fprintf(f, "\\x%02x", c & 0xff);
> > +	}
> > +}
> > +
> > +int main(int argc, char *argv[])
> > +{
> > +	char	*path;
> > +	char	dirbase[] = "/nfs-idmapd.service.d";
> > +	char	filebase[] = "/10-pipefs.conf";
> > +	FILE	*f;
> > +	char	*s;
> > +
> > +	/* Avoid using any external services */
> > +	xlog_syslog(0);
> > +
> > +	if (argc != 4 || argv[1][0] != '/') {
> > +		fprintf(stderr, "idmapd-rpc-pipefs-generator: create systemd dependencies for nfs-idmapd\n");
> > +		fprintf(stderr, "Usage: normal-dir early-dir late-dir\n");
> > +		exit(1);
> > +	}
> > +
> > +	conf_init();
> > +	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);
> > +
> > +	path = malloc(strlen(argv[1]) + sizeof(dirbase) + sizeof(filebase));
> > +	if (!path)
> > +		exit(2);
> > +	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 idmapd-rpc-pipefs-generator\n\n[Unit]\n");
> > +	fprintf(f, "Requires=\nRequires=");
> > +	systemd_escape(f, s);
> > +	fprintf(f, ".mount\n");
> > +	fprintf(f, "After=\nAfter=");
> > +	systemd_escape(f, s);
> > +	fprintf(f, ".mount local-fs.target\n");
> > +	fclose(f);
> > +
> > +	exit(0);
> > +}
> > diff --git a/systemd/rpc-pipefs-generator.c b/systemd/rpc-pipefs-generator.c
> > new file mode 100644
> > index 0000000..fc65cc9
> > --- /dev/null
> > +++ b/systemd/rpc-pipefs-generator.c
> > @@ -0,0 +1,153 @@
> > +/*
> > + * rpc-pipefs-generator:
> > + *   systemd generator to create ordering dependencies between
> > + *   nfs services and the rpc_pipefs mount(s)
> > + */
> > +
> > +#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 "nfslib.h"
> > +#include "conffile.h"
> > +
> > +#define NUM_PIPEFS_USERS 3
> > +#define RPC_PIPEFS_DEFAULT "/var/lib/nfs/rpc_pipefs"
> > +char *conf_path = NFS_CONFFILE;
> > +
> > +/*
> > + * conf_name - the name as it appears (or would appear, in the case of idmapd,
> > + *             in the /etc/nfs.conf
> > + * unit_name - the name of the systemd service unit file (minus '.service')
> > + * after_local_fs - should the After= directive have local-fs.target or not
> > + * generate - should a drop-in config be generated or not
> > + */
> > +struct pipefs_user {
> > +	char	*conf_name;
> > +	char	*unit_name;
> > +	int	after_local_fs;
> > +	int	generate;
> > +};
> > +
> > +/*
> > + * blkmapd and idmapd are placeholders for now, hence generate=0.  blkmapd
> > + * because it does not have nfs.conf support and because the pipefs directory
> > + * cannot be overriden.  idmapd because it uses a different config file.
> > + */
> > +static struct pipefs_user	pipefs_users[NUM_PIPEFS_USERS] = {
> > +	{
> > +		.conf_name = "gssd",
> > +		.unit_name = "rpc-gssd",
> > +		.after_local_fs = 0,
> > +		.generate = 1,
> > +	},
> > +	{
> > +		.conf_name = "blkmapd",
> > +		.unit_name = "nfs-blkmap",
> > +		.after_local_fs = 0,
> > +		.generate = 0,
> > +	},
> > +	{
> > +		.conf_name = "idmapd",
> > +		.unit_name = "nfs-idmapd",
> > +		.after_local_fs = 1,
> > +		.generate = 0,
> > +	}
> > +};
> > +
> > +/* We need to convert a path name to a systemd unit
> > + * name.  This requires some translation ('/' -> '-')
> > + * and some escaping.
> > + */
> > +static void systemd_escape(FILE *f, char *path)
> > +{
> > +	while (*path == '/')
> > +		path++;
> > +	if (!*path) {
> > +		/* "/" becomes "-", otherwise leading "/" is ignored */
> > +		fputs("-", f);
> > +		return;
> > +	}
> > +	while (*path) {
> > +		char c = *path++;
> > +
> > +		if (c == '/') {
> > +			/* multiple non-trailing slashes become '-' */
> > +			while (*path == '/')
> > +				path++;
> > +			if (*path)
> > +				fputs("-", f);
> > +		} else if (isalnum(c) || c == ':' || c == '.' || c == '_')
> > +			fputc(c, f);
> > +		else
> > +			fprintf(f, "\\x%02x", c & 0xff);
> > +	}
> > +}
> > +
> > +int main(int argc, char *argv[])
> > +{
> > +	char	*path;
> > +	char	dirbase[] = ".service.d";
> > +	char	filebase[] = "/10-pipefs.conf";
> > +	FILE	*f;
> > +	char	*s;
> > +	int	i;
> > +	struct	pipefs_user p;
> > +
> > +	/* 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();
> > +	for (i = 0; i < NUM_PIPEFS_USERS; i++) {
> > +		p = pipefs_users[i];
> > +		if (!p.generate)
> > +			continue;
> > +
> > +		s = conf_get_str(p.conf_name, "pipefs-directory");
> > +		if (!s)
> > +			continue;
> > +		if (strlen(s) == strlen(RPC_PIPEFS_DEFAULT) &&
> > +				strcmp(s, RPC_PIPEFS_DEFAULT) == 0)
> > +			continue;
> > +
> > +		path = malloc(strlen(argv[1]) + 1 + sizeof(p.unit_name) +
> > +				sizeof(dirbase) + sizeof(filebase));
> > +		if (!path)
> > +			exit(2);
> > +		sprintf(path, "%s/%s%s", argv[1], p.unit_name, dirbase);
> > +		mkdir(path, 0755);
> > +		strcat(path, filebase);
> > +		f = fopen(path, "w");
> > +		if (!f)
> > +			exit(1);
> > +
> > +		fprintf(f, "# Automatically generated by rpc-pipefs-generator\n\n[Unit]\n");
> > +		fprintf(f, "Requires=\nRequires=");
> > +		systemd_escape(f, s);
> > +		fprintf(f, ".mount\n");
> > +		fprintf(f, "After=\nAfter=");
> > +		systemd_escape(f, s);
> > +		fprintf(f, ".mount");
> > +		if (p.after_local_fs)
> > +			fprintf(f, " local-fs.target");
> > +		fprintf(f, "\n");
> > +
> > +		fclose(f);
> > +	}
> > +
> > +	exit(0);
> > +}
> > diff --git a/systemd/rpc-svcgssd.service b/systemd/rpc-svcgssd.service
> > index 7187e3c..cb2bcd4 100644
> > --- a/systemd/rpc-svcgssd.service
> > +++ b/systemd/rpc-svcgssd.service
> > @@ -1,8 +1,7 @@
> >  [Unit]
> >  Description=RPC security service for NFS server
> >  DefaultDependencies=no
> > -Requires=var-lib-nfs-rpc_pipefs.mount
> > -After=var-lib-nfs-rpc_pipefs.mount local-fs.target
> > +After=local-fs.target
> >  PartOf=nfs-server.service
> >  PartOf=nfs-utils.service
> >  
> > diff --git a/systemd/run-rpc_pipefs.mount b/systemd/run-rpc_pipefs.mount
> > new file mode 100644
> > index 0000000..aab3145
> > --- /dev/null
> > +++ b/systemd/run-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=/run/rpc_pipefs
> > +Type=rpc_pipefs
> > 
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux