@@ -33,6 +33,8 @@ rootfs=$1
3333name=$( echo $rootfs | sed ' s/.rootfs//' )
3434appname=$( echo $name | sed ' s/turnkey-\(.*\)-[0-9].*/\1/' )
3535
36+
37+
3638case " $appname " in
3739 canvas) loopsize_padding=786432 ;;
3840 ejabberd) loopsize_padding=524288 ;;
@@ -46,29 +48,79 @@ loopsize=$[$rootsize + $loopsize_padding]
4648
4749info " creating sparse loopback"
4850dd if=/dev/null of=$rootfs .img bs=1 seek=${loopsize} K
49- mkfs.ext4 -F -j $rootfs .img
5051
51- mkdir $rootfs .img.mount
52- mount -o loop $rootfs .img $rootfs .img.mount
52+ info " creating partition"
53+ # inspired by package openstack-debian-images
54+ PARTED=/sbin/parted
55+ AMI_NAME=$rootfs .img
56+ ${PARTED} -s ${AMI_NAME} mktable msdos
57+ ${PARTED} -s -a optimal ${AMI_NAME} mkpart primary ext3 1Mi 100%
58+ ${PARTED} -s ${AMI_NAME} set 1 boot on
59+ install-mbr ${AMI_NAME}
60+ RESULT_KPARTX=` kpartx -asv ${AMI_NAME} 2>&1 `
61+
62+ if echo " ${RESULT_KPARTX} " | grep " ^add map" ; then
63+ LOOP_DEVICE=` echo ${RESULT_KPARTX} | cut -d" " -f3`
64+ info " kpartx mounted using: ${LOOP_DEVICE} "
65+ else
66+ fatal " It seems kpartx didn't mount the image correctly: exiting."
67+ fi
68+
69+ cleanup (){
70+ error=$?
71+ [ ! -d " ${MOUNT_DIR} " ] && return
72+ echo
73+ echo " error $error , umounting $MOUNT_DIR "
74+ chroot ${MOUNT_DIR} umount /proc || true
75+ chroot ${MOUNT_DIR} umount /sys || true
76+ umount ${MOUNT_DIR}
77+ rmdir ${MOUNT_DIR}
78+ kpartx -d ${AMI_NAME}
79+ exit $error
80+ }
81+ trap " cleanup" EXIT TERM INT
82+
83+ mkfs.ext4 -F -j /dev/mapper/${LOOP_DEVICE}
84+ # No fsck because of X days without checks
85+ tune2fs -i 0 /dev/mapper/${LOOP_DEVICE}
86+
87+ MOUNT_DIR=` mktemp -d -t build-debimg.XXXXXX`
88+ mount -o loop /dev/mapper/${LOOP_DEVICE} ${MOUNT_DIR}
5389
5490info " syncing rootfs to loopback"
55- rsync -a -t -r -S -I -H $rootfs / $rootfs .img.mount
91+ rsync -a -t -r -S -I -H $rootfs / ${MOUNT_DIR}
5692
57- info " umount loopback"
58- umount -d $rootfs .img.mount
59- rmdir $rootfs .img.mount
93+ info " install extlinux"
94+ mkdir -p ${MOUNT_DIR} /boot/extlinux
95+ echo " default linux
96+ timeout 1
97+ label linux
98+ kernel /vmlinuz
99+ append initrd=/initrd.img root=/dev/vda1 biosdevname=0 net.ifnames=0 console=tty0 console=ttyS0,115200 ro" > ${MOUNT_DIR} /boot/extlinux/extlinux.conf
100+ extlinux --install ${MOUNT_DIR} /boot/extlinux
60101
61- info " setting up image directory"
62- mkdir $name
63- mv $rootfs .img $name /$name .img
64- cp $rootfs /boot/vmlinuz-* $name /$name -kernel
65- cp $rootfs /boot/initrd.img-* $name /$name -initrd
102+ info " umount loopback"
103+ umount -d ${MOUNT_DIR}
104+ rmdir ${MOUNT_DIR}
105+
106+ fsck.ext3 -f /dev/mapper/${LOOP_DEVICE} || true
107+
108+ # the next command failed once, so
109+ sync
110+ kpartx -d ${AMI_NAME}
111+
112+ info " creating qcow2 image"
113+ QCOW2_NAME=$name -openstack.qcow2
114+ QEMU_VERSION=` qemu-img --help | head -n 1 | cut -d" " -f3 | cut -d" ," -f1`
115+ if dpkg --compare-versions ${QEMU_VERSION} gt 1.0 ; then
116+ OTHER_QEMU_IMG_OPTIONS=" -o compat=0.10"
117+ else
118+ OTHER_QEMU_IMG_OPTIONS=" "
119+ fi
66120
67- info " creating $name -openstack.tar.gz"
68- tar --sparse -zcvf $name -openstack.tar.gz $name
121+ qemu-img convert -c -f raw ${AMI_NAME}${OTHER_QEMU_IMG_OPTIONS} -O qcow2 ${QCOW2_NAME}
69122
70123if [ -z " $BT_DEBUG " ]; then
71124 info " removing directory"
72125 rm -rf $name
73126fi
74-
0 commit comments