blob: 81dd97c3e765baeb2cd5d524a7f699b7c18f80da [file] [log] [blame]
Dean Troyer65cf6082011-09-16 12:22:21 -05001#!/bin/bash
2# make_image.sh - Create Ubuntu images in various formats
3#
Dean Troyer57794d42011-09-16 17:22:23 -05004# Supported formats: qcow (kvm), vmdk (vmserver), vdi (vbox), vhd (vpc), raw
Dean Troyer65cf6082011-09-16 12:22:21 -05005#
6# Requires sudo to root
7
8ROOTSIZE=${ROOTSIZE:-8192}
9SWAPSIZE=${SWAPSIZE:-1024}
Dean Troyera41f9c72011-09-29 16:35:43 -050010MIN_PKGS=${MIN_PKGS:-"apt-utils gpgv openssh-server"}
Dean Troyer65cf6082011-09-16 12:22:21 -050011
12usage() {
Dean Troyera41f9c72011-09-29 16:35:43 -050013 echo "Usage: $0 - Create Ubuntu images"
Dean Troyer65cf6082011-09-16 12:22:21 -050014 echo ""
Dean Troyera41f9c72011-09-29 16:35:43 -050015 echo "$0 [-m] [-r rootsize] [-s swapsize] release format"
16 echo "$0 -C [-m] release chrootdir"
17 echo "$0 -I [-r rootsize] [-s swapsize] chrootdir format"
18 echo ""
19 echo "-C - Create the initial chroot dir"
20 echo "-I - Create the final image from a chroot"
21 echo "-m - minimal installation"
22 echo "-r size - root fs size in MB"
23 echo "-s size - swap fs size in MB"
24 echo "release - Ubuntu release: jaunty - oneric"
25 echo "format - image format: qcow2, vmdk, vdi, vhd, xen, raw, fs"
Dean Troyer65cf6082011-09-16 12:22:21 -050026 exit 1
27}
28
Dean Troyera41f9c72011-09-29 16:35:43 -050029while getopts CIhmr:s: c; do
Dean Troyer65cf6082011-09-16 12:22:21 -050030 case $c in
Dean Troyera41f9c72011-09-29 16:35:43 -050031 C) CHROOTONLY=1
32 ;;
33 I) IMAGEONLY=1
34 ;;
Dean Troyer4dd420e2011-09-16 16:16:34 -050035 h) usage
36 ;;
Dean Troyera41f9c72011-09-29 16:35:43 -050037 m) MINIMAL=1
Dean Troyer4dd420e2011-09-16 16:16:34 -050038 ;;
39 r) ROOTSIZE=$OPTARG
40 ;;
41 s) SWAPSIZE=$OPTARG
42 ;;
Dean Troyer65cf6082011-09-16 12:22:21 -050043 esac
44done
45shift `expr $OPTIND - 1`
46
Dean Troyera4b58772011-09-29 21:30:27 -050047if [ ! "$#" -eq "2" -o -n "$CHROOTONLY" -a -n "$IMAGEONLY" ]; then
Dean Troyera41f9c72011-09-29 16:35:43 -050048 usage
49fi
50
51# Default args
Dean Troyer65cf6082011-09-16 12:22:21 -050052RELEASE=$1
53FORMAT=$2
Dean Troyera41f9c72011-09-29 16:35:43 -050054CHROOTDIR=""
55
56if [ -n "$CHROOTONLY" ]; then
57 RELEASE=$1
58 CHROOTDIR=$2
59 FORMAT="pass"
60fi
61
62if [ -n "$IMAGEONLY" ]; then
63 CHROOTDIR=$1
64 FORMAT=$2
65 RELEASE="pass"
66fi
Dean Troyer65cf6082011-09-16 12:22:21 -050067
Dean Troyer4dd420e2011-09-16 16:16:34 -050068case $FORMAT in
69 kvm|qcow2) FORMAT=qcow2
Dean Troyer57794d42011-09-16 17:22:23 -050070 QFORMAT=qcow2
71 HYPER=kvm
Dean Troyer4dd420e2011-09-16 16:16:34 -050072 ;;
73 vmserver|vmdk)
74 FORMAT=vmdk
Dean Troyer57794d42011-09-16 17:22:23 -050075 QFORMAT=vmdk
76 HYPER=vmserver
Dean Troyer4dd420e2011-09-16 16:16:34 -050077 ;;
Dean Troyer57794d42011-09-16 17:22:23 -050078 vbox|vdi) FORMAT=vdi
79 QFORMAT=vdi
80 HYPER=kvm
Dean Troyer4dd420e2011-09-16 16:16:34 -050081 ;;
Dean Troyer57794d42011-09-16 17:22:23 -050082 vhd|vpc) FORMAT=vhd
83 QFORMAT=vpc
84 HYPER=kvm
Dean Troyer4dd420e2011-09-16 16:16:34 -050085 ;;
86 xen) FORMAT=raw
Dean Troyer57794d42011-09-16 17:22:23 -050087 QFORMAT=raw
88 HYPER=xen
89 ;;
90 raw) FORMAT=raw
91 QFORMAT=raw
92 HYPER=kvm
Dean Troyer4dd420e2011-09-16 16:16:34 -050093 ;;
Dean Troyera41f9c72011-09-29 16:35:43 -050094 pass) ;;
Dean Troyer4dd420e2011-09-16 16:16:34 -050095 *) echo "Unknown format: $FORMAT"
96 usage
Dean Troyer65cf6082011-09-16 12:22:21 -050097esac
98
Dean Troyer4dd420e2011-09-16 16:16:34 -050099case $RELEASE in
100 natty) ;;
101 maverick) ;;
102 lucid) ;;
103 karmic) ;;
104 jaunty) ;;
Dean Troyera41f9c72011-09-29 16:35:43 -0500105 pass) ;;
Dean Troyer4dd420e2011-09-16 16:16:34 -0500106 *) echo "Unknown release: $RELEASE"
107 usage
108 ;;
Dean Troyer65cf6082011-09-16 12:22:21 -0500109esac
110
111# Install stuff if necessary
112if [ -z `which vmbuilder` ]; then
Dean Troyer4dd420e2011-09-16 16:16:34 -0500113 sudo apt-get install ubuntu-vm-builder
Dean Troyer65cf6082011-09-16 12:22:21 -0500114fi
115
Dean Troyera41f9c72011-09-29 16:35:43 -0500116if [ -n "$CHROOTONLY" ]; then
117 # Build a chroot directory
118 HYPER=kvm
119 if [ "$MINIMAL" = 1 ]; then
120 ARGS="--variant=minbase"
121 for i in $MIN_PKGS; do
122 ARGS="$ARGS --addpkg=$i"
123 done
124 fi
125 sudo vmbuilder $HYPER ubuntu $ARGS \
126 --suite $RELEASE \
127 --only-chroot \
128 --chroot-dir=$CHROOTDIR \
129 --overwrite \
130 --addpkg=$MIN_PKGS \
131
132 sudo cp -p files/sources.list $CHROOTDIR/etc/apt/sources.list
133 sudo chroot $CHROOTDIR apt-get update
134
135 exit 0
136fi
137
Dean Troyer65cf6082011-09-16 12:22:21 -0500138# Build the image
Dean Troyera41f9c72011-09-29 16:35:43 -0500139TMPDIR=tmp
Dean Troyer57794d42011-09-16 17:22:23 -0500140TMPDISK=`mktemp imgXXXXXXXX`
141SIZE=$[$ROOTSIZE+$SWAPSIZE+1]
Dean Troyera41f9c72011-09-29 16:35:43 -0500142dd if=/dev/null of=$TMPDISK bs=1M seek=$SIZE count=1
143
144if [ -n "$IMAGEONLY" ]; then
145 # Build image from chroot
146 sudo vmbuilder $HYPER ubuntu $ARGS \
147 --existing-chroot=$CHR \
148 --overwrite \
149 --rootsize=$ROOTSIZE \
150 --swapsize=$SWAPSIZE \
151 --tmpfs - \
152 --raw=$TMPDISK \
153
154else
155 # Do the whole shebang in one pass
156 ARGS="--variant=minbase"
157 for i in $MIN_PKGS; do
158 ARGS="$ARGS --addpkg=$i"
159 done
160 sudo vmbuilder $HYPER ubuntu $ARGS \
161 --suite $RELEASE \
162 --overwrite \
163 --rootsize=$ROOTSIZE \
164 --swapsize=$SWAPSIZE \
165 --tmpfs - \
166 --raw=$TMPDISK \
167
168fi
Dean Troyer65cf6082011-09-16 12:22:21 -0500169
Dean Troyer57794d42011-09-16 17:22:23 -0500170if [ "$FORMAT" = "raw" ]; then
Dean Troyer65cf6082011-09-16 12:22:21 -0500171 # Get image
Dean Troyer57794d42011-09-16 17:22:23 -0500172 mv $TMPDISK $RELEASE.$FORMAT
Dean Troyer65cf6082011-09-16 12:22:21 -0500173else
174 # Convert image
Dean Troyer57794d42011-09-16 17:22:23 -0500175 qemu-img convert -O $QFORMAT $TMPDISK $RELEASE.$FORMAT
176 rm $TMPDISK
Dean Troyer65cf6082011-09-16 12:22:21 -0500177fi
Dean Troyer57794d42011-09-16 17:22:23 -0500178rm -rf ubuntu-$HYPER