| Dean Troyer | e753fdf | 2011-10-25 15:45:26 -0500 | [diff] [blame] | 1 | #!/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 Troyer | a03b99d | 2011-10-25 16:28:49 -0500 | [diff] [blame] | 6 | # Required to run as root | 
| Dean Troyer | e753fdf | 2011-10-25 15:45:26 -0500 | [diff] [blame] | 7 |  | 
|  | 8 | CACHEDIR=${CACHEDIR:-/var/cache/devstack} | 
|  | 9 | FORMAT=${FORMAT:-qcow2} | 
|  | 10 | ROOTSIZE=${ROOTSIZE:-2000} | 
|  | 11 | MIN_PKGS=${MIN_PKGS:-"apt-utils gpgv openssh-server"} | 
|  | 12 |  | 
| Jesse Andrews | 04156db | 2011-10-31 11:59:55 -0700 | [diff] [blame] | 13 | # Keep track of the current directory | 
|  | 14 | TOOLS_DIR=$(cd $(dirname "$0") && pwd) | 
|  | 15 | TOP_DIR=`cd $TOOLS_DIR/..; pwd` | 
|  | 16 |  | 
| Dean Troyer | e753fdf | 2011-10-25 15:45:26 -0500 | [diff] [blame] | 17 | usage() { | 
|  | 18 | echo "Usage: $0 - Prepare Ubuntu images" | 
|  | 19 | echo "" | 
|  | 20 | echo "$0 [-f format] [-r rootsize] release imagefile" | 
|  | 21 | echo "" | 
|  | 22 | echo "-f format - image format: qcow2 (default), vmdk, vdi, vhd, xen, raw, fs" | 
|  | 23 | echo "-r size   - root fs size in MB (min 2000MB)" | 
|  | 24 | echo "release   - Ubuntu release: jaunty - oneric" | 
| Dean Troyer | a03b99d | 2011-10-25 16:28:49 -0500 | [diff] [blame] | 25 | echo "imagefile - output image file" | 
| Dean Troyer | e753fdf | 2011-10-25 15:45:26 -0500 | [diff] [blame] | 26 | exit 1 | 
|  | 27 | } | 
|  | 28 |  | 
| Dean Troyer | 55c0273 | 2011-11-01 17:44:03 -0500 | [diff] [blame] | 29 | # Clean up any resources that may be in use | 
|  | 30 | cleanup() { | 
|  | 31 | set +o errexit | 
|  | 32 |  | 
|  | 33 | # Mop up temporary files | 
|  | 34 | if [ -n "$IMG_FILE_TMP" -a -e "$IMG_FILE_TMP" ]; then | 
|  | 35 | rm -f $IMG_FILE_TMP | 
|  | 36 | fi | 
|  | 37 |  | 
|  | 38 | # Release NBD devices | 
|  | 39 | if [ -n "$NBD" ]; then | 
|  | 40 | qemu-nbd -d $NBD | 
|  | 41 | fi | 
|  | 42 |  | 
|  | 43 | # Kill ourselves to signal any calling process | 
|  | 44 | trap 2; kill -2 $$ | 
|  | 45 | } | 
|  | 46 |  | 
| Dean Troyer | e753fdf | 2011-10-25 15:45:26 -0500 | [diff] [blame] | 47 | while getopts f:hmr: c; do | 
|  | 48 | case $c in | 
|  | 49 | f)  FORMAT=$OPTARG | 
|  | 50 | ;; | 
|  | 51 | h)  usage | 
|  | 52 | ;; | 
|  | 53 | m)  MINIMAL=1 | 
|  | 54 | ;; | 
|  | 55 | r)  ROOTSIZE=$OPTARG | 
| Jesse Andrews | 04156db | 2011-10-31 11:59:55 -0700 | [diff] [blame] | 56 | if [[ $ROOTSIZE < 2000 ]]; then | 
| Dean Troyer | e753fdf | 2011-10-25 15:45:26 -0500 | [diff] [blame] | 57 | echo "root size must be greater than 2000MB" | 
|  | 58 | exit 1 | 
|  | 59 | fi | 
|  | 60 | ;; | 
|  | 61 | esac | 
|  | 62 | done | 
|  | 63 | shift `expr $OPTIND - 1` | 
|  | 64 |  | 
|  | 65 | if [ ! "$#" -eq "2" ]; then | 
|  | 66 | usage | 
|  | 67 | fi | 
|  | 68 |  | 
|  | 69 | # Default args | 
|  | 70 | DIST_NAME=$1 | 
|  | 71 | IMG_FILE=$2 | 
| Dean Troyer | 71745fe | 2011-10-31 16:59:02 -0500 | [diff] [blame] | 72 | IMG_FILE_TMP=`mktemp $IMG_FILE.XXXXXX` | 
| Dean Troyer | e753fdf | 2011-10-25 15:45:26 -0500 | [diff] [blame] | 73 |  | 
|  | 74 | case $FORMAT in | 
|  | 75 | kvm|qcow2)  FORMAT=qcow2 | 
|  | 76 | QFORMAT=qcow2 | 
|  | 77 | ;; | 
|  | 78 | vmserver|vmdk) | 
|  | 79 | FORMAT=vmdk | 
|  | 80 | QFORMAT=vmdk | 
|  | 81 | ;; | 
|  | 82 | vbox|vdi)   FORMAT=vdi | 
|  | 83 | QFORMAT=vdi | 
|  | 84 | ;; | 
|  | 85 | vhd|vpc)    FORMAT=vhd | 
|  | 86 | QFORMAT=vpc | 
|  | 87 | ;; | 
|  | 88 | xen)        FORMAT=raw | 
|  | 89 | QFORMAT=raw | 
|  | 90 | ;; | 
|  | 91 | raw)        FORMAT=raw | 
|  | 92 | QFORMAT=raw | 
|  | 93 | ;; | 
|  | 94 | *)          echo "Unknown format: $FORMAT" | 
|  | 95 | usage | 
|  | 96 | esac | 
|  | 97 |  | 
|  | 98 | case $DIST_NAME in | 
|  | 99 | oneiric)    ;; | 
|  | 100 | natty)      ;; | 
|  | 101 | maverick)   ;; | 
|  | 102 | lucid)      ;; | 
|  | 103 | karmic)     ;; | 
|  | 104 | jaunty)     ;; | 
|  | 105 | *)          echo "Unknown release: $DIST_NAME" | 
|  | 106 | usage | 
|  | 107 | ;; | 
|  | 108 | esac | 
|  | 109 |  | 
| Dean Troyer | 55c0273 | 2011-11-01 17:44:03 -0500 | [diff] [blame] | 110 | trap cleanup SIGHUP SIGINT SIGTERM | 
|  | 111 |  | 
| Dean Troyer | e753fdf | 2011-10-25 15:45:26 -0500 | [diff] [blame] | 112 | # Prepare the base image | 
|  | 113 |  | 
|  | 114 | # Get the UEC image | 
|  | 115 | UEC_NAME=$DIST_NAME-server-cloudimg-amd64 | 
|  | 116 | if [ ! -e $CACHEDIR/$UEC_NAME-disk1.img ]; then | 
| Anthony Young | 23324e9 | 2011-11-03 13:47:15 -0700 | [diff] [blame] | 117 | mkdir -p $CACHEDIR | 
| Jesse Andrews | d6ee73f | 2011-10-30 19:40:38 -0700 | [diff] [blame] | 118 | (cd $CACHEDIR && wget -N http://uec-images.ubuntu.com/$DIST_NAME/current/$UEC_NAME-disk1.img) | 
| Dean Troyer | e753fdf | 2011-10-25 15:45:26 -0500 | [diff] [blame] | 119 | fi | 
|  | 120 |  | 
|  | 121 | if [ "$FORMAT" = "qcow2" ]; then | 
|  | 122 | # Just copy image | 
| Dean Troyer | 71745fe | 2011-10-31 16:59:02 -0500 | [diff] [blame] | 123 | cp -p $CACHEDIR/$UEC_NAME-disk1.img $IMG_FILE_TMP | 
| Dean Troyer | e753fdf | 2011-10-25 15:45:26 -0500 | [diff] [blame] | 124 | else | 
|  | 125 | # Convert image | 
| Dean Troyer | 71745fe | 2011-10-31 16:59:02 -0500 | [diff] [blame] | 126 | qemu-img convert -O $QFORMAT $CACHEDIR/$UEC_NAME-disk1.img $IMG_FILE_TMP | 
| Dean Troyer | e753fdf | 2011-10-25 15:45:26 -0500 | [diff] [blame] | 127 | fi | 
|  | 128 |  | 
|  | 129 | # Resize the image if necessary | 
|  | 130 | if [ $ROOTSIZE -gt 2000 ]; then | 
|  | 131 | # Resize the container | 
| Dean Troyer | 71745fe | 2011-10-31 16:59:02 -0500 | [diff] [blame] | 132 | qemu-img resize $IMG_FILE_TMP +$((ROOTSIZE - 2000))M | 
| Dean Troyer | ae60556 | 2011-10-26 12:35:22 -0500 | [diff] [blame] | 133 | fi | 
| Dean Troyer | e753fdf | 2011-10-25 15:45:26 -0500 | [diff] [blame] | 134 |  | 
| Dean Troyer | dccd6b9 | 2011-11-01 15:46:14 -0500 | [diff] [blame] | 135 | # Finds the next available NBD device | 
|  | 136 | # Exits script if error connecting or none free | 
|  | 137 | # map_nbd image | 
|  | 138 | # returns full nbd device path | 
|  | 139 | function map_nbd { | 
|  | 140 | for i in `seq 0 15`; do | 
|  | 141 | if [ ! -e /sys/block/nbd$i/pid ]; then | 
|  | 142 | NBD=/dev/nbd$i | 
|  | 143 | # Connect to nbd and wait till it is ready | 
|  | 144 | qemu-nbd -c $NBD $1 | 
|  | 145 | if ! timeout 60 sh -c "while ! [ -e ${NBD}p1 ]; do sleep 1; done"; then | 
|  | 146 | echo "Couldn't connect $NBD" | 
|  | 147 | exit 1 | 
|  | 148 | fi | 
|  | 149 | break | 
|  | 150 | fi | 
|  | 151 | done | 
|  | 152 | if [ -z "$NBD" ]; then | 
|  | 153 | echo "No free NBD slots" | 
|  | 154 | exit 1 | 
|  | 155 | fi | 
|  | 156 | echo $NBD | 
|  | 157 | } | 
|  | 158 |  | 
| Dean Troyer | 71745fe | 2011-10-31 16:59:02 -0500 | [diff] [blame] | 159 | # Set up nbd | 
|  | 160 | modprobe nbd max_part=63 | 
| Dean Troyer | dccd6b9 | 2011-11-01 15:46:14 -0500 | [diff] [blame] | 161 | NBD=`map_nbd $IMG_FILE_TMP` | 
| Dean Troyer | e753fdf | 2011-10-25 15:45:26 -0500 | [diff] [blame] | 162 |  | 
| Dean Troyer | ae60556 | 2011-10-26 12:35:22 -0500 | [diff] [blame] | 163 | # Resize partition 1 to full size of the disk image | 
|  | 164 | echo "d | 
| Dean Troyer | e753fdf | 2011-10-25 15:45:26 -0500 | [diff] [blame] | 165 | n | 
|  | 166 | p | 
|  | 167 | 1 | 
|  | 168 | 2 | 
|  | 169 |  | 
|  | 170 | t | 
|  | 171 | 83 | 
|  | 172 | a | 
|  | 173 | 1 | 
|  | 174 | w | 
|  | 175 | " | fdisk $NBD | 
| Dean Troyer | 2c1a2d5 | 2011-10-31 15:32:54 -0500 | [diff] [blame] | 176 | e2fsck -f -p ${NBD}p1 | 
| Dean Troyer | ae60556 | 2011-10-26 12:35:22 -0500 | [diff] [blame] | 177 | resize2fs ${NBD}p1 | 
| Dean Troyer | e753fdf | 2011-10-25 15:45:26 -0500 | [diff] [blame] | 178 |  | 
| Dean Troyer | c2ddc97 | 2011-10-31 15:04:27 -0500 | [diff] [blame] | 179 | # Do some preliminary installs | 
|  | 180 | MNTDIR=`mktemp -d mntXXXXXXXX` | 
|  | 181 | mount -t ext4 ${NBD}p1 $MNTDIR | 
|  | 182 |  | 
|  | 183 | # Install our required packages | 
|  | 184 | cp -p files/sources.list $MNTDIR/etc/apt/sources.list | 
| Dean Troyer | 2dfdbc9 | 2011-10-31 15:46:49 -0500 | [diff] [blame] | 185 | sed -e "s,%DIST%,$DIST_NAME,g" -i $MNTDIR/etc/apt/sources.list | 
| Dean Troyer | c2ddc97 | 2011-10-31 15:04:27 -0500 | [diff] [blame] | 186 | cp -p /etc/resolv.conf $MNTDIR/etc/resolv.conf | 
|  | 187 | chroot $MNTDIR apt-get update | 
|  | 188 | chroot $MNTDIR apt-get install -y $MIN_PKGS | 
|  | 189 | rm -f $MNTDIR/etc/resolv.conf | 
|  | 190 |  | 
|  | 191 | umount $MNTDIR | 
|  | 192 | rmdir $MNTDIR | 
| Dean Troyer | ae60556 | 2011-10-26 12:35:22 -0500 | [diff] [blame] | 193 | qemu-nbd -d $NBD | 
| Dean Troyer | 55c0273 | 2011-11-01 17:44:03 -0500 | [diff] [blame] | 194 | NBD="" | 
| Dean Troyer | 71745fe | 2011-10-31 16:59:02 -0500 | [diff] [blame] | 195 |  | 
|  | 196 | mv $IMG_FILE_TMP $IMG_FILE |