#
set -e
+set -x
die() {
echo "error: $1" >&2
md5sums_url=${MD5SUMS_URL:-"https://${host}/${md5sums_path}"}
imgfile="${workspace}/yardstick-${release}-server.img"
+raw_imgfile="${workspace}/yardstick-${release}-server.raw"
filename=$(basename $image_url)
# download and checksum base image, conditionally if local copy is outdated
cd $workspace
rm -f MD5SUMS # always download the checksum file to a detect stale image
wget $md5sums_url
- test -e $filename || wget -nc $image_url
+ test -e $filename || wget -nc --progress=dot:giga $image_url
grep $filename MD5SUMS | md5sum -c ||
if [ $? -ne 0 ]; then
rm $filename
- wget -nc $image_url
+ wget -nc --progress=dot:giga $image_url
grep $filename MD5SUMS | md5sum -c
fi
- cp $filename $imgfile
+ qemu-img convert $filename $raw_imgfile
cd -
}
-# mount image using qemu-nbd
+# mount image
setup() {
- modprobe nbd max_part=16
- qemu-nbd -c /dev/nbd0 $imgfile
- partprobe /dev/nbd0
-
mkdir -p $mountdir
- mount /dev/nbd0p1 $mountdir
+
+ for i in $(seq 0 9); do
+ [ -a /dev/loop$i ] || mknod -m 660 /dev/loop$i b 7 $i
+ done
+
+ loopdevice=$(kpartx -l $raw_imgfile | head -1 | cut -f1 -d ' ')
+
+ kpartx -av $raw_imgfile
+
+ # for trouble shooting
+ sleep 2
+ dmsetup ls
+ fdisk -l /dev/${loopdevice:0:5} || true
+
+ mount /dev/mapper/$loopdevice $mountdir
+ mount -t proc none $mountdir/proc
cp $cmd $mountdir/$(basename $cmd)
}
# resolv.conf does not exist in base image, pass nameserver value from host
nameserver_ip=$(grep -m 1 '^nameserver' \
/etc/resolv.conf | awk '{ print $2 '})
+
+ # prevent init scripts from running during install
+ echo $'#!/bin/sh\nexit 101' >$mountdir/usr/sbin/policy-rc.d
+ chmod a+x $mountdir/usr/sbin/policy-rc.d
+
chroot $mountdir /$(basename $cmd) $nameserver_ip
+
+ rm -rf $mountdir/usr/sbin/policy-rc.d
+
+ umount -f $mountdir/proc
+ umount $mountdir
+
+ qemu-img convert -c -o compat=0.10 -O qcow2 $raw_imgfile $imgfile
+
+ if dmsetup table | grep $loopdevice; then
+ dmsetup clear $loopdevice || true
+ fi
}
# cleanup (umount) the image
cleanup() {
# designed to be idempotent
+ mount | grep $mountdir/proc && umount $mountdir/proc
mount | grep $mountdir && umount $mountdir
- test -b /dev/nbd0 && partprobe /dev/nbd0
- pgrep qemu-nbd && qemu-nbd -d /dev/nbd0
+ if [ -f $raw_imgfile ]; then
+ kpartx -dv $raw_imgfile || true
+ fi
+ rm -f $raw_imgfile
rm -rf $mountdir
- killall qemu-nbd 2> /dev/null || true
- lsmod | grep nbd && rmmod nbd || true
+}
+
+exitcode=""
+error_trap()
+{
+ local rc=$?
+
+ set +e
+
+ if [ -z "$exitcode" ]; then
+ exitcode=$rc
+ fi
+
+ dmesg -T | tail -50
+
+ cleanup
+
+ echo "Image build failed with $exitcode"
+
+ exit $exitcode
}
main() {
cleanup
+
+ trap "error_trap" EXIT SIGTERM
+
download
setup
modify
+
+ trap - EXIT SIGTERM
cleanup
echo "the modified image is found here: $imgfile"