azure.sh: don't install waagent from my depot
[projects/azure-image.git] / azure.sh
1 #!/bin/bash
2 # Copyright (c) 2013 Hupstream
3 # Author Arnaud Patard <apatard@husptream.com>
4 #
5 # This program is free software; you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License version 3 as
7 # published by the Free Software Foundation.
8
9 dist=sid
10 deb_mirror=http://ftp.debian.org/debian
11 DEF_LANG="en_US.UTF-8 UTF-8"
12 ser_port=ttyS0
13 KEYID=0x4D3B3507
14 KEYSERVER=hkp://subkeys.pgp.net
15 if [ $dist != "sid" ]; then
16         REPO="deb http://contrib.hupstream.com/azure/debian/repo/ $dist main"
17 fi
18
19 if [ $# -ne 2 ]; then
20         echo "$0 <imagefile (no extension)> <size in M>"
21         exit 1
22 fi
23
24 image=$1
25 vhd=${image}.vhd
26 image=${image}.img
27 size=$2
28
29 if [ $size -lt 600 ]; then
30         # trial and error min size calculation lead to this
31         echo "Size should be more than 600MB"
32         exit 1
33 fi
34
35 if [ `uname -m` != x86_64 ]; then
36         echo "Should be run on 64bit"
37         exit 1
38 fi
39
40 for pkg in qemu-utils debootstrap; do
41         dpkg-query -s $pkg >&/dev/null
42         if [ $? -ne 0 ]; then
43                 echo "Please install $pkg"
44                 exit 1
45         fi
46 done
47
48 for cmd in chroot cp losetup mkfs.ext4 mount umount debootstrap; do
49         sudo -l|grep -q $cmd
50         if [ $? -ne 0 ]; then
51                 echo "Please configure sudo to allow to run $cmd"
52                 exit 1
53         fi
54 done
55
56 mountpoint=`mktemp -d`
57
58 # make sure that the size is aligned on chs to avoid any troubles
59 cyl=$((($size*1024*1024)/(512*63*255)))
60 size=$(($cyl*255*63*512))
61
62 qemu-img create -f raw $image $size
63 /sbin/sfdisk -D $image <<EOF
64 ,,L,*
65 ;
66 ;
67 ;
68 EOF
69
70 # assume always 1rst part at 63
71 sudo /sbin/losetup -f -o $((63*512)) $image
72 if [ $? -ne 0 ]; then
73         echo "losetup failed"
74         rmdir $mountpoint
75         exit 1
76 fi
77
78 loopback=`sudo /sbin/losetup -j $image|cut -d':' -f1`
79 sudo /sbin/mkfs.ext4 $loopback
80
81 eval `/sbin/blkid -p -O $((512*63)) $image|cut -d ':' -f2`
82 sudo mount $loopback $mountpoint
83
84 sudo /usr/sbin/debootstrap --arch=amd64 --include=grub-pc,linux-image-amd64,gnupg $dist $mountpoint $deb_mirror
85 if [ $? -ne 0 ]; then
86         echo "debootstrap failed"
87         sudo umount $mountpoint
88         sudo /sbin/losetup -d $loopback
89         rmdir $mountpoint
90         exit 1
91 fi
92
93 dummy=`mktemp`
94
95 cat > $dummy <<EOF
96 UUID=$UUID /               ext4    errors=remount-ro 0       1
97 EOF
98 sudo cp $dummy ${mountpoint}/etc/fstab
99
100 cat > $dummy <<EOF
101 deb $deb_mirror $dist main
102 EOF
103 sudo cp $dummy ${mountpoint}/etc/apt/sources.list
104 sudo /usr/sbin/chroot $mountpoint apt-get update
105
106 cat > $dummy <<EOF
107 $DEF_LANG
108 EOF
109 sudo cp $dummy ${mountpoint}/etc/locale.gen
110 sudo /usr/sbin/chroot $mountpoint apt-get -y install locales
111
112 sudo /sbin/losetup -f $image
113 loopback2=`sudo /sbin/losetup -j $image|grep -v offset|cut -d':' -f1`
114
115 sudo /usr/sbin/grub-install --root-directory=$mountpoint --no-floppy --modules 'part_msdos ext2' $loopback2
116 if [ $? -ne 0 ]; then
117         echo "failed to install grub"
118         sudo umount $mountpoint
119         sudo /sbin/losetup -d $loopback2
120         sudo /sbin/losetup -d $loopback
121         rmdir $mountpoint
122         rm $dummy
123         exit 1
124 fi
125
126 sudo /usr/sbin/chroot $mountpoint sed -i -e 's!^#GRUB_TERMINAL=console$!GRUB_TERMINAL=serial!' /etc/default/grub
127 sudo /usr/sbin/chroot $mountpoint sed -i -e 's!GRUB_CMDLINE_LINUX_DEFAULT="quiet"!GRUB_CMDLINE_LINUX_DEFAULT="quiet ttyS0,115200 earlyprintk"!' /etc/default/grub
128 sudo /usr/sbin/chroot $mountpoint grub-mkconfig -o /boot/grub/grub.cfg
129
130 krnl=`find ${mountpoint}/boot/ -name 'vmlinuz*' -printf '%f\n'`
131 initrd=`find ${mountpoint}/boot/ -name 'initrd.img*' -printf '%f\n'`
132
133 if [ "x$krnl" = "x" -o "x$initrd" = "x" ]; then
134         echo "No kernel or initrd found ?!"
135         sudo umount $mountpoint
136         sudo /sbin/losetup -d $loopback2
137         sudo /sbin/losetup -d $loopback
138         rmdir $mountpoint
139         rm $dummy
140         exit 1
141 fi
142
143 sudo chroot $mountpoint lsinitramfs /boot/$initrd |grep -q storvsc
144 if [ $? -ne 0 ]; then
145         echo "invalid initrd created: no storage driver"
146         sudo umount $mountpoint
147         sudo /sbin/losetup -d $loopback2
148         sudo /sbin/losetup -d $loopback
149         rmdir $mountpoint
150         rm $dummy
151         exit 1
152 fi
153
154 # grub installation / configuration doesn't like being on a loopback
155 # for instance, the 10_linux script will exit 0 if /dev/loop0 is used
156 # so create an entry by hand. It's ok to loose it as next call
157 # will be from the VM.
158 cat ${mountpoint}/boot/grub/grub.cfg > $dummy
159 cat >> $dummy <<EOF
160
161 menuentry 'Debian GNU/Linux' --class debian --class gnu-linux --class gnu --class os {
162         insmod gzio
163         insmod part_msdos
164         insmod ext2
165         set root='(hd0,msdos1)'
166         search --no-floppy --fs-uuid --set=root $UUID
167         echo    'Loading kernel'
168         linux   /boot/$krnl root=UUID=$UUID console=${ser_port},115200
169         echo    'Loading initrd'
170         initrd  /boot/$initrd
171 }
172
173 EOF
174
175 sudo cp $dummy ${mountpoint}/boot/grub/grub.cfg
176
177 cat ${mountpoint}/etc/inittab > $dummy
178 cat >> $dummy <<EOF
179 T0:23:respawn:/sbin/getty -L $ser_port 115200 vt100
180 EOF
181
182 sudo cp $dummy ${mountpoint}/etc/inittab
183
184 cat > $dummy <<EOF
185 # This file describes the network interfaces available on your system
186 # and how to activate them. For more information, see interfaces(5).
187
188 # The loopback network interface
189 auto lo
190 iface lo inet loopback
191
192 # The primary network interface
193 allow-hotplug eth0
194 iface eth0 inet dhcp
195 EOF
196 sudo cp $dummy ${mountpoint}/etc/network/interfaces
197
198
199 #echo "root:root" | sudo chroot $mountpoint chpasswd
200
201 if [ $dist != "sid" ]; then
202         sudo /usr/sbin/chroot $mountpoint gpg --keyserver $KEYSERVER --recv-keys $KEYID
203         if [ $? -ne 0 ]; then
204                 echo "Can't get gpg key. Check network and gnupg configuration"
205                 sudo umount $mountpoint
206                 sudo /sbin/losetup -d $loopback2
207                 sudo /sbin/losetup -d $loopback
208                 rmdir $mountpoint
209                 rm $dummy
210                 exit 1
211         fi
212
213         sudo /usr/sbin/chroot $mountpoint sh -c "gpg -a --export $KEYID | apt-key add -"
214
215         cat > $dummy <<EOF
216 $REPO
217 EOF
218         sudo cp $dummy ${mountpoint}/etc/apt/sources.list.d/waagent.list
219
220         sudo /usr/sbin/chroot $mountpoint apt-get update
221 fi
222
223 sudo /usr/sbin/chroot $mountpoint apt-get install -y waagent
224 if [ $? -ne 0 ]; then
225         echo "Can't install waagent"
226         sudo umount $mountpoint
227         sudo /sbin/losetup -d $loopback2
228         sudo /sbin/losetup -d $loopback
229         rmdir $mountpoint
230         rm $dummy
231         exit 1
232 fi
233
234 echo y | sudo /usr/sbin/chroot $mountpoint waagent -deprovision
235 if [ $? -ne 0 ]; then
236         echo "Failed to deprovision"
237         sudo umount $mountpoint
238         sudo /sbin/losetup -d $loopback2
239         sudo /sbin/losetup -d $loopback
240         rmdir $mountpoint
241         rm $dummy
242         exit 1
243 fi
244
245 sudo /usr/sbin/chroot $mountpoint apt-get clean
246
247 sudo umount $mountpoint
248 sudo /sbin/losetup -d $loopback2
249 sudo /sbin/losetup -d $loopback
250 rm $dummy
251 rmdir $mountpoint
252
253 # resize to avoid the "The size must be a whole number (in MBs)." error with
254 # azure node tool
255 roundedsize=$((($size/(1024*1024)+1)*(1024*1024)))
256 qemu-img resize $image $roundedsize
257 # by default create dynamic vhd so specify format
258 qemu-img convert -o subformat=fixed -O vpc $image $vhd
259 rm $image
260 echo $vhd created