[CRIU] [PATCH] Add an optional --script-data argument to criu

Pavel Emelyanov xemul at parallels.com
Thu Oct 16 01:50:27 PDT 2014


On 10/16/2014 12:39 PM, Tycho Andersen wrote:
> When restoring a particular container, we would like to pass the container id
> to our network-{lock,unlock} script so that it can figure out which is the
> right network to lock and unlock. We add a --script-data argument, which can be
> used to set an environment variable that is exported for scripts to inspect.

Why not set this as environment in LXC and let it flow through
criu process seamlessly? Does it get lost somewhere in between?

Like this

In LXC:
  setenv("LXC_RST_CT_ID", "12345")
  system("criu restore ... --action-script lxc.rst.script")

In lxc.rst.script:
  CTID=$LXC_RST_CT_ID


Thanks,
Pavel

> Signed-off-by: Tycho Andersen <tycho.andersen at canonical.com>
> ---
>  Makefile             | 2 +-
>  action-scripts.c     | 8 ++++++++
>  crtools.c            | 6 ++++++
>  include/cr_options.h | 1 +
>  4 files changed, 16 insertions(+), 1 deletion(-)
> 
> diff --git a/Makefile b/Makefile
> index f2d06ab..e87575f 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -250,7 +250,7 @@ criu-$(CRTOOLSVERSION).tar.bz2:
>  		v$(CRTOOLSVERSION) | bzip2 > $@
>  .PHONY: dist tar
>  
> -install: $(PROGRAM) $(CRIU-LIB) install-man
> +install: $(PROGRAM) $(CRIU-LIB)
>  	$(E) "  INSTALL " $(PROGRAM)
>  	$(Q) mkdir -p $(DESTDIR)$(SBINDIR)
>  	$(Q) install -m 755 $(PROGRAM) $(DESTDIR)$(SBINDIR)
> diff --git a/action-scripts.c b/action-scripts.c
> index d2b1a59..638dfc5 100644
> --- a/action-scripts.c
> +++ b/action-scripts.c
> @@ -39,6 +39,11 @@ int run_scripts(enum script_actions act)
>  		return -1;
>  	}
>  
> +	if (opts.script_data && setenv("CRTOOLS_SCRIPT_DATA", opts.script_data, 1)) {
> +		pr_perror("Can't set CRTOOLS_SCRIPT_DATA=%s", opts.script_data);
> +		return -1;
> +	}
> +
>  	list_for_each_entry(script, &opts.scripts, node) {
>  		if (script->path == SCRIPT_RPC_NOTIFY) {
>  			pr_debug("\tRPC\n");
> @@ -51,6 +56,9 @@ int run_scripts(enum script_actions act)
>  
>  	unsetenv("CRTOOLS_SCRIPT_ACTION");
>  	unsetenv("CRTOOLS_IMAGE_DIR");
> +	unsetenv("CRTOOLS_SCRIPT_DATA");
> +	if (ret)
> +		pr_err("Script exited with code %d\n", ret);
>  	return ret;
>  }
>  
> diff --git a/crtools.c b/crtools.c
> index a245bbb..bca60ae 100644
> --- a/crtools.c
> +++ b/crtools.c
> @@ -187,6 +187,7 @@ int main(int argc, char *argv[], char *envp[])
>  		{ "exec-cmd", no_argument, 0, 1059},
>  		{ "manage-cgroups", no_argument, 0, 1060},
>  		{ "cgroup-root", required_argument, 0, 1061},
> +		{ "script-data", required_argument, 0, 1062},
>  		{ },
>  	};
>  
> @@ -392,6 +393,9 @@ int main(int argc, char *argv[], char *envp[])
>  					return -1;
>  			}
>  			break;
> +		case 1062:
> +			opts.script_data = optarg;
> +			break;
>  		case 'M':
>  			{
>  				char *aux;
> @@ -591,6 +595,8 @@ usage:
>  "  --veth-pair IN=OUT    map inside veth device name to outside one\n"
>  "  --link-remap          allow to link unlinked files back when possible\n"
>  "  --action-script FILE  add an external action script\n"
> +"  --script-data         A string of data to pass to action scripts as the\n"
> +"                        CRTOOLS_SCRIPT_DATA environment variable.\n"
>  "  -j|--" OPT_SHELL_JOB "        allow to dump and restore shell jobs\n"
>  "  -l|--" OPT_FILE_LOCKS "       handle file locks, for safety, only used for container\n"
>  "  -L|--libdir           path to a plugin directory (by default " CR_PLUGIN_DEFAULT ")\n"
> diff --git a/include/cr_options.h b/include/cr_options.h
> index a9f9e92..73ca5e8 100644
> --- a/include/cr_options.h
> +++ b/include/cr_options.h
> @@ -58,6 +58,7 @@ struct cr_options {
>  	char			*new_global_cg_root;
>  	struct list_head	new_cgroup_roots;
>  	bool			aufs;		/* auto-deteced, not via cli */
> +	char			*script_data;
>  };
>  
>  extern struct cr_options opts;
> 



More information about the CRIU mailing list