[lxc-devel] [lxc/master] Added allowrunning command line option for snapshotting running containers

bhelm on Github lxc-bot at linuxcontainers.org
Thu Nov 23 14:17:57 UTC 2017


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 1118 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20171123/de3ac23b/attachment.bin>
-------------- next part --------------
From bc9eda0702b5a30c588c381eb6c22eba8e8d6cd7 Mon Sep 17 00:00:00 2001
From: Bernd Helm <bernd.helm at helmundwalter.de>
Date: Thu, 23 Nov 2017 14:49:42 +0100
Subject: [PATCH] added allowrunning command line option for snapshotting alive
 containers

---
 doc/lxc-copy.sgml.in     | 11 +++++++++++
 src/lxc/arguments.h      |  1 +
 src/lxc/lxccontainer.c   |  5 ++---
 src/lxc/lxccontainer.h   |  1 +
 src/lxc/tools/lxc_copy.c |  7 +++++++
 5 files changed, 22 insertions(+), 3 deletions(-)

diff --git a/doc/lxc-copy.sgml.in b/doc/lxc-copy.sgml.in
index 475feb05b..6e63e98c6 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
       <arg choice="opt">-p, --newpath <replaceable>newpath</replaceable></arg>
       <arg choice="opt">-B, --backingstorage <replaceable>backingstorage</replaceable></arg>
       <arg choice="opt">-s, --snapshot</arg>
+      <arg choice="opt">-a, --allowrunning</arg>
       <arg choice="opt">-K, --keepname</arg>
       <arg choice="opt">-D, --keepdata</arg>
       <arg choice="opt">-M, --keepmac</arg>
@@ -70,6 +71,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
       <arg choice="req">-e, --ephemeral</arg>
       <arg choice="opt">-B, --backingstorage <replaceable>backingstorage</replaceable></arg>
       <arg choice="opt">-s, --snapshot</arg>
+      <arg choice="opt">-a, --allowrunning</arg>
       <arg choice="opt">-K, --keepname</arg>
       <arg choice="opt">-D, --keepdata</arg>
       <arg choice="opt">-M, --keepmac</arg>
@@ -208,6 +210,15 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 	   </listitem>
 	  </varlistentry>
 
+	  <varlistentry>
+	    <term> <option>-a,--allowrunning </option> </term>
+	   <listitem>
+	    <para> 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. </para>
+	   </listitem>
+	  </varlistentry>
+
 	  <varlistentry>
 	    <term> <option>-F,--foreground</option> </term>
 	   <listitem>
diff --git a/src/lxc/arguments.h b/src/lxc/arguments.h
index b07caf42b..33d19d917 100644
--- a/src/lxc/arguments.h
+++ b/src/lxc/arguments.h
@@ -119,6 +119,7 @@ struct lxc_arguments {
 	int keepdata;
 	int keepname;
 	int keepmac;
+	int allowrunning;
 
 	/* lxc-ls */
 	char *ls_fancy_format;
diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c
index 413dd375b..c7cdd3192 100644
--- a/src/lxc/lxccontainer.c
+++ b/src/lxc/lxccontainer.c
@@ -3451,9 +3451,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 9ea67df7f..1f5a46e98 100644
--- a/src/lxc/lxccontainer.h
+++ b/src/lxc/lxccontainer.h
@@ -40,6 +40,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 */
 
diff --git a/src/lxc/tools/lxc_copy.c b/src/lxc/tools/lxc_copy.c
index 7eddb77d6..9fa80df91 100644
--- a/src/lxc/tools/lxc_copy.c
+++ b/src/lxc/tools/lxc_copy.c
@@ -78,6 +78,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'},
@@ -114,6 +115,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\
@@ -209,6 +211,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;
 	if (my_args.keepmac)
@@ -615,6 +619,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;


More information about the lxc-devel mailing list