From: Marek Majkowski Date: Tue, 12 Nov 2013 13:14:25 +0000 (-0800) Subject: Create --share-ipc option X-Git-Tag: lxc-1.0.0.beta1~93^2~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3c93577b43943f653194f6189cb2c4b6a17bf96a;p=thirdparty%2Flxc.git Create --share-ipc option --- diff --git a/doc/lxc-start.sgml.in b/doc/lxc-start.sgml.in index 756ea9c49..86024f66d 100644 --- a/doc/lxc-start.sgml.in +++ b/doc/lxc-start.sgml.in @@ -58,6 +58,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -s KEY=VAL -C --share-net name|pid + --share-ipc name|pid command @@ -203,6 +204,15 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + + + + + + Inherit an IPC namespace from + a name container or + a pid. diff --git a/src/lxc/arguments.h b/src/lxc/arguments.h index bf262f859..1befc8da0 100644 --- a/src/lxc/arguments.h +++ b/src/lxc/arguments.h @@ -55,6 +55,7 @@ struct lxc_arguments { /* for lxc-start */ const char *share_net; + const char *share_ipc; /* for lxc-checkpoint/restart */ const char *statefile; diff --git a/src/lxc/lxc_start.c b/src/lxc/lxc_start.c index ca88940aa..28c84cb40 100644 --- a/src/lxc/lxc_start.c +++ b/src/lxc/lxc_start.c @@ -52,6 +52,7 @@ #include "arguments.h" #define OPT_SHARE_NET OPT_USAGE+1 +#define OPT_SHARE_IPC OPT_USAGE+2 lxc_log_define(lxc_start_ui, lxc_start); @@ -146,6 +147,7 @@ static int my_parser(struct lxc_arguments* args, int c, char* arg) case 's': return lxc_config_define_add(&defines, arg); case 'p': args->pidfile = arg; break; case OPT_SHARE_NET: args->share_net = arg; break; + case OPT_SHARE_IPC: args->share_ipc = arg; break; } return 0; } @@ -159,6 +161,7 @@ static const struct option my_longopts[] = { {"close-all-fds", no_argument, 0, 'C'}, {"pidfile", required_argument, 0, 'p'}, {"share-net", required_argument, 0, OPT_SHARE_NET}, + {"share-ipc", required_argument, 0, OPT_SHARE_IPC}, LXC_COMMON_OPTIONS }; @@ -181,6 +184,7 @@ Options :\n\ Note: --daemon implies --close-all-fds\n\ -s, --define KEY=VAL Assign VAL to configuration variable KEY\n\ --share-net=NAME Share a network namespace with another container or pid\n\ + --share-ipc=NAME Share an IPC namespace with another container or pid\n\ ", .options = my_longopts, .parser = my_parser, @@ -308,6 +312,17 @@ int main(int argc, char *argv[]) conf->inherit_ns_fd[LXC_NS_NET] = fd; } + if (my_args.share_ipc != NULL) { + int pid = pid_from_lxcname(my_args.share_ipc, lxcpath); + if (pid < 1) + goto out; + + int fd = open_ns(pid, "ipc"); + if (fd < 0) + goto out; + conf->inherit_ns_fd[LXC_NS_IPC] = fd; + } + if (my_args.daemonize) { c->want_daemonize(c); } diff --git a/src/lxc/start.c b/src/lxc/start.c index 425fa1dbf..f591ad7da 100644 --- a/src/lxc/start.c +++ b/src/lxc/start.c @@ -727,7 +727,7 @@ int lxc_spawn(struct lxc_handler *handler) if (lxc_sync_init(handler)) return -1; - handler->clone_flags = CLONE_NEWUTS|CLONE_NEWPID|CLONE_NEWIPC|CLONE_NEWNS; + handler->clone_flags = CLONE_NEWUTS|CLONE_NEWPID|CLONE_NEWNS; if (!lxc_list_empty(&handler->conf->id_map)) { INFO("Cloning a new user namespace"); handler->clone_flags |= CLONE_NEWUSER; @@ -766,6 +766,12 @@ int lxc_spawn(struct lxc_handler *handler) INFO("Inheriting a net namespace"); } + if (handler->conf->inherit_ns_fd[LXC_NS_IPC] == -1) { + handler->clone_flags |= CLONE_NEWIPC; + } else { + INFO("Inheriting an IPC namespace"); + } + cgroup_meta = lxc_cgroup_load_meta(); if (!cgroup_meta) {