diff --git a/tools/get_uec_image.sh b/tools/get_uec_image.sh new file mode 100755 index 0000000..fde53d2 --- /dev/null +++ b/tools/get_uec_image.sh @@ -0,0 +1,159 @@ +#!/bin/bash +# get_uec_image.sh - Prepare Ubuntu images in various formats +# +# Supported formats: qcow (kvm), vmdk (vmserver), vdi (vbox), vhd (vpc), raw +# +# Requires to run as root + +CACHEDIR=${CACHEDIR:-/var/cache/devstack} +FORMAT=${FORMAT:-qcow2} +ROOTSIZE=${ROOTSIZE:-2000} +MIN_PKGS=${MIN_PKGS:-"apt-utils gpgv openssh-server"} + +usage() { + echo "Usage: $0 - Prepare Ubuntu images" + echo "" + echo "$0 [-f format] [-r rootsize] release imagefile" + echo "" + echo "-f format - image format: qcow2 (default), vmdk, vdi, vhd, xen, raw, fs" + echo "-r size - root fs size in MB (min 2000MB)" + echo "release - Ubuntu release: jaunty - oneric" + echo "imagefile - output image file + exit 1 +} + +while getopts f:hmr: c; do + case $c in + f) FORMAT=$OPTARG + ;; + h) usage + ;; + m) MINIMAL=1 + ;; + r) ROOTSIZE=$OPTARG + if $(( ROOTSIZE < 2000 )); then + echo "root size must be greater than 2000MB" + exit 1 + fi + ;; + esac +done +shift `expr $OPTIND - 1` + +if [ ! "$#" -eq "2" ]; then + usage +fi + +# Default args +DIST_NAME=$1 +IMG_FILE=$2 + +case $FORMAT in + kvm|qcow2) FORMAT=qcow2 + QFORMAT=qcow2 + ;; + vmserver|vmdk) + FORMAT=vmdk + QFORMAT=vmdk + ;; + vbox|vdi) FORMAT=vdi + QFORMAT=vdi + ;; + vhd|vpc) FORMAT=vhd + QFORMAT=vpc + ;; + xen) FORMAT=raw + QFORMAT=raw + ;; + raw) FORMAT=raw + QFORMAT=raw + ;; + *) echo "Unknown format: $FORMAT" + usage +esac + +case $DIST_NAME in + oneiric) ;; + natty) ;; + maverick) ;; + lucid) ;; + karmic) ;; + jaunty) ;; + *) echo "Unknown release: $DIST_NAME" + usage + ;; +esac + +# Set up nbd +modprobe nbd max_part=63 +NBD=${NBD:-/dev/nbd9} +NBD_DEV=`basename $NBD` + +# Prepare the base image + +# Get the UEC image +UEC_NAME=$DIST_NAME-server-cloudimg-amd64 +if [ ! -e $CACHEDIR/$UEC_NAME-disk1.img ]; then + (cd $CACHEDIR; wget -N http://uec-images.ubuntu.com/$DIST_NAME/current/$UEC_NAME-disk1.img) + + + # Connect to nbd and wait till it is ready + qemu-nbd -d $NBD + qemu-nbd -c $NBD $CACHEDIR/$UEC_NAME-disk1.img + if ! timeout 60 sh -c "while ! [ -e /sys/block/$NBD_DEV/pid ]; do sleep 1; done"; then + echo "Couldn't connect $NBD" + exit 1 + fi + MNTDIR=`mktemp -d mntXXXXXXXX` + mount -t ext4 ${NBD}p1 $MNTDIR + + # Install our required packages + cp -p files/sources.list $MNTDIR/etc/apt/sources.list + cp -p /etc/resolv.conf $MNTDIR/etc/resolv.conf + chroot $MNTDIR apt-get update + chroot $MNTDIR apt-get install -y $MIN_PKGS + rm -f $MNTDIR/etc/resolv.conf + + umount $MNTDIR + rmdir $MNTDIR + qemu-nbd -d $NBD +fi + +if [ "$FORMAT" = "qcow2" ]; then + # Just copy image + cp -p $CACHEDIR/$UEC_NAME-disk1.img $IMG_FILE +else + # Convert image + qemu-img convert -O $QFORMAT $CACHEDIR/$UEC_NAME-disk1.img $IMG_FILE +fi + +# Resize the image if necessary +if [ $ROOTSIZE -gt 2000 ]; then + # Resize the container + qemu-img resize $IMG_FILE +$((ROOTSIZE - 2000))M + + # Connect to nbd and wait till it is ready + qemu-nbd -c $NBD $IMG_FILE + if ! timeout 60 sh -c "while ! [ -e /sys/block/$NBD_DEV/pid ]; do sleep 1; done"; then + echo "Couldn't connect $NBD" + exit 1 + fi + + # Resize partition 1 to full size of the disk image + echo "d +n +p +1 +2 + +t +83 +a +1 +w +" | fdisk $NBD + fsck -t ext4 -f ${NBD}p1 + resize2fs ${NBD}p1 + + qemu-nbd -d $NBD +fi