| #!/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 |