From 754076f5552c2a1c84f39f462e0ed89b05a43ee3 Mon Sep 17 00:00:00 2001 From: Bernd Helm Date: Thu, 23 Nov 2017 14:49:42 +0100 Subject: [PATCH] added allowrunning command line option for snapshotting alive containers Signed-off-by: Bernd Helm --- doc/lxc-copy.sgml.in | 11 +++++++++++ src/lxc/lxccontainer.c | 5 ++--- src/lxc/lxccontainer.h | 1 + src/lxc/tools/arguments.h | 1 + src/lxc/tools/lxc_copy.c | 8 +++++++- 5 files changed, 22 insertions(+), 4 deletions(-) diff --git a/doc/lxc-copy.sgml.in b/doc/lxc-copy.sgml.in index 17b9b61f8..a979500c3 100644 --- a/doc/lxc-copy.sgml.in +++ b/doc/lxc-copy.sgml.in @@ -55,6 +55,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -p, --newpath newpath -B, --backingstorage backingstorage -s, --snapshot + -a, --allowrunning -K, --keepname -D, --keepdata -M, --keepmac @@ -70,6 +71,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -e, --ephemeral -B, --backingstorage backingstorage -s, --snapshot + -a, --allowrunning -K, --keepname -D, --keepdata -M, --keepmac @@ -208,6 +210,15 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + + + Allow the creation of a Snapshot of an already running container. + This may cause data corruption or data loss depending on the used + filesystem and applications. Use with care. + + + diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c index 9941d646a..63a667098 100644 --- a/src/lxc/lxccontainer.c +++ b/src/lxc/lxccontainer.c @@ -3799,9 +3799,8 @@ static struct lxc_container *do_lxcapi_clone(struct lxc_container *c, const char if (container_mem_lock(c)) return NULL; - - if (!is_stopped(c)) { - ERROR("error: Original container (%s) is running", c->name); + if (!is_stopped(c) && !(flags & LXC_CLONE_ALLOW_RUNNING)) { + ERROR("error: Original container (%s) is running. Use --allowrunning if you want to force a snapshot of the running container.", c->name); goto out; } diff --git a/src/lxc/lxccontainer.h b/src/lxc/lxccontainer.h index cb0cf8d2d..23c300cc8 100644 --- a/src/lxc/lxccontainer.h +++ b/src/lxc/lxccontainer.h @@ -41,6 +41,7 @@ extern "C" { #define LXC_CLONE_KEEPBDEVTYPE (1 << 3) /*!< Use the same bdev type */ #define LXC_CLONE_MAYBE_SNAPSHOT (1 << 4) /*!< Snapshot only if bdev supports it, else copy */ #define LXC_CLONE_MAXFLAGS (1 << 5) /*!< Number of \c LXC_CLONE_* flags */ +#define LXC_CLONE_ALLOW_RUNNING (1 << 6) /*!< allow snapshot creation even if source container is running */ #define LXC_CREATE_QUIET (1 << 0) /*!< Redirect \c stdin to \c /dev/zero and \c stdout and \c stderr to \c /dev/null */ #define LXC_CREATE_MAXFLAGS (1 << 1) /*!< Number of \c LXC_CREATE* flags */ #define LXC_MOUNT_API_V1 1 diff --git a/src/lxc/tools/arguments.h b/src/lxc/tools/arguments.h index 810050ad2..9e8a27916 100644 --- a/src/lxc/tools/arguments.h +++ b/src/lxc/tools/arguments.h @@ -122,6 +122,7 @@ struct lxc_arguments { int keepdata; int keepname; int keepmac; + int allowrunning; /* lxc-ls */ char *ls_fancy_format; diff --git a/src/lxc/tools/lxc_copy.c b/src/lxc/tools/lxc_copy.c index 3492be99f..5a94de452 100644 --- a/src/lxc/tools/lxc_copy.c +++ b/src/lxc/tools/lxc_copy.c @@ -73,6 +73,7 @@ static const struct option my_longopts[] = { { "newpath", required_argument, 0, 'p'}, { "rename", no_argument, 0, 'R'}, { "snapshot", no_argument, 0, 's'}, + { "allowrunning", no_argument, 0, 'a'}, { "foreground", no_argument, 0, 'F'}, { "daemon", no_argument, 0, 'd'}, { "ephemeral", no_argument, 0, 'e'}, @@ -108,6 +109,7 @@ Options :\n\ -p, --newpath=NEWPATH NEWPATH for the container to be stored\n\ -R, --rename rename container\n\ -s, --snapshot create snapshot instead of clone\n\ + -a, --allowrunning allow snapshot creation even if source container is running\n\ -F, --foreground start with current tty attached to /dev/console\n\ -d, --daemon daemonize the container (default)\n\ -e, --ephemeral start ephemeral container\n\ @@ -195,7 +197,8 @@ int main(int argc, char *argv[]) if (my_args.task == SNAP || my_args.task == DESTROY) flags |= LXC_CLONE_SNAPSHOT; - + if (my_args.allowrunning) + flags |= LXC_CLONE_ALLOW_RUNNING; if (my_args.keepname) flags |= LXC_CLONE_KEEPNAME; @@ -557,6 +560,9 @@ static int my_parser(struct lxc_arguments *args, int c, char *arg) case 's': args->task = SNAP; break; + case 'a': + args->allowrunning = 1; + break; case 'F': args->daemonize = 0; break; -- 2.39.2