[lxc-devel] [PATCH] Define a new lxc.init_cmd config option

Stéphane Graber stgraber at ubuntu.com
Mon Dec 1 16:05:38 UTC 2014


On Mon, Dec 01, 2014 at 10:13:32AM -0500, Dwight Engen wrote:
> On Wed, 26 Nov 2014 15:34:41 -0500
> Stéphane Graber <stgraber at ubuntu.com> wrote:
> 
> > Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
> 
> Acked-by: Dwight Engen <dwight.engen at oracle.com>
> 
> I think we should also update the lxc-start manpage, which says
> "If no command is specified, lxc-start will use the default
> "/sbin/init" command to run a system container"
> 
> to something like
> 
> "If no command is specified, lxc-start will use the lxc.init_cmd
> configuration option, or if that is not given fall back to /sbin/init
> to run a system container"

Good point, I'll update that before pushing.

Thanks

> 
> > ---
> >  doc/lxc.container.conf.sgml.in | 23 +++++++++++++++++++++++
> >  src/lxc/conf.c                 |  2 ++
> >  src/lxc/conf.h                 |  3 +++
> >  src/lxc/confile.c              | 10 ++++++++++
> >  src/lxc/lxc_autostart.c        |  6 +-----
> >  src/lxc/lxc_start.c            |  5 ++++-
> >  src/lxc/lxccontainer.c         | 12 ++++++++++--
> >  7 files changed, 53 insertions(+), 8 deletions(-)
> > 
> > diff --git a/doc/lxc.container.conf.sgml.in
> > b/doc/lxc.container.conf.sgml.in index 35907b5..6d4daac 100644
> > --- a/doc/lxc.container.conf.sgml.in
> > +++ b/doc/lxc.container.conf.sgml.in
> > @@ -202,6 +202,29 @@ Foundation, Inc., 51 Franklin Street, Fifth
> > Floor, Boston, MA 02110-1301 USA </refsect2>
> >  
> >      <refsect2>
> > +      <title>Init command</title>
> > +      <para>
> > +        Sets the command to use as the init system for the
> > containers. +
> > +        This option is ignored when using lxc-execute.
> > +
> > +        Defaults to: /sbin/init
> > +      </para>
> > +      <variablelist>
> > +    <varlistentry>
> > +      <term>
> > +        <option>lxc.init_cmd</option>
> > +      </term>
> > +      <listitem>
> > +        <para>
> > +          Absolute path from container rootfs to the binary to use
> > as init.
> > +        </para>
> > +      </listitem>
> > +    </varlistentry>
> > +      </variablelist>
> > +    </refsect2>
> > +
> > +    <refsect2>
> >        <title>Network</title>
> >        <para>
> >          The network section defines how the network is virtualized in
> > diff --git a/src/lxc/conf.c b/src/lxc/conf.c
> > index ac21c77..90df4d2 100644
> > --- a/src/lxc/conf.c
> > +++ b/src/lxc/conf.c
> > @@ -4537,6 +4537,8 @@ void lxc_conf_free(struct lxc_conf *conf)
> >  		free(conf->fstab);
> >  	if (conf->rcfile)
> >  		free(conf->rcfile);
> > +	if (conf->init_cmd)
> > +		free(conf->init_cmd);
> >  	free(conf->unexpanded_config);
> >  	lxc_clear_config_network(conf);
> >  	if (conf->lsm_aa_profile)
> > diff --git a/src/lxc/conf.h b/src/lxc/conf.h
> > index 563109c..06d3e23 100644
> > --- a/src/lxc/conf.h
> > +++ b/src/lxc/conf.h
> > @@ -356,6 +356,9 @@ struct lxc_conf {
> >  	/* text representation of the config file */
> >  	char *unexpanded_config;
> >  	size_t unexpanded_len, unexpanded_alloced;
> > +
> > +	/* init command */
> > +	char *init_cmd;
> >  };
> >  
> >  int run_lxc_hooks(const char *name, char *hook, struct lxc_conf
> > *conf, diff --git a/src/lxc/confile.c b/src/lxc/confile.c
> > index 886f8a1..83dab05 100644
> > --- a/src/lxc/confile.c
> > +++ b/src/lxc/confile.c
> > @@ -101,6 +101,7 @@ static int config_stopsignal(const char *, const
> > char *, struct lxc_conf *); static int config_start(const char *,
> > const char *, struct lxc_conf *); static int config_group(const char
> > *, const char *, struct lxc_conf *); static int
> > config_environment(const char *, const char *, struct lxc_conf *);
> > +static int config_init_cmd(const char *, const char *, struct
> > lxc_conf *); static struct lxc_config_t config[] = {
> >  
> > @@ -162,6 +163,7 @@ static struct lxc_config_t config[] = {
> >  	{ "lxc.start.order",          config_start                },
> >  	{ "lxc.group",                config_group                },
> >  	{ "lxc.environment",          config_environment          },
> > +	{ "lxc.init_cmd",             config_init_cmd             },
> >  };
> >  
> >  struct signame {
> > @@ -965,6 +967,12 @@ static int config_seccomp(const char *key, const
> > char *value, return config_path_item(&lxc_conf->seccomp, value);
> >  }
> >  
> > +static int config_init_cmd(const char *key, const char *value,
> > +				 struct lxc_conf *lxc_conf)
> > +{
> > +	return config_path_item(&lxc_conf->init_cmd, value);
> > +}
> > +
> >  static int config_hook(const char *key, const char *value,
> >  				 struct lxc_conf *lxc_conf)
> >  {
> > @@ -2327,6 +2335,8 @@ int lxc_get_config_item(struct lxc_conf *c,
> > const char *key, char *retv, v = c->seccomp;
> >  	else if (strcmp(key, "lxc.environment") == 0)
> >  		return lxc_get_item_environment(c, retv, inlen);
> > +	else if (strcmp(key, "lxc.init_cmd") == 0)
> > +		v = c->init_cmd;
> >  	else return -1;
> >  
> >  	if (!v)
> > diff --git a/src/lxc/lxc_autostart.c b/src/lxc/lxc_autostart.c
> > index d0e3bfa..db25b48 100644
> > --- a/src/lxc/lxc_autostart.c
> > +++ b/src/lxc/lxc_autostart.c
> > @@ -330,10 +330,6 @@ int main(int argc, char *argv[])
> >  	struct lxc_container **containers = NULL;
> >  	struct lxc_list **c_groups_lists = NULL;
> >  	struct lxc_list *cmd_group;
> > -	char *const default_start_args[] = {
> > -		"/sbin/init",
> > -		NULL,
> > -	};
> >  
> >  	if (lxc_arguments_parse(&my_args, argc, argv))
> >  		return 1;
> > @@ -470,7 +466,7 @@ int main(int argc, char *argv[])
> >  						printf("%s %d\n",
> > c->name, get_config_integer(c, "lxc.start.delay"));
> >  					else {
> > -						if (!c->start(c, 0,
> > default_start_args))
> > +						if (!c->start(c, 0,
> > NULL)) fprintf(stderr, "Error starting container: %s\n", c->name);
> >  						else
> >  							sleep(get_config_integer(c,
> > "lxc.start.delay")); diff --git a/src/lxc/lxc_start.c
> > b/src/lxc/lxc_start.c index 874bb9e..006ffc4 100644
> > --- a/src/lxc/lxc_start.c
> > +++ b/src/lxc/lxc_start.c
> > @@ -336,7 +336,10 @@ int main(int argc, char *argv[])
> >  	if (my_args.close_all_fds)
> >  		c->want_close_all_fds(c, true);
> >  
> > -	err = c->start(c, 0, args) ? 0 : 1;
> > +	if (args == default_args)
> > +		err = c->start(c, 0, NULL) ? 0 : 1;
> > +	else
> > +		err = c->start(c, 0, args) ? 0 : 1;
> >  
> >  	if (err) {
> >  		ERROR("The container failed to start.");
> > diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c
> > index 2372b19..406cead 100644
> > --- a/src/lxc/lxccontainer.c
> > +++ b/src/lxc/lxccontainer.c
> > @@ -555,6 +555,7 @@ static bool lxcapi_start(struct lxc_container *c,
> > int useinit, char * const argv "/sbin/init",
> >  		NULL,
> >  	};
> > +	char *init_cmd[2];
> >  
> >  	/* container exists */
> >  	if (!c)
> > @@ -591,8 +592,15 @@ static bool lxcapi_start(struct lxc_container
> > *c, int useinit, char * const argv return ret == 0 ? true : false;
> >  	}
> >  
> > -	if (!argv)
> > -		argv = default_args;
> > +	if (!argv) {
> > +		if (conf->init_cmd) {
> > +			init_cmd[0] = conf->init_cmd;
> > +			init_cmd[1] = NULL;
> > +			argv = init_cmd;
> > +		}
> > +		else
> > +			argv = default_args;
> > +	}
> >  
> >  	/*
> >  	* say, I'm not sure - what locks do we want here?  Any?
> 
> _______________________________________________
> lxc-devel mailing list
> lxc-devel at lists.linuxcontainers.org
> http://lists.linuxcontainers.org/listinfo/lxc-devel

-- 
Stéphane Graber
Ubuntu developer
http://www.ubuntu.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20141201/b443792b/attachment.sig>


More information about the lxc-devel mailing list