diff --git a/doc/lxc-start.sgml.in b/doc/lxc-start.sgml.in index 950cc243b..1770ac2ce 100644 --- a/doc/lxc-start.sgml.in +++ b/doc/lxc-start.sgml.in @@ -80,7 +80,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA If no command is specified, lxc-start will - use the default + use the command defined in lxc.init_cmd or if not set, the default "/sbin/init" command to run a system container. diff --git a/doc/lxc.container.conf.sgml.in b/doc/lxc.container.conf.sgml.in index 35907b502..6d4daac07 100644 --- a/doc/lxc.container.conf.sgml.in +++ b/doc/lxc.container.conf.sgml.in @@ -201,6 +201,29 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Init command + + Sets the command to use as the init system for the containers. + + This option is ignored when using lxc-execute. + + Defaults to: /sbin/init + + + + + + + + + Absolute path from container rootfs to the binary to use as init. + + + + + + Network diff --git a/doc/lxc.sgml.in b/doc/lxc.sgml.in index 1bafaf27c..c522e2b5c 100644 --- a/doc/lxc.sgml.in +++ b/doc/lxc.sgml.in @@ -376,7 +376,8 @@ rootfs command into the container. The pid of the first process is 1. If no command is specified lxc-start will - run /sbin/init. + run the command defined in lxc.init_cmd or if not set, + /sbin/init . diff --git a/src/lxc/conf.c b/src/lxc/conf.c index ac21c7713..90df4d256 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 563109c5e..06d3e234d 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 886f8a113..83dab05ca 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 d0e3bfa31..db25b4871 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 874bb9e4d..006ffc42a 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 2372b197f..406cead15 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?