[CRIU] [PATCH 8/8] vzctl: checkpoint/restoer of upstream CTs
Kir Kolyshkin
kir at openvz.org
Wed May 15 21:09:06 EDT 2013
On 05/15/2013 09:10 AM, Andrey Vagin wrote:
> It can be done by any third party tools.
> sripts/ct-cpt and script/ct_rst are executed to dump and restore CT
> This patch adds scripts for CRIU.
>
> Signed-off-by: Andrey Vagin <avagin at openvz.org>
> ---
> scripts/ct-cpt | 19 ++++++++++++
> scripts/ct-rst | 17 ++++++++++
> src/lib/hooks_ct.c | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
> 3 files changed, 126 insertions(+), 1 deletion(-)
> create mode 100755 scripts/ct-cpt
> create mode 100755 scripts/ct-rst
>
> diff --git a/scripts/ct-cpt b/scripts/ct-cpt
> new file mode 100755
> index 0000000..87c09dc
> --- /dev/null
> +++ b/scripts/ct-cpt
> @@ -0,0 +1,19 @@
> +#!/bin/sh
> +mkdir $CT_CR_DIR &&
You'd better
1 describe what environment variables you expect here
2 check for their existence, refusing to run otherwise
> +crtools dump --file-locks \
It's criu :)
> + --tcp-established \
> + --evasive-devices \
> + --link-remap \
> + --root $CT_ROOT \
I'd keep the old name, ie VE_ROOT, since this is what all the other
scripts use all over.
> + -t $CT_PID \
> + -D $CT_CR_DIR \
> + -o dump.log \
> + -vvvv
> +if [ $? -ne 0 ]; then
> + [ -d $CT_CR_DIR.fail ] && rm -rf $CT_CR_DIR.fail
> + mv -f $CT_CR_DIR $CT_CR_DIR.fail
> + echo All dump files and logs were saved in $CT_CR_DIR.fail
> + exit 1
> +else
> + echo Checkpointing finished successfully
> +fi
> diff --git a/scripts/ct-rst b/scripts/ct-rst
> new file mode 100755
> index 0000000..8953ec6
> --- /dev/null
> +++ b/scripts/ct-rst
> @@ -0,0 +1,17 @@
> +#!/bin/sh
> +crtools restore --file-locks \
criu
> + --tcp-established \
> + --evasive-devices \
> + --link-remap \
> + --root $CT_ROOT \
> + --restore-detached \
> + -D $CT_CR_DIR \
> + -o restore.log \
> + -vvvv \
> + --pidfile $CT_STATE
> +if [ $? -eq 0 ]; then
> + rm -rf $CT_CR_DIR
> +else
> + echo The restore log was saved in $CT_CR_DIR/restore.log
> + exit 1
> +fi
> diff --git a/src/lib/hooks_ct.c b/src/lib/hooks_ct.c
> index 3c82823..97c8695 100644
> --- a/src/lib/hooks_ct.c
> +++ b/src/lib/hooks_ct.c
> @@ -17,6 +17,7 @@
> #include "logger.h"
> #include "script.h"
> #include "cgroup.h"
> +#include "cpt.h"
>
> #define NETNS_RUN_DIR "/var/run/netns"
>
> @@ -307,7 +308,10 @@ int ct_env_create(struct arg_start *arg)
> return VZ_RESOURCE_ERROR;
> }
>
> - ret = ct_env_create_real(arg);
> + if (arg->fn)
> + ret = arg->fn(arg->h, arg->veid, arg->res, arg->wait_p, arg->old_wait_p, arg->err_p, arg->data);
> + else
> + ret = ct_env_create_real(arg);
>
> snprintf(procpath, STR_SIZE, "/proc/%d/ns/net", ret);
> ret = symlink(procpath, ctpath);
> @@ -597,6 +601,89 @@ static int ct_setcontext(envid_t veid)
> return 0;
> }
>
> +static int ct_chkpnt(vps_handler *h, envid_t veid, const vps_res *res,
> + int cmd, cpt_param *param)
> +{
> + const char *dumpfile = NULL;
> + char pidstr[STR_SIZE], buf[STR_SIZE];
> + int ret, fd;
> + char *arg[2];
> + char *env[4];
> +
> + ret = VZ_CHKPNT_ERROR;
> +
> + get_dump_file(veid, param->dumpdir, buf, sizeof(buf));
> + dumpfile = strdup(buf);
> +
> + arg[0] = SCRIPTDIR "/ct-cpt";
> + arg[1] = NULL;
> +
> + get_state_file(veid, res->env.statedir, pidstr, sizeof(pidstr));
> + fd = open(pidstr, O_RDONLY);
> + if (fd == -1) {
> + logger(-1, 0, "Unable to open the pid file");
second logger() argument should be errno not 0 here (and in every place
where errno makes sense).
> + return VZ_CHKPNT_ERROR;
> + }
> +
> + ret = read(fd, pidstr, sizeof(pidstr) - 1);
> + if (ret == -1) {
> + logger(-1, 0, "Unable to read pid");
ditto
> + return VZ_CHKPNT_ERROR;
> + }
> + pidstr[ret] = '\0';
> +
> + snprintf(buf, sizeof(buf), "CT_ROOT=%s", res->fs.root);
VE_ROOT
> + env[0] = strdup(buf);
> + snprintf(buf, sizeof(buf), "CT_PID=%s", pidstr);
> + env[1] = strdup(buf);
> + snprintf(buf, sizeof(buf), "CT_CR_DIR=%s", dumpfile);
> + env[2] = strdup(buf);
> + env[3] = NULL;
> +
> + if (run_script(arg[0], arg, env, 0))
> + return ret;
> +
> + return 0;
> +}
> +
> +static int ct_env_restore(vps_handler *h, envid_t veid, vps_res *res,
> + int wait_p, int old_wait_p, int err_p, void *data)
> +{
> + char *env[4];
> + char *argv[2];
> + char buf[STR_SIZE];
> + const char *dumpfile = NULL;
> + const char *statefile = NULL;
> + cpt_param *param = data;
> +
> + get_dump_file(veid, param->dumpdir, buf, sizeof(buf));
> + dumpfile = strdup(buf);
> +
> + get_state_file(veid, res->env.statedir, buf, sizeof(buf));
> + statefile = strdup(buf);
> +
> + argv[0] = SCRIPTDIR "/ct-rst";
> + argv[1] = NULL;
> +
> + snprintf(buf, sizeof(buf), "CT_ROOT=%s", res->fs.root);
> + env[0] = strdup(buf);
> + snprintf(buf, sizeof(buf), "CT_CR_DIR=%s", dumpfile);
> + env[1] = strdup(buf);
> + snprintf(buf, sizeof(buf), "CT_STATE=%s", statefile);
Bad choice for a name. We have VE_STATE for other scripts, which can be
"running", "starting" etc.
> + env[2] = strdup(buf);
> + env[3] = NULL;
> + if (run_script(argv[0], argv, env, 0))
> + return VZ_RESTORE_ERROR;
> +
> + return 0;
> +}
> +
> +static int ct_restore(vps_handler *h, envid_t veid, vps_param *vps_p, int cmd,
> + cpt_param *param, skipFlags skip)
> +{
> + return vps_start_custom(h, veid, vps_p, SKIP_CONFIGURE | skip, NULL, ct_env_restore, param);
> +}
> +
> int ct_do_open(vps_handler *h)
> {
> int ret;
> @@ -630,6 +717,8 @@ int ct_do_open(vps_handler *h)
> h->enter = ct_enter;
> h->destroy = ct_destroy;
> h->env_create = ct_env_create;
> + h->env_chkpnt = ct_chkpnt;
> + h->env_restore = ct_restore;
> h->setlimits = ct_setlimits;
> h->setcpus = ct_setcpus;
> h->setcontext = ct_setcontext;
More information about the CRIU
mailing list