diff options
author | Serge Hallyn <serge.hallyn@canonical.com> | 2012-01-23 13:25:11 -0600 |
---|---|---|
committer | Daniel Lezcano <daniel.lezcano@free.fr> | 2012-02-26 10:44:40 +0100 |
commit | 6d8ac56b658a7aa35a46580c2df060c58ef02821 (patch) | |
tree | ed9a92c45d7969f70d658a9b9c9adb2ba450cac8 | |
parent | Fix several nagging bugs in lxc-destroy (diff) | |
download | lxc-6d8ac56b658a7aa35a46580c2df060c58ef02821.tar.gz lxc-6d8ac56b658a7aa35a46580c2df060c58ef02821.tar.bz2 lxc-6d8ac56b658a7aa35a46580c2df060c58ef02821.zip |
add lvm support to lxc-create
1. Some templates copy the cached pristine rootfs using 'cp a b' where b is
$lxc_path/$name/rootfs. That doesn't do the right thing if rootfs already
exists, as it will when it is an lvm or other mount. So switch to
'rsync a/ b/'. (cp can be made to work too of course).
2. Update lxc-create to support backing stores. For now only lvm is
implemented.
Signed-off-by: Serge Hallyn <serge.hallyn@canonical.com>
Signed-off-by: Daniel Lezcano <dlezcano@fr.ibm.com>
-rw-r--r-- | src/lxc/lxc-clone.in | 4 | ||||
-rw-r--r-- | src/lxc/lxc-create.in | 125 | ||||
-rw-r--r-- | templates/lxc-debian.in | 3 | ||||
-rw-r--r-- | templates/lxc-opensuse.in | 3 | ||||
-rw-r--r-- | templates/lxc-ubuntu.in | 5 |
5 files changed, 126 insertions, 14 deletions
diff --git a/src/lxc/lxc-clone.in b/src/lxc/lxc-clone.in index 38369d8..cdf9413 100644 --- a/src/lxc/lxc-clone.in +++ b/src/lxc/lxc-clone.in @@ -42,8 +42,8 @@ help() { shortoptions='ho:n:sL:v:p:t:' longoptions='help,orig:,name:,snapshot,fssize:,vgname:,lvprefix:,fstype:' -lxc_path=/var/lib/lxc -bindir=/usr/bin +lxc_path=@LXCPATH@ +bindir=@BINDIR@ snapshot=no lxc_size=2G lxc_vg=lxc diff --git a/src/lxc/lxc-create.in b/src/lxc/lxc-create.in index 6e57a36..af0b07a 100644 --- a/src/lxc/lxc-create.in +++ b/src/lxc/lxc-create.in @@ -21,7 +21,12 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA usage() { - echo "usage: lxc-create -n <name> [-f configuration] [-t template] [-h] -- [template_options]" + echo "usage: lxc-create -n <name> [-f configuration] [-t template] [-h] [fsopts] -- [template_options]" + echo " fsopts: -B none" + echo " fsopts: -B lvm [--lvname lvname] [--vgname vgname] [--fstype fstype] [--fssize fssize]" +# echo " fsopts: -B union [--uniontype overlayfs]" +# echo " fsopts: -B loop [--fstype fstype] [--fssize fssize]" +# echo " fsopts: -B qemu-nbd [--type qed|qcow2|raw] [--fstype fstype] [--fssize fssize] # Qemu qed disk format" } help() { @@ -33,6 +38,16 @@ help() { echo "name : name of the container" echo "configuration: lxc configuration" echo "template : lxc-template is an accessible template script" + echo + echo "The container backing store can be altered using '-B'. By default it" + echo "is 'none', which is a simple directory tree under /var/lib/lxc/<name>/rootfs" + echo "Otherwise, the following option values may be relevant:" + echo "lvname : [for -lvm] name of lv in which to create lv," + echo " container-name by default" + echo "vgname : [for -lvm] name of vg in which to create lv, 'lxc' by default" + echo "fstype : name of filesystem to create, ext4 by default" + echo "fssize : size of filesystem to create, 500M by default" + echo if [ -z $lxc_template ]; then echo "for template-specific help, specify a template, for instance:" echo "lxc-create -t ubuntu -h" @@ -46,13 +61,17 @@ help() { fi } -shortoptions='hn:f:t:' -longoptions='help,name:,config:,template:' +shortoptions='hn:f:t:B:' +longoptions='help,name:,config:,template:,backingstore:,fstype:,lvname:,vgname:,fssize:' localstatedir=@LOCALSTATEDIR@ lxc_path=@LXCPATH@ bindir=@BINDIR@ libdir=@LIBDIR@ templatedir=@LXCTEMPLATEDIR@ +backingstore=none +fstype=ext4 +fssize=500M +vgname=lxc getopt=$(getopt -o $shortoptions --longoptions $longoptions -- "$@") if [ $? != 0 ]; then @@ -83,6 +102,31 @@ while true; do lxc_template=$1 shift ;; + -B|--backingstore) + shift + backingstore=$1 + shift + ;; + --lvname) + shift + lvname=$1 + shift + ;; + --vgname) + shift + vgname=$1 + shift + ;; + --fstype) + shift + fstype=$1 + shift + ;; + --fssize) + shift + fssize=$1 + shift + ;; --) shift break;; @@ -110,11 +154,21 @@ if [ -z "$lxc_name" ]; then exit 1 fi +if [ -z "$lvname" ]; then + lvname="$lxc_name" +fi + if [ "$(id -u)" != "0" ]; then echo "This command has to be run as root" exit 1 fi +if [ $backingstore != "none" -a $backingstore != "lvm" ]; then + echo "only 'none' and 'lvm' backing stores are known" + usage + exit 1 +fi + if [ ! -r $lxc_path ]; then echo "no configuration path defined !" exit 1 @@ -125,7 +179,47 @@ if [ -d "$lxc_path/$lxc_name" ]; then exit 1 fi -trap "${bindir}/lxc-destroy -n $lxc_name; echo aborted; exit 1" SIGHUP SIGINT SIGTERM +rootfs="$lxc_path/$lxc_name/rootfs" +if [ $backingstore = "lvm" ]; then + which vgscan > /dev/null + if [ $? -ne 0 ]; then + echo "vgscan not found. Please install lvm2 package" + exit 1 + fi + grep -q "\<$fstype\>" /proc/filesystems + if [ $? -ne 0 ]; then + echo "$fstype is not listed in /proc/filesystems" + usage + exit 1 + fi + + vgscan | grep -q "Found volume group \"$vgname\"" + if [ $? -ne 0 ]; then + echo "Could not find volume group \"$vgname\"" + usage + exit 1 + fi + + rootdev=/dev/$vgname/$lvname + lvdisplay $rootdev > /dev/null 2>&1 + if [ $? -eq 0 ]; then + echo "backing store already exists: $rootdev" + echo "please delete it (using \"lvremove $rootdev\") and try again" + exit 1 + fi +fi + +cleanup() { + if [ $backingstore = "lvm" ]; then + umount $rootfs + lvremove -f $rootdev + fi + ${bindir}/lxc-destroy -n $lxc_name + echo aborted + exit 1 +} + +trap cleanup SIGHUP SIGINT SIGTERM mkdir -p $lxc_path/$lxc_name @@ -140,13 +234,21 @@ else cp $lxc_config $lxc_path/$lxc_name/config fi +# Create the fs as needed +mkdir $rootfs +if [ $backingstore = "lvm" ]; then + lvcreate -L $fssize -n $lxc_name $vgname || exit 1 + udevadm settle + mkfs -t $fstype $rootdev || exit 1 + mount -t $fstype $rootdev $rootfs +fi + if [ ! -z $lxc_template ]; then type ${templatedir}/lxc-$lxc_template >/dev/null if [ $? -ne 0 ]; then - echo "unknown template '$lxc_template'" - ${bindir}/lxc-destroy -n $lxc_name - exit 1 + echo "unknown template '$lxc_template'" + cleanup fi if [ -z "$lxc_config" ]; then @@ -185,4 +287,13 @@ if [ ! -z $lxc_template ]; then echo "'$lxc_template' template installed" fi +if [ $backingstore = "lvm" ]; then + echo "Unmounting LVM" + umount $rootfs + + # TODO: make the templates set this right from the start? + sed -i '/lxc.rootfs/d' $lxc_path/$lxc_name/config + echo "lxc.rootfs = $rootdev" >> $lxc_path/$lxc_name/config +fi + echo "'$lxc_name' created" diff --git a/templates/lxc-debian.in b/templates/lxc-debian.in index 9d33113..b97bbac 100644 --- a/templates/lxc-debian.in +++ b/templates/lxc-debian.in @@ -142,7 +142,8 @@ copy_debian() # make a local copy of the minidebian echo -n "Copying rootfs to $rootfs..." - cp -a "$cache/rootfs-$SUITE-$arch" $rootfs || return 1 + mkdir -p $rootfs + rsync -a "$cache/rootfs-$SUITE-$arch"/ $rootfs/ || return 1 return 0 } diff --git a/templates/lxc-opensuse.in b/templates/lxc-opensuse.in index d30147d..120b2c7 100644 --- a/templates/lxc-opensuse.in +++ b/templates/lxc-opensuse.in @@ -206,7 +206,8 @@ copy_opensuse() # make a local copy of the mini opensuse echo -n "Copying rootfs to $rootfs ..." - cp -a $cache/rootfs-$arch $rootfs || return 1 + mkdir -p $rootfs + rsync -a $cache/rootfs-$arch/ $rootfs/ || return 1 return 0 } diff --git a/templates/lxc-ubuntu.in b/templates/lxc-ubuntu.in index af17ef0..71cfad5 100644 --- a/templates/lxc-ubuntu.in +++ b/templates/lxc-ubuntu.in @@ -6,8 +6,6 @@ # This script consolidates and extends the existing lxc ubuntu scripts # -# XXX todo: add -lvm option - # Copyright © 2011 Serge Hallyn <serge.hallyn@canonical.com> # Copyright © 2010 Wilhelm Meier # Author: Wilhelm Meier <wilhelm.meier@fh-kl.de> @@ -195,7 +193,8 @@ copy_ubuntu() # make a local copy of the miniubuntu echo -n "Copying rootfs to $rootfs ..." - cp -a $cache/rootfs-$arch $rootfs || return 1 + mkdir -p $rootfs + rsync -a $cache/rootfs-$arch/ $rootfs/ || return 1 return 0 } |