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

Reply via email to