blob: 7b95aab861c7b3bbf4627bc0ca55a5ac14acd58c [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
Jesse Andrews04156db2011-10-31 11:59:55 -070013# Keep track of the current directory
14TOOLS_DIR=$(cd $(dirname "$0") && pwd)
15TOP_DIR=`cd $TOOLS_DIR/..; pwd`
16
Dean Troyer43392f72011-11-05 16:55:15 -050017# exit on error to stop unexpected errors
18set -o errexit
19
Dean Troyere753fdf2011-10-25 15:45:26 -050020usage() {
21 echo "Usage: $0 - Prepare Ubuntu images"
22 echo ""
23 echo "$0 [-f format] [-r rootsize] release imagefile"
24 echo ""
25 echo "-f format - image format: qcow2 (default), vmdk, vdi, vhd, xen, raw, fs"
26 echo "-r size - root fs size in MB (min 2000MB)"
27 echo "release - Ubuntu release: jaunty - oneric"
Dean Troyera03b99d2011-10-25 16:28:49 -050028 echo "imagefile - output image file"
Dean Troyere753fdf2011-10-25 15:45:26 -050029 exit 1
30}
31
Dean Troyer55c02732011-11-01 17:44:03 -050032# Clean up any resources that may be in use
33cleanup() {
34 set +o errexit
35
36 # Mop up temporary files
37 if [ -n "$IMG_FILE_TMP" -a -e "$IMG_FILE_TMP" ]; then
38 rm -f $IMG_FILE_TMP
39 fi
40
41 # Release NBD devices
42 if [ -n "$NBD" ]; then
43 qemu-nbd -d $NBD
44 fi
45
46 # Kill ourselves to signal any calling process
47 trap 2; kill -2 $$
48}
49
Dean Troyer43392f72011-11-05 16:55:15 -050050# apt-get wrapper to just get arguments set correctly
51function apt_get() {
52 local sudo="sudo"
53 [ "$(id -u)" = "0" ] && sudo="env"
54 $sudo DEBIAN_FRONTEND=noninteractive apt-get \
55 --option "Dpkg::Options::=--force-confold" --assume-yes "$@"
56}
57
Dean Troyere753fdf2011-10-25 15:45:26 -050058while getopts f:hmr: c; do
59 case $c in
60 f) FORMAT=$OPTARG
61 ;;
62 h) usage
63 ;;
64 m) MINIMAL=1
65 ;;
66 r) ROOTSIZE=$OPTARG
Jesse Andrews04156db2011-10-31 11:59:55 -070067 if [[ $ROOTSIZE < 2000 ]]; then
Dean Troyere753fdf2011-10-25 15:45:26 -050068 echo "root size must be greater than 2000MB"
69 exit 1
70 fi
71 ;;
72 esac
73done
74shift `expr $OPTIND - 1`
75
76if [ ! "$#" -eq "2" ]; then
77 usage
78fi
79
80# Default args
81DIST_NAME=$1
82IMG_FILE=$2
Dean Troyer71745fe2011-10-31 16:59:02 -050083IMG_FILE_TMP=`mktemp $IMG_FILE.XXXXXX`
Dean Troyere753fdf2011-10-25 15:45:26 -050084
85case $FORMAT in
86 kvm|qcow2) FORMAT=qcow2
87 QFORMAT=qcow2
88 ;;
89 vmserver|vmdk)
90 FORMAT=vmdk
91 QFORMAT=vmdk
92 ;;
93 vbox|vdi) FORMAT=vdi
94 QFORMAT=vdi
95 ;;
96 vhd|vpc) FORMAT=vhd
97 QFORMAT=vpc
98 ;;
99 xen) FORMAT=raw
100 QFORMAT=raw
101 ;;
102 raw) FORMAT=raw
103 QFORMAT=raw
104 ;;
105 *) echo "Unknown format: $FORMAT"
106 usage
107esac
108
109case $DIST_NAME in
110 oneiric) ;;
111 natty) ;;
112 maverick) ;;
113 lucid) ;;
114 karmic) ;;
115 jaunty) ;;
116 *) echo "Unknown release: $DIST_NAME"
117 usage
118 ;;
119esac
120
Dean Troyer43392f72011-11-05 16:55:15 -0500121trap cleanup SIGHUP SIGINT SIGTERM SIGQUIT
122
123# Check for dependencies
124
125if [ ! -x "`which qemu-img`" -o ! -x "`which qemu-nbd`" ]; then
126 # Missing KVM?
127 apt_get install qemu-kvm
128fi
Dean Troyer55c02732011-11-01 17:44:03 -0500129
Dean Troyere753fdf2011-10-25 15:45:26 -0500130# Prepare the base image
131
132# Get the UEC image
133UEC_NAME=$DIST_NAME-server-cloudimg-amd64
134if [ ! -e $CACHEDIR/$UEC_NAME-disk1.img ]; then
Anthony Young23324e92011-11-03 13:47:15 -0700135 mkdir -p $CACHEDIR
Jesse Andrewsd6ee73f2011-10-30 19:40:38 -0700136 (cd $CACHEDIR && wget -N http://uec-images.ubuntu.com/$DIST_NAME/current/$UEC_NAME-disk1.img)
Dean Troyere753fdf2011-10-25 15:45:26 -0500137fi
138
139if [ "$FORMAT" = "qcow2" ]; then
140 # Just copy image
Dean Troyer71745fe2011-10-31 16:59:02 -0500141 cp -p $CACHEDIR/$UEC_NAME-disk1.img $IMG_FILE_TMP
Dean Troyere753fdf2011-10-25 15:45:26 -0500142else
143 # Convert image
Dean Troyer71745fe2011-10-31 16:59:02 -0500144 qemu-img convert -O $QFORMAT $CACHEDIR/$UEC_NAME-disk1.img $IMG_FILE_TMP
Dean Troyere753fdf2011-10-25 15:45:26 -0500145fi
146
147# Resize the image if necessary
148if [ $ROOTSIZE -gt 2000 ]; then
149 # Resize the container
Dean Troyer71745fe2011-10-31 16:59:02 -0500150 qemu-img resize $IMG_FILE_TMP +$((ROOTSIZE - 2000))M
Dean Troyerae605562011-10-26 12:35:22 -0500151fi
Dean Troyere753fdf2011-10-25 15:45:26 -0500152
Dean Troyerdccd6b92011-11-01 15:46:14 -0500153# Finds the next available NBD device
154# Exits script if error connecting or none free
155# map_nbd image
156# returns full nbd device path
157function map_nbd {
158 for i in `seq 0 15`; do
159 if [ ! -e /sys/block/nbd$i/pid ]; then
160 NBD=/dev/nbd$i
161 # Connect to nbd and wait till it is ready
162 qemu-nbd -c $NBD $1
163 if ! timeout 60 sh -c "while ! [ -e ${NBD}p1 ]; do sleep 1; done"; then
164 echo "Couldn't connect $NBD"
165 exit 1
166 fi
167 break
168 fi
169 done
170 if [ -z "$NBD" ]; then
171 echo "No free NBD slots"
172 exit 1
173 fi
174 echo $NBD
175}
176
Dean Troyer71745fe2011-10-31 16:59:02 -0500177# Set up nbd
178modprobe nbd max_part=63
Dean Troyerdccd6b92011-11-01 15:46:14 -0500179NBD=`map_nbd $IMG_FILE_TMP`
Dean Troyere753fdf2011-10-25 15:45:26 -0500180
Dean Troyerae605562011-10-26 12:35:22 -0500181# Resize partition 1 to full size of the disk image
182echo "d
Dean Troyere753fdf2011-10-25 15:45:26 -0500183n
184p
1851
1862
187
188t
18983
190a
1911
192w
193" | fdisk $NBD
Dean Troyer2c1a2d52011-10-31 15:32:54 -0500194e2fsck -f -p ${NBD}p1
Dean Troyerae605562011-10-26 12:35:22 -0500195resize2fs ${NBD}p1
Dean Troyere753fdf2011-10-25 15:45:26 -0500196
Dean Troyerc2ddc972011-10-31 15:04:27 -0500197# Do some preliminary installs
198MNTDIR=`mktemp -d mntXXXXXXXX`
199mount -t ext4 ${NBD}p1 $MNTDIR
200
201# Install our required packages
202cp -p files/sources.list $MNTDIR/etc/apt/sources.list
Dean Troyer2dfdbc92011-10-31 15:46:49 -0500203sed -e "s,%DIST%,$DIST_NAME,g" -i $MNTDIR/etc/apt/sources.list
Dean Troyerc2ddc972011-10-31 15:04:27 -0500204cp -p /etc/resolv.conf $MNTDIR/etc/resolv.conf
205chroot $MNTDIR apt-get update
206chroot $MNTDIR apt-get install -y $MIN_PKGS
207rm -f $MNTDIR/etc/resolv.conf
208
209umount $MNTDIR
210rmdir $MNTDIR
Dean Troyerae605562011-10-26 12:35:22 -0500211qemu-nbd -d $NBD
Dean Troyer55c02732011-11-01 17:44:03 -0500212NBD=""
Dean Troyer71745fe2011-10-31 16:59:02 -0500213
214mv $IMG_FILE_TMP $IMG_FILE