blob: e9d708d7cbc19c1fbcc096fec80ba238f8b832e6 [file] [log] [blame]
Dean Troyere753fdf2011-10-25 15:45:26 -05001#!/bin/bash
2# get_uec_image.sh - Prepare Ubuntu images in various formats
3#
4# Supported formats: qcow (kvm), vmdk (vmserver), vdi (vbox), vhd (vpc), raw
5#
Dean Troyera03b99d2011-10-25 16:28:49 -05006# Required to run as root
Dean Troyere753fdf2011-10-25 15:45:26 -05007
8CACHEDIR=${CACHEDIR:-/var/cache/devstack}
9FORMAT=${FORMAT:-qcow2}
10ROOTSIZE=${ROOTSIZE:-2000}
11MIN_PKGS=${MIN_PKGS:-"apt-utils gpgv openssh-server"}
12
13usage() {
14 echo "Usage: $0 - Prepare Ubuntu images"
15 echo ""
16 echo "$0 [-f format] [-r rootsize] release imagefile"
17 echo ""
18 echo "-f format - image format: qcow2 (default), vmdk, vdi, vhd, xen, raw, fs"
19 echo "-r size - root fs size in MB (min 2000MB)"
20 echo "release - Ubuntu release: jaunty - oneric"
Dean Troyera03b99d2011-10-25 16:28:49 -050021 echo "imagefile - output image file"
Dean Troyere753fdf2011-10-25 15:45:26 -050022 exit 1
23}
24
25while getopts f:hmr: c; do
26 case $c in
27 f) FORMAT=$OPTARG
28 ;;
29 h) usage
30 ;;
31 m) MINIMAL=1
32 ;;
33 r) ROOTSIZE=$OPTARG
34 if $(( ROOTSIZE < 2000 )); then
35 echo "root size must be greater than 2000MB"
36 exit 1
37 fi
38 ;;
39 esac
40done
41shift `expr $OPTIND - 1`
42
43if [ ! "$#" -eq "2" ]; then
44 usage
45fi
46
47# Default args
48DIST_NAME=$1
49IMG_FILE=$2
50
51case $FORMAT in
52 kvm|qcow2) FORMAT=qcow2
53 QFORMAT=qcow2
54 ;;
55 vmserver|vmdk)
56 FORMAT=vmdk
57 QFORMAT=vmdk
58 ;;
59 vbox|vdi) FORMAT=vdi
60 QFORMAT=vdi
61 ;;
62 vhd|vpc) FORMAT=vhd
63 QFORMAT=vpc
64 ;;
65 xen) FORMAT=raw
66 QFORMAT=raw
67 ;;
68 raw) FORMAT=raw
69 QFORMAT=raw
70 ;;
71 *) echo "Unknown format: $FORMAT"
72 usage
73esac
74
75case $DIST_NAME in
76 oneiric) ;;
77 natty) ;;
78 maverick) ;;
79 lucid) ;;
80 karmic) ;;
81 jaunty) ;;
82 *) echo "Unknown release: $DIST_NAME"
83 usage
84 ;;
85esac
86
87# Set up nbd
88modprobe nbd max_part=63
89NBD=${NBD:-/dev/nbd9}
90NBD_DEV=`basename $NBD`
91
92# Prepare the base image
93
94# Get the UEC image
95UEC_NAME=$DIST_NAME-server-cloudimg-amd64
96if [ ! -e $CACHEDIR/$UEC_NAME-disk1.img ]; then
97 (cd $CACHEDIR; wget -N http://uec-images.ubuntu.com/$DIST_NAME/current/$UEC_NAME-disk1.img)
98
99
100 # Connect to nbd and wait till it is ready
101 qemu-nbd -d $NBD
102 qemu-nbd -c $NBD $CACHEDIR/$UEC_NAME-disk1.img
103 if ! timeout 60 sh -c "while ! [ -e /sys/block/$NBD_DEV/pid ]; do sleep 1; done"; then
104 echo "Couldn't connect $NBD"
105 exit 1
106 fi
107 MNTDIR=`mktemp -d mntXXXXXXXX`
108 mount -t ext4 ${NBD}p1 $MNTDIR
109
110 # Install our required packages
111 cp -p files/sources.list $MNTDIR/etc/apt/sources.list
112 cp -p /etc/resolv.conf $MNTDIR/etc/resolv.conf
113 chroot $MNTDIR apt-get update
114 chroot $MNTDIR apt-get install -y $MIN_PKGS
115 rm -f $MNTDIR/etc/resolv.conf
116
117 umount $MNTDIR
118 rmdir $MNTDIR
119 qemu-nbd -d $NBD
120fi
121
122if [ "$FORMAT" = "qcow2" ]; then
123 # Just copy image
124 cp -p $CACHEDIR/$UEC_NAME-disk1.img $IMG_FILE
125else
126 # Convert image
127 qemu-img convert -O $QFORMAT $CACHEDIR/$UEC_NAME-disk1.img $IMG_FILE
128fi
129
130# Resize the image if necessary
131if [ $ROOTSIZE -gt 2000 ]; then
132 # Resize the container
133 qemu-img resize $IMG_FILE +$((ROOTSIZE - 2000))M
134
135 # Connect to nbd and wait till it is ready
136 qemu-nbd -c $NBD $IMG_FILE
137 if ! timeout 60 sh -c "while ! [ -e /sys/block/$NBD_DEV/pid ]; do sleep 1; done"; then
138 echo "Couldn't connect $NBD"
139 exit 1
140 fi
141
142 # Resize partition 1 to full size of the disk image
143 echo "d
144n
145p
1461
1472
148
149t
15083
151a
1521
153w
154" | fdisk $NBD
155 fsck -t ext4 -f ${NBD}p1
156 resize2fs ${NBD}p1
157
158 qemu-nbd -d $NBD
159fi