]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
Make it possible to share UTS namespace
authorMarek Majkowski <marek@cloudflare.com>
Wed, 13 Nov 2013 13:20:26 +0000 (05:20 -0800)
committerMarek Majkowski <marek@cloudflare.com>
Wed, 13 Nov 2013 13:20:26 +0000 (05:20 -0800)
doc/lxc-start.sgml.in
src/lxc/conf.c
src/lxc/lxc_start.c
src/lxc/start.c

index 86024f66d626560279be012aa2926c1a51ba7d73..766a4ec2b760024be308ed1a57dfa09b11a5c49e 100644 (file)
@@ -217,6 +217,21 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
        </listitem>
       </varlistentry>
 
+      <varlistentry>
+       <term>
+         <option>--share-uts <replaceable>name|pid</replaceable></option>
+       </term>
+       <listitem>
+         <para>
+            Inherit a UTS namespace from
+           a <replaceable>name</replaceable> container or
+           a <replaceable>pid</replaceable>. The starting LXC will
+           not set the hostname, but the container OS may do it
+           anyway.
+         </para>
+       </listitem>
+      </varlistentry>
+
     </variablelist>
 
   </refsect1>
index 3bebe46d157d07946c6654f1d0ff5db19f7ab9be..dfc49e435fce0ef1e42700e7b96892480d27a1f5 100644 (file)
@@ -3141,9 +3141,11 @@ int ttys_shift_ids(struct lxc_conf *c)
 
 int lxc_setup(const char *name, struct lxc_conf *lxc_conf, const char *lxcpath, struct cgroup_process_info *cgroup_info)
 {
-       if (setup_utsname(lxc_conf->utsname)) {
-               ERROR("failed to setup the utsname for '%s'", name);
-               return -1;
+       if (lxc_conf->inherit_ns_fd[LXC_NS_UTS] == -1) {
+               if (setup_utsname(lxc_conf->utsname)) {
+                       ERROR("failed to setup the utsname for '%s'", name);
+                       return -1;
+               }
        }
 
        if (setup_network(&lxc_conf->network)) {
index a7976eafbde6fcda67b300f9963e9bff65291356..02867fb2e09a9f4b9cdc1743b18728f4716c0faa 100644 (file)
@@ -53,6 +53,7 @@
 
 #define OPT_SHARE_NET OPT_USAGE+1
 #define OPT_SHARE_IPC OPT_USAGE+2
+#define OPT_SHARE_UTS OPT_USAGE+3
 
 lxc_log_define(lxc_start_ui, lxc_start);
 
@@ -153,6 +154,7 @@ static int my_parser(struct lxc_arguments* args, int c, char* arg)
        case 'p': args->pidfile = arg; break;
        case OPT_SHARE_NET: args->share_ns[LXC_NS_NET] = arg; break;
        case OPT_SHARE_IPC: args->share_ns[LXC_NS_IPC] = arg; break;
+       case OPT_SHARE_UTS: args->share_ns[LXC_NS_UTS] = arg; break;
        }
        return 0;
 }
@@ -167,6 +169,7 @@ static const struct option my_longopts[] = {
        {"pidfile", required_argument, 0, 'p'},
        {"share-net", required_argument, 0, OPT_SHARE_NET},
        {"share-ipc", required_argument, 0, OPT_SHARE_IPC},
+       {"share-uts", required_argument, 0, OPT_SHARE_UTS},
        LXC_COMMON_OPTIONS
 };
 
@@ -190,6 +193,7 @@ Options :\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\
+      --share-uts=NAME   Share a UTS namespace with another container or pid\n\
 ",
        .options   = my_longopts,
        .parser    = my_parser,
index f591ad7dab429e6a23966408e3348cfc3ec5c9a6..5e3ce7f0f845ebfec6bf7fbb9b08a7c87a7c9a8e 100644 (file)
@@ -721,13 +721,13 @@ int lxc_spawn(struct lxc_handler *handler)
        int preserve_mask = 0, i;
 
        for (i = 0; i < LXC_NS_MAX; i++)
-               if (handler->conf->inherit_ns_fd[i] > -1)
+               if (handler->conf->inherit_ns_fd[i] != -1)
                        preserve_mask |= ns_info[i].clone_flag;
 
        if (lxc_sync_init(handler))
                return -1;
 
-       handler->clone_flags = CLONE_NEWUTS|CLONE_NEWPID|CLONE_NEWNS;
+       handler->clone_flags = CLONE_NEWPID|CLONE_NEWNS;
        if (!lxc_list_empty(&handler->conf->id_map)) {
                INFO("Cloning a new user namespace");
                handler->clone_flags |= CLONE_NEWUSER;
@@ -772,6 +772,12 @@ int lxc_spawn(struct lxc_handler *handler)
                INFO("Inheriting an IPC namespace");
        }
 
+       if (handler->conf->inherit_ns_fd[LXC_NS_UTS] == -1) {
+               handler->clone_flags |= CLONE_NEWUTS;
+       } else {
+               INFO("Inheriting a UTS namespace");
+       }
+
 
        cgroup_meta = lxc_cgroup_load_meta();
        if (!cgroup_meta) {