Re: [lxc-devel] [PATCH v3] Add lxc-copy executable
On Mon, Nov 09, 2015 at 07:55:31PM +, Serge Hallyn wrote: > Quoting Christian Brauner (christianvanbrau...@gmail.com): > > This is a complete reimplementation of lxc-clone and lxc-start-ephemeral. > > lxc-copy merges the functionalities of lxc-clone + lxc-start-ephemeral. > > > > (1) Cloning containers: > > > > (a) as copy: > > > > lxc-copy -n aa -N bb > > > > (b) as snapshot: > > > > lxc-copy -n aa -N bb -s > > > > (2) Renaming containers: > > > > lxc-copy -n aa -N bb -R > > > > (3) Starting ephemeral containers: > > > > Ephemeral containers are created and started by passing the flag -e / > > --ephemeral. Whenever this flag is missing a copy of the container is > > created. > > The flag -e / --ephemeral implies -s / --snapshot. > > > > (a) start ephemeral container daemonized with random name: > > > > lxc-copy -n aa -e > > > > (b) start ephemeral container in foreground mode with random name: > > > > lxc-copy -n aa -e -F > > > > (c) start ephemeral container with specified name in daemonized mode: > > Analogous to lxc-start ephemeral containers start in daemonized > > mode per default: > > > > lxc-copy -n aa -N bb -e > > > > One can however also explicitly pass -d / --daemon: > > > > lxc-copy -n aa -N bb -e -d > > > > but both commands are equivalent. > > > > (d) start non-ephemeral container in daemonized mode: > > > > lxc-copy -n aa -D -e > > > > (e) start ephemeral container in daemonized mode and keep the original > > hostname: > > > > lxc-copy -n aa -K -e > > > > (f) start ephemeral container in daemonized mode and keep the > > MAC-address of the original container: > > > > lxc-copy -n aa -M -e > > > > (g) start ephemeral container with custom mounts (additional mounts can > > be of type {bind,aufs,overlay}) in daemonized mode: > > > > lxc-copy -n aa -e -m > > bind=/src:/dest:ro,aufs=/src:/dest,overlay=/src:/dest > > > > (4) Other options: > > > > lxc-copy --help > > > > In order to create a random containername and random upper- and workdirs for > > custom mounts we use mkdtemp() to not just create the names but also > > directly > > create the corresponding directories. This will be safer and make the code > > considerably shorter. > > > > Signed-off-by: Christian Brauner> > --- > > src/lxc/Makefile.am | 2 + > > src/lxc/arguments.h | 2 + > > src/lxc/lxc_copy.c | 744 > > > > 3 files changed, 748 insertions(+) > > create mode 100644 src/lxc/lxc_copy.c > > > > diff --git a/src/lxc/Makefile.am b/src/lxc/Makefile.am > > index ce46495..72f1e9b 100644 > > --- a/src/lxc/Makefile.am > > +++ b/src/lxc/Makefile.am > > @@ -183,6 +183,7 @@ bin_PROGRAMS = \ > > lxc-cgroup \ > > lxc-checkpoint \ > > lxc-clone \ > > + lxc-copy \ > > lxc-config \ > > lxc-console \ > > lxc-create \ > > @@ -226,6 +227,7 @@ init_lxc_SOURCES = lxc_init.c > > lxc_monitor_SOURCES = lxc_monitor.c > > lxc_monitord_SOURCES = lxc_monitord.c > > lxc_clone_SOURCES = lxc_clone.c > > +lxc_copy_SOURCES = lxc_copy.c > > lxc_start_SOURCES = lxc_start.c > > lxc_stop_SOURCES = lxc_stop.c > > lxc_top_SOURCES = lxc_top.c > > diff --git a/src/lxc/arguments.h b/src/lxc/arguments.h > > index bf03dc5..c261935 100644 > > --- a/src/lxc/arguments.h > > +++ b/src/lxc/arguments.h > > @@ -100,6 +100,7 @@ struct lxc_arguments { > > > > /* lxc-snapshot and lxc-clone */ > > enum task { > > + CLONE, > > DESTROY, > > LIST, > > RESTORE, > > @@ -111,6 +112,7 @@ struct lxc_arguments { > > char *newname; > > char *newpath; > > char *snapname; > > + int keepdata; > > int keepname; > > int keepmac; > > > > diff --git a/src/lxc/lxc_copy.c b/src/lxc/lxc_copy.c > > new file mode 100644 > > index 000..ac1b051 > > --- /dev/null > > +++ b/src/lxc/lxc_copy.c > > @@ -0,0 +1,744 @@ > > +/* > > + * > > + * Copyright © 2015 Christian Brauner . > > + * > > + * This program is free software; you can redistribute it and/or modify > > + * it under the terms of the GNU General Public License version 2, as > > + * published by the Free Software Foundation. > > + * > > + * 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., > > + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. > > + */ > > + > > +#define
Re: [lxc-devel] [PATCH v3] Add lxc-copy executable
Quoting Christian Brauner (christianvanbrau...@gmail.com): > This is a complete reimplementation of lxc-clone and lxc-start-ephemeral. > lxc-copy merges the functionalities of lxc-clone + lxc-start-ephemeral. > > (1) Cloning containers: > > (a) as copy: > > lxc-copy -n aa -N bb > > (b) as snapshot: > > lxc-copy -n aa -N bb -s > > (2) Renaming containers: > > lxc-copy -n aa -N bb -R > > (3) Starting ephemeral containers: > > Ephemeral containers are created and started by passing the flag -e / > --ephemeral. Whenever this flag is missing a copy of the container is created. > The flag -e / --ephemeral implies -s / --snapshot. > > (a) start ephemeral container daemonized with random name: > > lxc-copy -n aa -e > > (b) start ephemeral container in foreground mode with random name: > > lxc-copy -n aa -e -F > > (c) start ephemeral container with specified name in daemonized mode: > Analogous to lxc-start ephemeral containers start in daemonized > mode per default: > > lxc-copy -n aa -N bb -e > > One can however also explicitly pass -d / --daemon: > > lxc-copy -n aa -N bb -e -d > > but both commands are equivalent. > > (d) start non-ephemeral container in daemonized mode: > > lxc-copy -n aa -D -e > > (e) start ephemeral container in daemonized mode and keep the original > hostname: > > lxc-copy -n aa -K -e > > (f) start ephemeral container in daemonized mode and keep the > MAC-address of the original container: > > lxc-copy -n aa -M -e > > (g) start ephemeral container with custom mounts (additional mounts can > be of type {bind,aufs,overlay}) in daemonized mode: > > lxc-copy -n aa -e -m > bind=/src:/dest:ro,aufs=/src:/dest,overlay=/src:/dest > > (4) Other options: > > lxc-copy --help > > In order to create a random containername and random upper- and workdirs for > custom mounts we use mkdtemp() to not just create the names but also directly > create the corresponding directories. This will be safer and make the code > considerably shorter. > > Signed-off-by: Christian Brauner> --- > src/lxc/Makefile.am | 2 + > src/lxc/arguments.h | 2 + > src/lxc/lxc_copy.c | 744 > > 3 files changed, 748 insertions(+) > create mode 100644 src/lxc/lxc_copy.c > > diff --git a/src/lxc/Makefile.am b/src/lxc/Makefile.am > index ce46495..72f1e9b 100644 > --- a/src/lxc/Makefile.am > +++ b/src/lxc/Makefile.am > @@ -183,6 +183,7 @@ bin_PROGRAMS = \ > lxc-cgroup \ > lxc-checkpoint \ > lxc-clone \ > + lxc-copy \ > lxc-config \ > lxc-console \ > lxc-create \ > @@ -226,6 +227,7 @@ init_lxc_SOURCES = lxc_init.c > lxc_monitor_SOURCES = lxc_monitor.c > lxc_monitord_SOURCES = lxc_monitord.c > lxc_clone_SOURCES = lxc_clone.c > +lxc_copy_SOURCES = lxc_copy.c > lxc_start_SOURCES = lxc_start.c > lxc_stop_SOURCES = lxc_stop.c > lxc_top_SOURCES = lxc_top.c > diff --git a/src/lxc/arguments.h b/src/lxc/arguments.h > index bf03dc5..c261935 100644 > --- a/src/lxc/arguments.h > +++ b/src/lxc/arguments.h > @@ -100,6 +100,7 @@ struct lxc_arguments { > > /* lxc-snapshot and lxc-clone */ > enum task { > + CLONE, > DESTROY, > LIST, > RESTORE, > @@ -111,6 +112,7 @@ struct lxc_arguments { > char *newname; > char *newpath; > char *snapname; > + int keepdata; > int keepname; > int keepmac; > > diff --git a/src/lxc/lxc_copy.c b/src/lxc/lxc_copy.c > new file mode 100644 > index 000..ac1b051 > --- /dev/null > +++ b/src/lxc/lxc_copy.c > @@ -0,0 +1,744 @@ > +/* > + * > + * Copyright © 2015 Christian Brauner . > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License version 2, as > + * published by the Free Software Foundation. > + * > + * 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., > + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. > + */ > + > +#define _GNU_SOURCE > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include > + > +#include "attach.h" > +#include "log.h" > +#include
[lxc-devel] [PATCH v3] Add lxc-copy executable
This is a complete reimplementation of lxc-clone and lxc-start-ephemeral. lxc-copy merges the functionalities of lxc-clone + lxc-start-ephemeral. (1) Cloning containers: (a) as copy: lxc-copy -n aa -N bb (b) as snapshot: lxc-copy -n aa -N bb -s (2) Renaming containers: lxc-copy -n aa -N bb -R (3) Starting ephemeral containers: Ephemeral containers are created and started by passing the flag -e / --ephemeral. Whenever this flag is missing a copy of the container is created. The flag -e / --ephemeral implies -s / --snapshot. (a) start ephemeral container daemonized with random name: lxc-copy -n aa -e (b) start ephemeral container in foreground mode with random name: lxc-copy -n aa -e -F (c) start ephemeral container with specified name in daemonized mode: Analogous to lxc-start ephemeral containers start in daemonized mode per default: lxc-copy -n aa -N bb -e One can however also explicitly pass -d / --daemon: lxc-copy -n aa -N bb -e -d but both commands are equivalent. (d) start non-ephemeral container in daemonized mode: lxc-copy -n aa -D -e (e) start ephemeral container in daemonized mode and keep the original hostname: lxc-copy -n aa -K -e (f) start ephemeral container in daemonized mode and keep the MAC-address of the original container: lxc-copy -n aa -M -e (g) start ephemeral container with custom mounts (additional mounts can be of type {bind,aufs,overlay}) in daemonized mode: lxc-copy -n aa -e -m bind=/src:/dest:ro,aufs=/src:/dest,overlay=/src:/dest (4) Other options: lxc-copy --help In order to create a random containername and random upper- and workdirs for custom mounts we use mkdtemp() to not just create the names but also directly create the corresponding directories. This will be safer and make the code considerably shorter. Signed-off-by: Christian Brauner--- src/lxc/Makefile.am | 2 + src/lxc/arguments.h | 2 + src/lxc/lxc_copy.c | 744 3 files changed, 748 insertions(+) create mode 100644 src/lxc/lxc_copy.c diff --git a/src/lxc/Makefile.am b/src/lxc/Makefile.am index ce46495..72f1e9b 100644 --- a/src/lxc/Makefile.am +++ b/src/lxc/Makefile.am @@ -183,6 +183,7 @@ bin_PROGRAMS = \ lxc-cgroup \ lxc-checkpoint \ lxc-clone \ + lxc-copy \ lxc-config \ lxc-console \ lxc-create \ @@ -226,6 +227,7 @@ init_lxc_SOURCES = lxc_init.c lxc_monitor_SOURCES = lxc_monitor.c lxc_monitord_SOURCES = lxc_monitord.c lxc_clone_SOURCES = lxc_clone.c +lxc_copy_SOURCES = lxc_copy.c lxc_start_SOURCES = lxc_start.c lxc_stop_SOURCES = lxc_stop.c lxc_top_SOURCES = lxc_top.c diff --git a/src/lxc/arguments.h b/src/lxc/arguments.h index bf03dc5..c261935 100644 --- a/src/lxc/arguments.h +++ b/src/lxc/arguments.h @@ -100,6 +100,7 @@ struct lxc_arguments { /* lxc-snapshot and lxc-clone */ enum task { + CLONE, DESTROY, LIST, RESTORE, @@ -111,6 +112,7 @@ struct lxc_arguments { char *newname; char *newpath; char *snapname; + int keepdata; int keepname; int keepmac; diff --git a/src/lxc/lxc_copy.c b/src/lxc/lxc_copy.c new file mode 100644 index 000..ac1b051 --- /dev/null +++ b/src/lxc/lxc_copy.c @@ -0,0 +1,744 @@ +/* + * + * Copyright © 2015 Christian Brauner . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, as + * published by the Free Software Foundation. + * + * 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., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "attach.h" +#include "log.h" +#include "confile.h" +#include "arguments.h" +#include "lxc.h" +#include "conf.h" +#include "state.h" +#include "utils.h" +#include "bdev.h" + +lxc_log_define(lxc_copy_ui, lxc); + +enum mnttype { + LXC_MNT_BIND, + LXC_MNT_AUFS, + LXC_MNT_OVL, +}; + +struct mnts { + enum mnttype type; +
[lxc-devel] [PATCH v3] Add lxc-copy executable
Changes v3 (only changes in the commit message): (1) Make it explicit that the flag -e / --ephemeral starts ephemeral containers. (2) Fix missing -e flag in examples (c) and (d). (3) Fix example (d). The flag to create a non-ephemeral container is -D and not -K. (4) Add some more exampled to illustrate -D, -K, and -M flags. Changes v2: (1) The mkdtemp() call accidently created a directory in the current working directory of the shell it was called in. This is now fixed by correctly creating the full path first and then using the offset strlen(my_args->newpath) + 1 to point my_args->newname to the name of the container: ret = snprintf(randname, MAXPATHLEN, "%s/%s_XX", my_args->newpath, my_args->name); if (ret < 0 || ret >= MAXPATHLEN) return -1; if (!mkdtemp(randname)) return -1; my_args->newname = randname + strlen(my_args->newpath) + 1; Changes in comparison to first implementation: (1) Instead of using a custom function to generate random names for ephemeral container we use mkdtemp(). This will be safer and the code considerably easier. (2) Make the whole code easily extendable by using a design centered around a struct and an enum. The current design will allow us to add further mount types should we want to: enum mnttype { LXC_MNT_BIND, LXC_MNT_AUFS, LXC_MNT_OVL, }; struct mnts { enum mnttype type; char *src; char *dest; char *options; char *upper; char *workdir; char *lower; }; (E.g. lowerdir is currently not used but we could in the future allow users to specify multiple lowerdirs on the command line. All we would have to do is to extend the corresponding parse function parse_ovl_mnt().) (3) We use getsubopt() to parse the custom mounts user can specify with the -m flag and the keys {aufs,bind,overlay}. This will avoid redundancy because users do not have to specify multiple -m flags but can rather just do -m bind=/a:/b,overlay/c:/d etc. Furthermore, it will allow us to add further keys rather easily. (4) There is a branch lxccopy on github for easier testing: https://github.com/brauner/lxc/tree/lxccopy Serge, I wonder how many bugs you will find. :) Christian Brauner (1): Add lxc-copy executable src/lxc/Makefile.am | 2 + src/lxc/arguments.h | 2 + src/lxc/lxc_copy.c | 744 3 files changed, 748 insertions(+) create mode 100644 src/lxc/lxc_copy.c -- 2.6.2 ___ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel