|  | #!/bin/bash | 
|  | # make_image.sh - Create Ubuntu images in various formats | 
|  | # | 
|  | # Supported formats: qcow (kvm), vmdk (vmserver), vdi (vbox), vhd (vpc), raw | 
|  | # | 
|  | # Requires sudo to root | 
|  |  | 
|  | ROOTSIZE=${ROOTSIZE:-8192} | 
|  | SWAPSIZE=${SWAPSIZE:-1024} | 
|  | MIN_PKGS=${MIN_PKGS:-"apt-utils gpgv openssh-server"} | 
|  |  | 
|  | usage() { | 
|  | echo "Usage: $0 - Create Ubuntu images" | 
|  | echo "" | 
|  | echo "$0 [-m] [-r rootsize] [-s swapsize] release format" | 
|  | echo "$0 -C [-m] release chrootdir" | 
|  | echo "$0 -I [-r rootsize] [-s swapsize] chrootdir format" | 
|  | echo "" | 
|  | echo "-C        - Create the initial chroot dir" | 
|  | echo "-I        - Create the final image from a chroot" | 
|  | echo "-m        - minimal installation" | 
|  | echo "-r size   - root fs size in MB" | 
|  | echo "-s size   - swap fs size in MB" | 
|  | echo "release   - Ubuntu release: jaunty - oneric" | 
|  | echo "format    - image format: qcow2, vmdk, vdi, vhd, xen, raw, fs" | 
|  | exit 1 | 
|  | } | 
|  |  | 
|  | while getopts CIhmr:s: c; do | 
|  | case $c in | 
|  | C)  CHROOTONLY=1 | 
|  | ;; | 
|  | I)  IMAGEONLY=1 | 
|  | ;; | 
|  | h)  usage | 
|  | ;; | 
|  | m)  MINIMAL=1 | 
|  | ;; | 
|  | r)  ROOTSIZE=$OPTARG | 
|  | ;; | 
|  | s)  SWAPSIZE=$OPTARG | 
|  | ;; | 
|  | esac | 
|  | done | 
|  | shift `expr $OPTIND - 1` | 
|  |  | 
|  | if [ ! "$#" -eq "2" -o -n "$CHROOTONLY" -a -n "$IMAGEONLY" ]; then | 
|  | usage | 
|  | fi | 
|  |  | 
|  | # Default args | 
|  | RELEASE=$1 | 
|  | FORMAT=$2 | 
|  | CHROOTDIR="" | 
|  |  | 
|  | if [ -n "$CHROOTONLY" ]; then | 
|  | RELEASE=$1 | 
|  | CHROOTDIR=$2 | 
|  | FORMAT="pass" | 
|  | fi | 
|  |  | 
|  | if [ -n "$IMAGEONLY" ]; then | 
|  | CHROOTDIR=$1 | 
|  | FORMAT=$2 | 
|  | RELEASE="pass" | 
|  | fi | 
|  |  | 
|  | case $FORMAT in | 
|  | kvm|qcow2)  FORMAT=qcow2 | 
|  | QFORMAT=qcow2 | 
|  | HYPER=kvm | 
|  | ;; | 
|  | vmserver|vmdk) | 
|  | FORMAT=vmdk | 
|  | QFORMAT=vmdk | 
|  | HYPER=vmserver | 
|  | ;; | 
|  | vbox|vdi)   FORMAT=vdi | 
|  | QFORMAT=vdi | 
|  | HYPER=kvm | 
|  | ;; | 
|  | vhd|vpc)    FORMAT=vhd | 
|  | QFORMAT=vpc | 
|  | HYPER=kvm | 
|  | ;; | 
|  | xen)        FORMAT=raw | 
|  | QFORMAT=raw | 
|  | HYPER=xen | 
|  | ;; | 
|  | raw)        FORMAT=raw | 
|  | QFORMAT=raw | 
|  | HYPER=kvm | 
|  | ;; | 
|  | pass)       ;; | 
|  | *)          echo "Unknown format: $FORMAT" | 
|  | usage | 
|  | esac | 
|  |  | 
|  | case $RELEASE in | 
|  | natty)      ;; | 
|  | maverick)   ;; | 
|  | lucid)      ;; | 
|  | karmic)     ;; | 
|  | jaunty)     ;; | 
|  | pass)       ;; | 
|  | *)          echo "Unknown release: $RELEASE" | 
|  | usage | 
|  | ;; | 
|  | esac | 
|  |  | 
|  | # Install stuff if necessary | 
|  | if [ -z `which vmbuilder` ]; then | 
|  | sudo apt-get install ubuntu-vm-builder | 
|  | fi | 
|  |  | 
|  | if [ -n "$CHROOTONLY" ]; then | 
|  | # Build a chroot directory | 
|  | HYPER=kvm | 
|  | if [ "$MINIMAL" = 1 ]; then | 
|  | ARGS="--variant=minbase" | 
|  | for i in $MIN_PKGS; do | 
|  | ARGS="$ARGS --addpkg=$i" | 
|  | done | 
|  | fi | 
|  | sudo vmbuilder $HYPER ubuntu $ARGS \ | 
|  | --suite $RELEASE \ | 
|  | --only-chroot \ | 
|  | --chroot-dir=$CHROOTDIR \ | 
|  | --overwrite \ | 
|  | --addpkg=$MIN_PKGS \ | 
|  |  | 
|  | sudo cp -p files/sources.list $CHROOTDIR/etc/apt/sources.list | 
|  | sudo chroot $CHROOTDIR apt-get update | 
|  |  | 
|  | exit 0 | 
|  | fi | 
|  |  | 
|  | # Build the image | 
|  | TMPDIR=tmp | 
|  | TMPDISK=`mktemp imgXXXXXXXX` | 
|  | SIZE=$[$ROOTSIZE+$SWAPSIZE+1] | 
|  | dd if=/dev/null of=$TMPDISK bs=1M seek=$SIZE count=1 | 
|  |  | 
|  | if [ -n "$IMAGEONLY" ]; then | 
|  | # Build image from chroot | 
|  | sudo vmbuilder $HYPER ubuntu $ARGS \ | 
|  | --existing-chroot=$CHROOTDIR \ | 
|  | --overwrite \ | 
|  | --rootsize=$ROOTSIZE \ | 
|  | --swapsize=$SWAPSIZE \ | 
|  | --tmpfs - \ | 
|  | --raw=$TMPDISK \ | 
|  |  | 
|  | else | 
|  | # Do the whole shebang in one pass | 
|  | ARGS="--variant=minbase" | 
|  | for i in $MIN_PKGS; do | 
|  | ARGS="$ARGS --addpkg=$i" | 
|  | done | 
|  | sudo vmbuilder $HYPER ubuntu $ARGS \ | 
|  | --suite $RELEASE \ | 
|  | --overwrite \ | 
|  | --rootsize=$ROOTSIZE \ | 
|  | --swapsize=$SWAPSIZE \ | 
|  | --tmpfs - \ | 
|  | --raw=$TMPDISK \ | 
|  |  | 
|  | fi | 
|  |  | 
|  | if [ "$FORMAT" = "raw" ]; then | 
|  | # Get image | 
|  | mv $TMPDISK $RELEASE.$FORMAT | 
|  | else | 
|  | # Convert image | 
|  | qemu-img convert -O $QFORMAT $TMPDISK $RELEASE.$FORMAT | 
|  | rm $TMPDISK | 
|  | fi | 
|  | rm -rf ubuntu-$HYPER |