Re: [Lxc-users] [PATCH] multiple mods to lxc-clone

2011-08-30 Thread Ramez Hanna
On Tue, Aug 30, 2011 at 1:08 AM, Serge Hallyn
serge.hal...@canonical.com wrote:
 Thanks, Ramez.  It looks good to me.  My only comment would be that
 if the rootfs copy fails (either rsync or lvm clone), and you've
 frozen the original container, then you need to unfreeze the original
 container before erroring out.

 -serge
good catch
thanks
resending in a bit

 Quoting Ramez Hanna (rha...@informatiq.org):
 * allow cloning of non-snapshot lvm devices
    * if no -s then create a copy of the lvm block device and copy data
 from the orig to the new container device
    * first take a snapshot, then use this snapshot to copy data,
 remove  snapshot after done
  * if orig container is running freeze it while copying
    * in case lvm block device, the container is only frozen during
 creation of snapshot ~1 sec
  * use rsync -ax insted of cp -a
    * in case copying a live contrainer it won't copy runtine mounted
 files such as /proc, /sys and some /dev
  * new opts
    * fstype: type of fs for the newly created lvm device in case of
 non-snapshot lvm
    * lvprefix: prefix for new lvm device name.
  * do not delete the lines lxc.mount by default
    * check is fstab exists then copy it
    * only modify lines that contain lxc.mount =, debian template
 seems to not have that line but uses lxc.mount. lines which get
 screwed


 Signed-off-by: InformatiQ rha...@informatiq.org
 ---
  src/lxc/lxc-clone.in |   98 
 ++
  1 files changed, 75 insertions(+), 23 deletions(-)
  mode change 100644 = 100755 src/lxc/lxc-clone.in

 diff --git a/src/lxc/lxc-clone.in b/src/lxc/lxc-clone.in
 old mode 100644
 new mode 100755
 index 91944a0..d42160b
 --- a/src/lxc/lxc-clone.in
 +++ b/src/lxc/lxc-clone.in
 @@ -1,4 +1,4 @@
 -#!/bin/bash
 +#!/bin/bash

  #
  # lxc: linux Container library
 @@ -22,7 +22,7 @@
  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

  usage() {
 -    echo usage: lxc-clone -o orig -n new [-s] [-h] [-L fssize]
 [-v vgname]
 +    echo usage: lxc-clone -o orig -n new [-s] [-h] [-L fssize]
 [-v vgname] [-p lxc_lv_prefix] [-t fstype]
  }

  help() {
 @@ -36,15 +36,19 @@ help() {
      echo -s          : make the new rootfs a snapshot of the original
      echo fssize      : size if creating a new fs.  By default, 2G
      echo vgname      : lvm volume group name, lxc by default
 +    echo lvprefix   : lvm volume name prefix, none by default, e.g.
 --lvprefix=lxc_ then new lxc lv name will be lxc_newname
 +    echo fstype     : new container file system type, ext3 by
 default (only works for non-snapshot lvm)
  }

 -shortoptions='ho:n:sL:v:'
 -longoptions='help,orig:,name:,snapshot,fssize,vgname'
 +shortoptions='ho:n:sL:v:p:t:'
 +longoptions='help,orig:,name:,snapshot,fssize:,vgname:,lvprefix:,fstype:'
  lxc_path=/var/lib/lxc
  bindir=/usr/bin
  snapshot=no
  lxc_size=2G
  lxc_vg=lxc
 +lxc_lv_prefix=
 +fstype=ext3

  getopt=$(getopt -o $shortoptions --longoptions  $longoptions -- $@)
  if [ $? != 0 ]; then
 @@ -63,6 +67,7 @@ while true; do
           -s|--snapshot)
               shift
               snapshot=yes
 +                snapshot_opt=-s
               ;;
           -o|--orig)
               shift
 @@ -84,6 +89,11 @@ while true; do
               lxc_new=$1
               shift
               ;;
 +            -p|--lvprefix)
 +                shift
 +                lxc_lv_prefix=$1
 +                shift
 +                ;;
              --)
               shift
               break;;
 @@ -141,50 +151,92 @@ trap ${bindir}/lxc-destroy -n $lxc_new; echo
 aborted; exit 1 SIGHUP SIGINT SIG

  mkdir -p $lxc_path/$lxc_new

 +hostname=$lxc_new
 +
  echo Tweaking configuration
  cp $lxc_path/$lxc_orig/config $lxc_path/$lxc_new/config
  sed -i '/lxc.utsname/d' $lxc_path/$lxc_new/config
  echo lxc.utsname = $hostname  $lxc_path/$lxc_new/config

 -sed -i '/lxc.mount/d' $lxc_path/$lxc_new/config
 -echo lxc.mount = $lxc_path/$lxc_new/fstab  $lxc_path/$lxc_new/config
 +grep lxc.mount = $lxc_path/$lxc_new/config /dev/null 21  { sed
 -i '/lxc.mount =/d' $lxc_path/$lxc_new/config; echo lxc.mount =
 $lxc_path/$lxc_new/fstab  $lxc_path/$lxc_new/config; }

 -cp $lxc_path/$lxc_orig/fstab $lxc_path/$lxc_new/fstab
 -sed -i s@$lxc_path/$lxc_orig@$lxc_path/$lxc_new@ $lxc_path/$lxc_new/fstab
 +if [ -e  $lxc_path/$lxc_orig/fstab ];then
 +    cp $lxc_path/$lxc_orig/fstab $lxc_path/$lxc_new/fstab
 +    sed -i s@$lxc_path/$lxc_orig@$lxc_path/$lxc_new@ 
 $lxc_path/$lxc_new/fstab
 +fi

  echo Copying rootfs...
  rootfs=$lxc_path/$lxc_new/rootfs
  # First figure out if the old is a device.  For now we only support
  # lvm devices.
  mounted=0
 +#is container running
 +lxc-info -s -n $lxc_orig|grep RUNNING /dev/null 21
 +if [ $? -ne 0 ]; then
 +    container_running=True
 +fi
  sed -i '/lxc.rootfs/d' $lxc_path/$lxc_new/config
  oldroot=`grep lxc.rootfs $lxc_path/$lxc_orig/config | awk -F= '{ print $2 
 '}`
  if [ -b $oldroot ]; then
       # this is a device.  If 

Re: [Lxc-users] [PATCH] multiple mods to lxc-clone

2011-08-29 Thread Serge Hallyn
Thanks, Ramez.  It looks good to me.  My only comment would be that
if the rootfs copy fails (either rsync or lvm clone), and you've
frozen the original container, then you need to unfreeze the original
container before erroring out.

-serge

Quoting Ramez Hanna (rha...@informatiq.org):
 * allow cloning of non-snapshot lvm devices
* if no -s then create a copy of the lvm block device and copy data
 from the orig to the new container device
* first take a snapshot, then use this snapshot to copy data,
 remove  snapshot after done
  * if orig container is running freeze it while copying
* in case lvm block device, the container is only frozen during
 creation of snapshot ~1 sec
  * use rsync -ax insted of cp -a
* in case copying a live contrainer it won't copy runtine mounted
 files such as /proc, /sys and some /dev
  * new opts
* fstype: type of fs for the newly created lvm device in case of
 non-snapshot lvm
* lvprefix: prefix for new lvm device name.
  * do not delete the lines lxc.mount by default
* check is fstab exists then copy it
* only modify lines that contain lxc.mount =, debian template
 seems to not have that line but uses lxc.mount. lines which get
 screwed
 
 
 Signed-off-by: InformatiQ rha...@informatiq.org
 ---
  src/lxc/lxc-clone.in |   98 
 ++
  1 files changed, 75 insertions(+), 23 deletions(-)
  mode change 100644 = 100755 src/lxc/lxc-clone.in
 
 diff --git a/src/lxc/lxc-clone.in b/src/lxc/lxc-clone.in
 old mode 100644
 new mode 100755
 index 91944a0..d42160b
 --- a/src/lxc/lxc-clone.in
 +++ b/src/lxc/lxc-clone.in
 @@ -1,4 +1,4 @@
 -#!/bin/bash
 +#!/bin/bash
 
  #
  # lxc: linux Container library
 @@ -22,7 +22,7 @@
  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 
  usage() {
 -echo usage: lxc-clone -o orig -n new [-s] [-h] [-L fssize]
 [-v vgname]
 +echo usage: lxc-clone -o orig -n new [-s] [-h] [-L fssize]
 [-v vgname] [-p lxc_lv_prefix] [-t fstype]
  }
 
  help() {
 @@ -36,15 +36,19 @@ help() {
  echo -s  : make the new rootfs a snapshot of the original
  echo fssize  : size if creating a new fs.  By default, 2G
  echo vgname  : lvm volume group name, lxc by default
 +echo lvprefix   : lvm volume name prefix, none by default, e.g.
 --lvprefix=lxc_ then new lxc lv name will be lxc_newname
 +echo fstype : new container file system type, ext3 by
 default (only works for non-snapshot lvm)
  }
 
 -shortoptions='ho:n:sL:v:'
 -longoptions='help,orig:,name:,snapshot,fssize,vgname'
 +shortoptions='ho:n:sL:v:p:t:'
 +longoptions='help,orig:,name:,snapshot,fssize:,vgname:,lvprefix:,fstype:'
  lxc_path=/var/lib/lxc
  bindir=/usr/bin
  snapshot=no
  lxc_size=2G
  lxc_vg=lxc
 +lxc_lv_prefix=
 +fstype=ext3
 
  getopt=$(getopt -o $shortoptions --longoptions  $longoptions -- $@)
  if [ $? != 0 ]; then
 @@ -63,6 +67,7 @@ while true; do
   -s|--snapshot)
   shift
   snapshot=yes
 +snapshot_opt=-s
   ;;
   -o|--orig)
   shift
 @@ -84,6 +89,11 @@ while true; do
   lxc_new=$1
   shift
   ;;
 +-p|--lvprefix)
 +shift
 +lxc_lv_prefix=$1
 +shift
 +;;
  --)
   shift
   break;;
 @@ -141,50 +151,92 @@ trap ${bindir}/lxc-destroy -n $lxc_new; echo
 aborted; exit 1 SIGHUP SIGINT SIG
 
  mkdir -p $lxc_path/$lxc_new
 
 +hostname=$lxc_new
 +
  echo Tweaking configuration
  cp $lxc_path/$lxc_orig/config $lxc_path/$lxc_new/config
  sed -i '/lxc.utsname/d' $lxc_path/$lxc_new/config
  echo lxc.utsname = $hostname  $lxc_path/$lxc_new/config
 
 -sed -i '/lxc.mount/d' $lxc_path/$lxc_new/config
 -echo lxc.mount = $lxc_path/$lxc_new/fstab  $lxc_path/$lxc_new/config
 +grep lxc.mount = $lxc_path/$lxc_new/config /dev/null 21  { sed
 -i '/lxc.mount =/d' $lxc_path/$lxc_new/config; echo lxc.mount =
 $lxc_path/$lxc_new/fstab  $lxc_path/$lxc_new/config; }
 
 -cp $lxc_path/$lxc_orig/fstab $lxc_path/$lxc_new/fstab
 -sed -i s@$lxc_path/$lxc_orig@$lxc_path/$lxc_new@ $lxc_path/$lxc_new/fstab
 +if [ -e  $lxc_path/$lxc_orig/fstab ];then
 +cp $lxc_path/$lxc_orig/fstab $lxc_path/$lxc_new/fstab
 +sed -i s@$lxc_path/$lxc_orig@$lxc_path/$lxc_new@ 
 $lxc_path/$lxc_new/fstab
 +fi
 
  echo Copying rootfs...
  rootfs=$lxc_path/$lxc_new/rootfs
  # First figure out if the old is a device.  For now we only support
  # lvm devices.
  mounted=0
 +#is container running
 +lxc-info -s -n $lxc_orig|grep RUNNING /dev/null 21
 +if [ $? -ne 0 ]; then
 +container_running=True
 +fi
  sed -i '/lxc.rootfs/d' $lxc_path/$lxc_new/config
  oldroot=`grep lxc.rootfs $lxc_path/$lxc_orig/config | awk -F= '{ print $2 '}`
  if [ -b $oldroot ]; then
   # this is a device.  If we don't want to snapshot, then mkfs, mount
   # and rsync.  Trivial but not yet implemented
 - if [ 

[Lxc-users] [PATCH] multiple mods to lxc-clone

2011-08-26 Thread Ramez Hanna
* allow cloning of non-snapshot lvm devices
   * if no -s then create a copy of the lvm block device and copy data
from the orig to the new container device
   * first take a snapshot, then use this snapshot to copy data,
remove  snapshot after done
 * if orig container is running freeze it while copying
   * in case lvm block device, the container is only frozen during
creation of snapshot ~1 sec
 * use rsync -ax insted of cp -a
   * in case copying a live contrainer it won't copy runtine mounted
files such as /proc, /sys and some /dev
 * new opts
   * fstype: type of fs for the newly created lvm device in case of
non-snapshot lvm
   * lvprefix: prefix for new lvm device name.
 * do not delete the lines lxc.mount by default
   * check is fstab exists then copy it
   * only modify lines that contain lxc.mount =, debian template
seems to not have that line but uses lxc.mount. lines which get
screwed


Signed-off-by: InformatiQ rha...@informatiq.org
---
 src/lxc/lxc-clone.in |   98 ++
 1 files changed, 75 insertions(+), 23 deletions(-)
 mode change 100644 = 100755 src/lxc/lxc-clone.in

diff --git a/src/lxc/lxc-clone.in b/src/lxc/lxc-clone.in
old mode 100644
new mode 100755
index 91944a0..d42160b
--- a/src/lxc/lxc-clone.in
+++ b/src/lxc/lxc-clone.in
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/bin/bash

 #
 # lxc: linux Container library
@@ -22,7 +22,7 @@
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

 usage() {
-echo usage: lxc-clone -o orig -n new [-s] [-h] [-L fssize]
[-v vgname]
+echo usage: lxc-clone -o orig -n new [-s] [-h] [-L fssize]
[-v vgname] [-p lxc_lv_prefix] [-t fstype]
 }

 help() {
@@ -36,15 +36,19 @@ help() {
 echo -s  : make the new rootfs a snapshot of the original
 echo fssize  : size if creating a new fs.  By default, 2G
 echo vgname  : lvm volume group name, lxc by default
+echo lvprefix   : lvm volume name prefix, none by default, e.g.
--lvprefix=lxc_ then new lxc lv name will be lxc_newname
+echo fstype : new container file system type, ext3 by
default (only works for non-snapshot lvm)
 }

-shortoptions='ho:n:sL:v:'
-longoptions='help,orig:,name:,snapshot,fssize,vgname'
+shortoptions='ho:n:sL:v:p:t:'
+longoptions='help,orig:,name:,snapshot,fssize:,vgname:,lvprefix:,fstype:'
 lxc_path=/var/lib/lxc
 bindir=/usr/bin
 snapshot=no
 lxc_size=2G
 lxc_vg=lxc
+lxc_lv_prefix=
+fstype=ext3

 getopt=$(getopt -o $shortoptions --longoptions  $longoptions -- $@)
 if [ $? != 0 ]; then
@@ -63,6 +67,7 @@ while true; do
-s|--snapshot)
shift
snapshot=yes
+snapshot_opt=-s
;;
-o|--orig)
shift
@@ -84,6 +89,11 @@ while true; do
lxc_new=$1
shift
;;
+-p|--lvprefix)
+shift
+lxc_lv_prefix=$1
+shift
+;;
 --)
shift
break;;
@@ -141,50 +151,92 @@ trap ${bindir}/lxc-destroy -n $lxc_new; echo
aborted; exit 1 SIGHUP SIGINT SIG

 mkdir -p $lxc_path/$lxc_new

+hostname=$lxc_new
+
 echo Tweaking configuration
 cp $lxc_path/$lxc_orig/config $lxc_path/$lxc_new/config
 sed -i '/lxc.utsname/d' $lxc_path/$lxc_new/config
 echo lxc.utsname = $hostname  $lxc_path/$lxc_new/config

-sed -i '/lxc.mount/d' $lxc_path/$lxc_new/config
-echo lxc.mount = $lxc_path/$lxc_new/fstab  $lxc_path/$lxc_new/config
+grep lxc.mount = $lxc_path/$lxc_new/config /dev/null 21  { sed
-i '/lxc.mount =/d' $lxc_path/$lxc_new/config; echo lxc.mount =
$lxc_path/$lxc_new/fstab  $lxc_path/$lxc_new/config; }

-cp $lxc_path/$lxc_orig/fstab $lxc_path/$lxc_new/fstab
-sed -i s@$lxc_path/$lxc_orig@$lxc_path/$lxc_new@ $lxc_path/$lxc_new/fstab
+if [ -e  $lxc_path/$lxc_orig/fstab ];then
+cp $lxc_path/$lxc_orig/fstab $lxc_path/$lxc_new/fstab
+sed -i s@$lxc_path/$lxc_orig@$lxc_path/$lxc_new@ $lxc_path/$lxc_new/fstab
+fi

 echo Copying rootfs...
 rootfs=$lxc_path/$lxc_new/rootfs
 # First figure out if the old is a device.  For now we only support
 # lvm devices.
 mounted=0
+#is container running
+lxc-info -s -n $lxc_orig|grep RUNNING /dev/null 21
+if [ $? -ne 0 ]; then
+container_running=True
+fi
 sed -i '/lxc.rootfs/d' $lxc_path/$lxc_new/config
 oldroot=`grep lxc.rootfs $lxc_path/$lxc_orig/config | awk -F= '{ print $2 '}`
 if [ -b $oldroot ]; then
# this is a device.  If we don't want to snapshot, then mkfs, mount
# and rsync.  Trivial but not yet implemented
-   if [ $snapshot == no ]; then
-   echo non-snapshot and non-lvm clone of block device not yet 
implemented
-   exit 1
-   fi
+   #if [ $snapshot == no ]; then
+   #   echo non-snapshot and non-lvm clone of block device not yet 
implemented
+   #   exit 1
+   #fi
lvdisplay $oldroot  /dev/null 21
if [ $? -ne 0 ]; then
-   echo