[CRIU] [PATCH 3/6] unshare: Preparations and CLI option
Andrew Vagin
avagin at virtuozzo.com
Tue Mar 15 10:33:41 PDT 2016
On Tue, Mar 15, 2016 at 10:28:40AM -0700, Andrew Vagin wrote:
> On Wed, Dec 09, 2015 at 02:59:46PM +0300, Pavel Emelyanov wrote:
> > On restore one may say --unshare <what>. The <what> can be namespace
> > name for ns unshare or 'proc' to mount new proc in mntns. Several
> > <what>-s are to be comma-separated.
> >
> > With this the restored tree will get born into the desired set of
> > namespaces. As different namespaces have their peculiarities, the
> > ability to unshare each will come with next patches.
> >
> > Signed-off-by: Pavel Emelyanov <xemul at parallels.com>
> > ---
> > crtools.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
> > include/cr_options.h | 1 +
> > pstree.c | 21 +++++++++++++++++++++
> > 3 files changed, 71 insertions(+)
> >
> > diff --git a/crtools.c b/crtools.c
> > index 68756a0..bca7471 100644
> > --- a/crtools.c
> > +++ b/crtools.c
> > @@ -95,6 +95,49 @@ bad_ns:
> > return -1;
> > }
> >
> > +static int parse_unshare_arg(char *opt)
> > +{
> > + while (1) {
> > + char *aux;
> > +
> > + aux = strchr(opt, ',');
> > + if (aux)
> > + *aux = '\0';
> > +
> > + if (!strcmp(opt, "uts"))
> > + opts.unshare_flags |= CLONE_NEWUTS;
> > + else if (!strcmp(opt, "ipc"))
> > + opts.unshare_flags |= CLONE_NEWIPC;
> > + else if (!strcmp(opt, "mnt"))
> > + opts.unshare_flags |= CLONE_NEWNS;
> > + else if (!strcmp(opt, "pid"))
> > + opts.unshare_flags |= CLONE_NEWPID;
> > + else if (!strcmp(opt, "net"))
> > + opts.unshare_flags |= CLONE_NEWNET;
> > + else if (!strcmp(opt, "user"))
> > + opts.unshare_flags |= CLONE_NEWUSER;
>
> We need to set id mappings for user name space, otherwise it will not
> work, will it?
Pls, ignore this comment.,
I found that we will print an error if we don't know how to unshare a
namespace.
>
> > + else if (!strcmp(opt, "proc"))
> > + opts.unshare_flags |= 0x1; /* mount new proc */
> > + else {
> > + pr_msg("Error: unknown unshare flag %s\n", opt);
> > + return -1;
> > + }
> > +
> > + if (!aux)
> > + break;
> > +
> > + opt = aux + 1;
> > + }
> > +
> > + /* Only pid, mnt and user for now */
> > + if (opts.unshare_flags) {
> > + pr_err("Unsharing this namespace(s) is not supported yet\n");
> > + return -1;
> > + }
> > +
> > + return 0;
> > +}
> > +
> > static int parse_cpu_cap(struct cr_options *opts, const char *optarg)
> > {
> > bool inverse = false;
> > @@ -255,6 +298,7 @@ int main(int argc, char *argv[], char *envp[])
> > { "ghost-limit", required_argument, 0, 1069 },
> > { "irmap-scan-path", required_argument, 0, 1070 },
> > { "lsm-profile", required_argument, 0, 1071 },
> > + { "unshare", required_argument, 0, 1072 },
> > { },
> > };
> >
> > @@ -504,6 +548,10 @@ int main(int argc, char *argv[], char *envp[])
> > if (parse_lsm_arg(optarg) < 0)
> > return -1;
> > break;
> > + case 1072:
> > + if (parse_unshare_arg(optarg))
> > + return -1;
> > + break;
> > case 'M':
> > {
> > char *aux;
> > @@ -714,6 +762,7 @@ usage:
> > " 'cpu','fpu','all','ins','none'. To disable capability, prefix it with '^'.\n"
> > " --exec-cmd execute the command specified after '--' on successful\n"
> > " restore making it the parent of the restored process\n"
> > +" --unshare FLAGS what namespaces to unshare when restoring\n"
> > " --freeze-cgroup\n"
> > " use cgroup freezer to collect processes\n"
> > "\n"
> > diff --git a/include/cr_options.h b/include/cr_options.h
> > index d0c74fe..20e4180 100644
> > --- a/include/cr_options.h
> > +++ b/include/cr_options.h
> > @@ -64,6 +64,7 @@ struct cr_options {
> > bool evasive_devices;
> > bool link_remap_ok;
> > unsigned int rst_namespaces_flags;
> > + unsigned long unshare_flags;
> > bool log_file_per_pid;
> > bool swrk_restore;
> > char *output;
> > diff --git a/pstree.c b/pstree.c
> > index 116b5e7..ba547c1 100644
> > --- a/pstree.c
> > +++ b/pstree.c
> > @@ -741,6 +741,25 @@ set_mask:
> > return 0;
> > }
> >
> > +static int prepare_pstree_for_unshare(void)
> > +{
> > + {
> > + unsigned long aux;
> > +
> > + /*
> > + * Move root into desired set of namespaces, but keep
> > + * in opts.unshare_flags those that were deliberately
> > + * enforced for further reference.
> > + */
> > + aux = rsti(root_item)->clone_flags;
> > + rsti(root_item)->clone_flags |= opts.unshare_flags;
> > + opts.unshare_flags &= ~aux;
> > + }
> > +
> > + root_ns_mask |= opts.unshare_flags;
> > + return 0;
> > +}
> > +
> > int prepare_pstree(void)
> > {
> > int ret;
> > @@ -759,6 +778,8 @@ int prepare_pstree(void)
> > */
> > ret = prepare_pstree_kobj_ids();
> > if (!ret)
> > + ret = prepare_pstree_for_unshare();
> > + if (!ret)
> > /*
> > * Session/Group leaders might be dead. Need to fix
> > * pstree with properly injected helper tasks.
> > --
> > 1.9.3
> >
> >
> > _______________________________________________
> > CRIU mailing list
> > CRIU at openvz.org
> > https://lists.openvz.org/mailman/listinfo/criu
More information about the CRIU
mailing list