| ... | ... |
@@ -1,27 +1,40 @@ |
| 1 | 1 |
#!/bin/bash |
| 2 | 2 |
# make_image.sh - Create Ubuntu images in various formats |
| 3 | 3 |
# |
| 4 |
-# make_image.sh release format |
|
| 5 |
-# |
|
| 6 | 4 |
# Supported formats: qcow (kvm), vmdk (vmserver), vdi (vbox), vhd (vpc), raw |
| 7 | 5 |
# |
| 8 | 6 |
# Requires sudo to root |
| 9 | 7 |
|
| 10 | 8 |
ROOTSIZE=${ROOTSIZE:-8192}
|
| 11 | 9 |
SWAPSIZE=${SWAPSIZE:-1024}
|
| 10 |
+MIN_PKGS=${MIN_PKGS:-"apt-utils gpgv openssh-server"}
|
|
| 12 | 11 |
|
| 13 | 12 |
usage() {
|
| 14 |
- echo "$0 - Create Ubuntu images" |
|
| 13 |
+ echo "Usage: $0 - Create Ubuntu images" |
|
| 14 |
+ echo "" |
|
| 15 |
+ 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" |
|
| 15 | 18 |
echo "" |
| 16 |
- echo "$0 [-r rootsize] [-s swapsize] release format" |
|
| 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" |
|
| 17 | 26 |
exit 1 |
| 18 | 27 |
} |
| 19 | 28 |
|
| 20 |
-while getopts hm:r:s: c; do |
|
| 29 |
+while getopts CIhmr:s: c; do |
|
| 21 | 30 |
case $c in |
| 31 |
+ C) CHROOTONLY=1 |
|
| 32 |
+ ;; |
|
| 33 |
+ I) IMAGEONLY=1 |
|
| 34 |
+ ;; |
|
| 22 | 35 |
h) usage |
| 23 | 36 |
;; |
| 24 |
- m) MIRROR=$OPTARG |
|
| 37 |
+ m) MINIMAL=1 |
|
| 25 | 38 |
;; |
| 26 | 39 |
r) ROOTSIZE=$OPTARG |
| 27 | 40 |
;; |
| ... | ... |
@@ -31,8 +44,26 @@ while getopts hm:r:s: c; do |
| 31 | 31 |
done |
| 32 | 32 |
shift `expr $OPTIND - 1` |
| 33 | 33 |
|
| 34 |
+if [ ! "$#" -eq "2" -o -n $CHROOTONLY -a -n $IMAGEONLY ]; then |
|
| 35 |
+ usage |
|
| 36 |
+fi |
|
| 37 |
+ |
|
| 38 |
+# Default args |
|
| 34 | 39 |
RELEASE=$1 |
| 35 | 40 |
FORMAT=$2 |
| 41 |
+CHROOTDIR="" |
|
| 42 |
+ |
|
| 43 |
+if [ -n "$CHROOTONLY" ]; then |
|
| 44 |
+ RELEASE=$1 |
|
| 45 |
+ CHROOTDIR=$2 |
|
| 46 |
+ FORMAT="pass" |
|
| 47 |
+fi |
|
| 48 |
+ |
|
| 49 |
+if [ -n "$IMAGEONLY" ]; then |
|
| 50 |
+ CHROOTDIR=$1 |
|
| 51 |
+ FORMAT=$2 |
|
| 52 |
+ RELEASE="pass" |
|
| 53 |
+fi |
|
| 36 | 54 |
|
| 37 | 55 |
case $FORMAT in |
| 38 | 56 |
kvm|qcow2) FORMAT=qcow2 |
| ... | ... |
@@ -60,6 +91,7 @@ case $FORMAT in |
| 60 | 60 |
QFORMAT=raw |
| 61 | 61 |
HYPER=kvm |
| 62 | 62 |
;; |
| 63 |
+ pass) ;; |
|
| 63 | 64 |
*) echo "Unknown format: $FORMAT" |
| 64 | 65 |
usage |
| 65 | 66 |
esac |
| ... | ... |
@@ -70,6 +102,7 @@ case $RELEASE in |
| 70 | 70 |
lucid) ;; |
| 71 | 71 |
karmic) ;; |
| 72 | 72 |
jaunty) ;; |
| 73 |
+ pass) ;; |
|
| 73 | 74 |
*) echo "Unknown release: $RELEASE" |
| 74 | 75 |
usage |
| 75 | 76 |
;; |
| ... | ... |
@@ -80,17 +113,59 @@ if [ -z `which vmbuilder` ]; then |
| 80 | 80 |
sudo apt-get install ubuntu-vm-builder |
| 81 | 81 |
fi |
| 82 | 82 |
|
| 83 |
+if [ -n "$CHROOTONLY" ]; then |
|
| 84 |
+ # Build a chroot directory |
|
| 85 |
+ HYPER=kvm |
|
| 86 |
+ if [ "$MINIMAL" = 1 ]; then |
|
| 87 |
+ ARGS="--variant=minbase" |
|
| 88 |
+ for i in $MIN_PKGS; do |
|
| 89 |
+ ARGS="$ARGS --addpkg=$i" |
|
| 90 |
+ done |
|
| 91 |
+ fi |
|
| 92 |
+ sudo vmbuilder $HYPER ubuntu $ARGS \ |
|
| 93 |
+ --suite $RELEASE \ |
|
| 94 |
+ --only-chroot \ |
|
| 95 |
+ --chroot-dir=$CHROOTDIR \ |
|
| 96 |
+ --overwrite \ |
|
| 97 |
+ --addpkg=$MIN_PKGS \ |
|
| 98 |
+ |
|
| 99 |
+ sudo cp -p files/sources.list $CHROOTDIR/etc/apt/sources.list |
|
| 100 |
+ sudo chroot $CHROOTDIR apt-get update |
|
| 101 |
+ |
|
| 102 |
+ exit 0 |
|
| 103 |
+fi |
|
| 104 |
+ |
|
| 83 | 105 |
# Build the image |
| 106 |
+TMPDIR=tmp |
|
| 84 | 107 |
TMPDISK=`mktemp imgXXXXXXXX` |
| 85 | 108 |
SIZE=$[$ROOTSIZE+$SWAPSIZE+1] |
| 86 |
-dd if=/dev/null of=$TMPDISK bs=1M seek=$SIZE |
|
| 87 |
-sudo vmbuilder $HYPER ubuntu --suite $RELEASE \ |
|
| 88 |
- -o \ |
|
| 89 |
- --rootsize=$ROOTSIZE \ |
|
| 90 |
- --swapsize=$SWAPSIZE \ |
|
| 91 |
- --tmpfs - \ |
|
| 92 |
- --addpkg=openssh-server \ |
|
| 93 |
- --raw=$TMPDISK \ |
|
| 109 |
+dd if=/dev/null of=$TMPDISK bs=1M seek=$SIZE count=1 |
|
| 110 |
+ |
|
| 111 |
+if [ -n "$IMAGEONLY" ]; then |
|
| 112 |
+ # Build image from chroot |
|
| 113 |
+ sudo vmbuilder $HYPER ubuntu $ARGS \ |
|
| 114 |
+ --existing-chroot=$CHR \ |
|
| 115 |
+ --overwrite \ |
|
| 116 |
+ --rootsize=$ROOTSIZE \ |
|
| 117 |
+ --swapsize=$SWAPSIZE \ |
|
| 118 |
+ --tmpfs - \ |
|
| 119 |
+ --raw=$TMPDISK \ |
|
| 120 |
+ |
|
| 121 |
+else |
|
| 122 |
+ # Do the whole shebang in one pass |
|
| 123 |
+ ARGS="--variant=minbase" |
|
| 124 |
+ for i in $MIN_PKGS; do |
|
| 125 |
+ ARGS="$ARGS --addpkg=$i" |
|
| 126 |
+ done |
|
| 127 |
+ sudo vmbuilder $HYPER ubuntu $ARGS \ |
|
| 128 |
+ --suite $RELEASE \ |
|
| 129 |
+ --overwrite \ |
|
| 130 |
+ --rootsize=$ROOTSIZE \ |
|
| 131 |
+ --swapsize=$SWAPSIZE \ |
|
| 132 |
+ --tmpfs - \ |
|
| 133 |
+ --raw=$TMPDISK \ |
|
| 134 |
+ |
|
| 135 |
+fi |
|
| 94 | 136 |
|
| 95 | 137 |
if [ "$FORMAT" = "raw" ]; then |
| 96 | 138 |
# Get image |