]> git.proxmox.com Git - mirror_lxc.git/commitdiff
added allowrunning command line option for snapshotting alive containers
authorBernd Helm <bernd.helm@helmundwalter.de>
Thu, 23 Nov 2017 13:49:42 +0000 (14:49 +0100)
committerBernd Helm <bernd.helm@helmundwalter.de>
Mon, 22 Oct 2018 07:07:46 +0000 (09:07 +0200)
Signed-off-by: Bernd Helm <bernd.helm@helmundwalter.de>
doc/lxc-copy.sgml.in
src/lxc/lxccontainer.c
src/lxc/lxccontainer.h
src/lxc/tools/arguments.h
src/lxc/tools/lxc_copy.c

index 17b9b61f8de7bf7d0679b34f50d6cde71b632152..a979500c3f46046659d0342fc8d43b01af846b96 100644 (file)
@@ -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>
index 9941d646aa226db8578dc186765ff34f22bf0496..63a66709898897f18910956a613301480e9a73ca 100644 (file)
@@ -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;
        }
 
index cb0cf8d2d4f246308ed21923bf507d8dedeb2be5..23c300cc833c8c26187f29a9be10c8786df87920 100644 (file)
@@ -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
index 810050ad2a33f06b39cad92274729294eb68a826..9e8a2791615cbb60160d546d24e0ed9a5d71634d 100644 (file)
@@ -122,6 +122,7 @@ struct lxc_arguments {
        int keepdata;
        int keepname;
        int keepmac;
+       int allowrunning;
 
        /* lxc-ls */
        char *ls_fancy_format;
index 3492be99fe3c3ad4ffb624aa6420b3becf9f2fcf..5a94de452ea230975096ee58b5cecccf08289b2a 100644 (file)
@@ -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;