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.
v2: add the GPL header and descriptions in scripts describe and check variables in scripts Signed-off-by: Andrey Vagin <ava...@openvz.org> --- scripts/Makefile.am | 4 +- scripts/vps-cpt.in | 54 ++++++++++++++++++++++++++ scripts/vps-rst.in | 51 ++++++++++++++++++++++++ src/lib/hooks_ct.c | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++- vzctl.spec | 2 + 5 files changed, 218 insertions(+), 2 deletions(-) create mode 100755 scripts/vps-cpt.in create mode 100755 scripts/vps-rst.in diff --git a/scripts/Makefile.am b/scripts/Makefile.am index 0221973..05381f8 100644 --- a/scripts/Makefile.am +++ b/scripts/Makefile.am @@ -27,7 +27,9 @@ script_SCRIPTS = \ vps-net_del \ vzevent-stop \ vzevent-reboot \ - vps-pci + vps-pci \ + vps-cpt \ + vps-rst EXTRA_DIST = \ $(script_SCRIPTS:%=%.in) diff --git a/scripts/vps-cpt.in b/scripts/vps-cpt.in new file mode 100755 index 0000000..fe65ee8 --- /dev/null +++ b/scripts/vps-cpt.in @@ -0,0 +1,54 @@ +#!/bin/sh +# Copyright (C) 2012, Parallels, Inc. All rights reserved. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Checkpoint a container using the criu. +# Useful for running in non-OpenVZ kernels. +# +# Parameters are passed in environment variables. +# Required parameters: +# VE_ROOT - container root directory +# VE_DUMP_DIR - directory for saving dump files +# VE_PID - PID of the init process +# + +exec 1>&2 +. @SCRIPTDIR@/vps-functions + +vzcheckvar VE_ROOT +vzcheckvar VE_PID +vzcheckvar VE_DUMP_DIR + +mkdir $CT_CR_DIR && +criu dump --file-locks \ + --tcp-established \ + --evasive-devices \ + --link-remap \ + --root $VE_ROOT \ + -t $VE_PID \ + -D $VE_DUMP_DIR \ + -o dump.log \ + -vvvv +if [ $? -ne 0 ]; then + [ -d $VE_DUMP_DIR.fail ] && rm -rf $VE_DUMP_DIR.fail + mv -f $VE_DUMP_DIR $VE_DUMP_DIR.fail + echo Failed to checkpoint the Container + echo All dump files and logs were saved in $VE_DUMP_DIR.fail + exit 1 +else + echo Checkpointing finished successfully +fi diff --git a/scripts/vps-rst.in b/scripts/vps-rst.in new file mode 100755 index 0000000..6fe9502 --- /dev/null +++ b/scripts/vps-rst.in @@ -0,0 +1,51 @@ +#!/bin/sh +# Copyright (C) 2012, Parallels, Inc. All rights reserved. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# Resume a container using the criu. +# Useful for running in non-OpenVZ kernels. +# +# Parameters are passed in environment variables. +# Required parameters: +# VE_ROOT - container root directory +# VE_DUMP_DIR - directory for saving dump files +# VE_STATE_FILE - file, where PID of the init process will be saved +# + +exec 1>&2 +. @SCRIPTDIR@/vps-functions + +vzcheckvar VE_ROOT +vzcheckvar VE_STATE_FILE +vzcheckvar VE_DUMP_DIR + +criu restore --file-locks \ + --tcp-established \ + --evasive-devices \ + --link-remap \ + --root $VE_ROOT \ + --restore-detached \ + -D $VE_DUMP_DIR \ + -o restore.log \ + -vvvv \ + --pidfile $VE_STATE_FILE +if [ $? -eq 0 ]; then + rm -rf $VE_DUMP_DIR +else + echo The restore log was saved in $VE_DUMP_DIR/restore.log + exit 1 +fi diff --git a/src/lib/hooks_ct.c b/src/lib/hooks_ct.c index 8c98289..c1f8cd9 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,11 @@ 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->fs, + arg->wait_p, arg->old_wait_p, arg->err_p, arg->data); + else + ret = ct_env_create_real(arg); if (ret < 0) return VZ_RESOURCE_ERROR; @@ -599,6 +604,106 @@ static int ct_setcontext(envid_t veid) return 0; } +static int ct_chkpnt(vps_handler *h, envid_t veid, + const fs_param *fs, int cmd, cpt_param *param) +{ + const char *dumpfile = NULL; + char statefile[STR_SIZE], buf[STR_SIZE]; + char *arg[2], *env[4]; + FILE *sfile; + pid_t pid; + int ret; + + ret = VZ_CHKPNT_ERROR; + + get_dump_file(veid, param->dumpdir, buf, sizeof(buf)); + dumpfile = strdup(buf); + + arg[0] = SCRIPTDIR "/vps-cpt"; + arg[1] = NULL; + + get_state_file(veid, statefile, sizeof(statefile)); + sfile = fopen(statefile, "r"); + if (sfile == NULL) { + logger(-1, errno, "Unable to open %s", statefile); + return VZ_CHKPNT_ERROR; + } + + ret = fscanf(sfile, "%d", &pid); + if (ret != 1) { + logger(-1, errno, "Unable to read PID from %s", statefile); + fclose(sfile); + return VZ_CHKPNT_ERROR; + } + fclose(sfile); + + snprintf(buf, sizeof(buf), "VE_ROOT=%s", fs->root); + env[0] = strdup(buf); + snprintf(buf, sizeof(buf), "VE_PID=%d", pid); + env[1] = strdup(buf); + snprintf(buf, sizeof(buf), "VE_DUMP_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, const fs_param *fs, + int wait_p, int old_wait_p, int err_p, void *data) +{ + char *argv[2], *env[4]; + const char *dumpfile = NULL; + const char *statefile = NULL; + cpt_param *param = data; + char buf[STR_SIZE]; + pid_t pid = -1; + FILE *sfile; + + get_dump_file(veid, param->dumpdir, buf, sizeof(buf)); + dumpfile = strdup(buf); + + get_state_file(veid, buf, sizeof(buf)); + statefile = strdup(buf); + + argv[0] = SCRIPTDIR "/vps-rst"; + argv[1] = NULL; + + snprintf(buf, sizeof(buf), "VE_ROOT=%s", fs->root); + env[0] = strdup(buf); + snprintf(buf, sizeof(buf), "VE_DUMP_DIR=%s", dumpfile); + env[1] = strdup(buf); + snprintf(buf, sizeof(buf), "VE_STATE_FILE=%s", statefile); + env[2] = strdup(buf); + env[3] = NULL; + if (run_script(argv[0], argv, env, 0)) + return -1; + + sfile = fopen(statefile, "r"); + if (sfile == NULL) { + logger(-1, errno, "Unable to open %s", statefile); + goto err_destroy; + } + + if (fscanf(sfile, "%d", &pid) != 1) + logger(-1, errno, "Unable to read PID from %s", statefile); + + fclose(sfile); +err_destroy: + if (pid < 0) + destroy_container(veid); + + return pid; +} + +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; @@ -632,6 +737,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; diff --git a/vzctl.spec b/vzctl.spec index f77d326..9fe947b 100644 --- a/vzctl.spec +++ b/vzctl.spec @@ -221,6 +221,8 @@ OpenVZ containers control utility core package %{_scriptdir}/vzevent-stop %{_scriptdir}/vzevent-reboot %{_scriptdir}/vps-pci +%{_scriptdir}/vps-cpt +%{_scriptdir}/vps-rst /etc/vz/conf %config(noreplace) %{_configdir}/vz.conf %config(noreplace) %{_configdir}/osrelease.conf -- 1.8.2 _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel