Address races in NBD and images
| ... | ... |
@@ -229,15 +229,8 @@ EOF |
| 229 | 229 |
ROOTFS=$VM_DIR/root |
| 230 | 230 |
mkdir -p $ROOTFS |
| 231 | 231 |
|
| 232 |
-# Make sure we have nbd-ness |
|
| 233 |
-modprobe nbd max_part=63 |
|
| 234 |
- |
|
| 235 |
-# Which NBD device to use? |
|
| 236 |
-NBD=${NBD:-/dev/nbd$GUEST_NETWORK}
|
|
| 237 |
- |
|
| 238 | 232 |
# Clean up from previous runs |
| 239 | 233 |
umount $ROOTFS || echo 'ok' |
| 240 |
-qemu-nbd -d $NBD || echo 'ok' |
|
| 241 | 234 |
|
| 242 | 235 |
# Clean up old runs |
| 243 | 236 |
cd $VM_DIR |
| ... | ... |
@@ -246,12 +239,27 @@ rm -f $VM_DIR/disk |
| 246 | 246 |
# Create our instance fs |
| 247 | 247 |
qemu-img create -f qcow2 -b $VM_IMAGE disk |
| 248 | 248 |
|
| 249 |
-# Connect our nbd and wait till it is mountable |
|
| 250 |
-qemu-nbd -c $NBD disk |
|
| 251 |
-if ! timeout 60 sh -c "while ! [ -e ${NBD}p1 ]; do sleep 1; done"; then
|
|
| 252 |
- echo "Couldn't connect $NBD" |
|
| 249 |
+# Make sure we have nbd-ness |
|
| 250 |
+modprobe nbd max_part=63 |
|
| 251 |
+ |
|
| 252 |
+# Set up nbd |
|
| 253 |
+for i in `seq 0 15`; do |
|
| 254 |
+ if [ ! -e /sys/block/nbd$i/pid ]; then |
|
| 255 |
+ NBD=/dev/nbd$i |
|
| 256 |
+ # Connect to nbd and wait till it is ready |
|
| 257 |
+ qemu-nbd -c $NBD disk |
|
| 258 |
+ if ! timeout 60 sh -c "while ! [ -e ${NBD}p1 ]; do sleep 1; done"; then
|
|
| 259 |
+ echo "Couldn't connect $NBD" |
|
| 260 |
+ exit 1 |
|
| 261 |
+ fi |
|
| 262 |
+ break |
|
| 263 |
+ fi |
|
| 264 |
+done |
|
| 265 |
+if [ -z "$NBD" ]; then |
|
| 266 |
+ echo "No free NBD slots" |
|
| 253 | 267 |
exit 1 |
| 254 | 268 |
fi |
| 269 |
+NBD_DEV=`basename $NBD` |
|
| 255 | 270 |
|
| 256 | 271 |
# Mount the instance |
| 257 | 272 |
mount ${NBD}p1 $ROOTFS
|
| ... | ... |
@@ -344,9 +352,6 @@ echo "export PS1='${debian_chroot:+($debian_chroot)}\\u@\\H:\\w\\$ '" >> $ROOTFS
|
| 344 | 344 |
# Give stack ownership over $DEST so it may do the work needed |
| 345 | 345 |
chroot $ROOTFS chown -R stack $DEST |
| 346 | 346 |
|
| 347 |
-# GRUB 2 wants to see /dev |
|
| 348 |
-mount -o bind /dev $ROOTFS/dev |
|
| 349 |
- |
|
| 350 | 347 |
# Set the hostname |
| 351 | 348 |
echo $GUEST_NAME > $ROOTFS/etc/hostname |
| 352 | 349 |
|
| ... | ... |
@@ -355,6 +360,9 @@ if ! grep -q $GUEST_NAME $ROOTFS/etc/hosts; then |
| 355 | 355 |
echo "$GUEST_IP $GUEST_NAME" >> $ROOTFS/etc/hosts |
| 356 | 356 |
fi |
| 357 | 357 |
|
| 358 |
+# GRUB 2 wants to see /dev |
|
| 359 |
+mount -o bind /dev $ROOTFS/dev |
|
| 360 |
+ |
|
| 358 | 361 |
# Change boot params so that we get a console log |
| 359 | 362 |
G_DEV_UUID=`blkid -t LABEL=cloudimg-rootfs -s UUID -o value | head -1` |
| 360 | 363 |
sed -e "s/GRUB_TIMEOUT=.*$/GRUB_TIMEOUT=3/" -i $ROOTFS/etc/default/grub |
| ... | ... |
@@ -51,6 +51,7 @@ fi |
| 51 | 51 |
# Default args |
| 52 | 52 |
DIST_NAME=$1 |
| 53 | 53 |
IMG_FILE=$2 |
| 54 |
+IMG_FILE_TMP=`mktemp $IMG_FILE.XXXXXX` |
|
| 54 | 55 |
|
| 55 | 56 |
case $FORMAT in |
| 56 | 57 |
kvm|qcow2) FORMAT=qcow2 |
| ... | ... |
@@ -88,11 +89,6 @@ case $DIST_NAME in |
| 88 | 88 |
;; |
| 89 | 89 |
esac |
| 90 | 90 |
|
| 91 |
-# Set up nbd |
|
| 92 |
-modprobe nbd max_part=63 |
|
| 93 |
-NBD=${NBD:-/dev/nbd9}
|
|
| 94 |
-NBD_DEV=`basename $NBD` |
|
| 95 |
- |
|
| 96 | 91 |
# Prepare the base image |
| 97 | 92 |
|
| 98 | 93 |
# Get the UEC image |
| ... | ... |
@@ -103,24 +99,37 @@ fi |
| 103 | 103 |
|
| 104 | 104 |
if [ "$FORMAT" = "qcow2" ]; then |
| 105 | 105 |
# Just copy image |
| 106 |
- cp -p $CACHEDIR/$UEC_NAME-disk1.img $IMG_FILE |
|
| 106 |
+ cp -p $CACHEDIR/$UEC_NAME-disk1.img $IMG_FILE_TMP |
|
| 107 | 107 |
else |
| 108 | 108 |
# Convert image |
| 109 |
- qemu-img convert -O $QFORMAT $CACHEDIR/$UEC_NAME-disk1.img $IMG_FILE |
|
| 109 |
+ qemu-img convert -O $QFORMAT $CACHEDIR/$UEC_NAME-disk1.img $IMG_FILE_TMP |
|
| 110 | 110 |
fi |
| 111 | 111 |
|
| 112 | 112 |
# Resize the image if necessary |
| 113 | 113 |
if [ $ROOTSIZE -gt 2000 ]; then |
| 114 | 114 |
# Resize the container |
| 115 |
- qemu-img resize $IMG_FILE +$((ROOTSIZE - 2000))M |
|
| 115 |
+ qemu-img resize $IMG_FILE_TMP +$((ROOTSIZE - 2000))M |
|
| 116 | 116 |
fi |
| 117 | 117 |
|
| 118 |
-# Connect to nbd and wait till it is ready |
|
| 119 |
-qemu-nbd -c $NBD $IMG_FILE |
|
| 120 |
-if ! timeout 60 sh -c "while ! [ -e /sys/block/$NBD_DEV/pid ]; do sleep 1; done"; then |
|
| 121 |
-echo "Couldn't connect $NBD" |
|
| 118 |
+# Set up nbd |
|
| 119 |
+modprobe nbd max_part=63 |
|
| 120 |
+for i in `seq 1 15`; do |
|
| 121 |
+ if [ ! -e /sys/block/nbd$i/pid ]; then |
|
| 122 |
+ NBD=/dev/nbd$i |
|
| 123 |
+ # Connect to nbd and wait till it is ready |
|
| 124 |
+ qemu-nbd -c $NBD $IMG_FILE_TMP |
|
| 125 |
+ if ! timeout 60 sh -c "while ! [ -e ${NBD}p1 ]; do sleep 1; done"; then
|
|
| 126 |
+ echo "Couldn't connect $NBD" |
|
| 127 |
+ exit 1 |
|
| 128 |
+ fi |
|
| 129 |
+ break |
|
| 130 |
+ fi |
|
| 131 |
+done |
|
| 132 |
+if [ -z "$NBD" ]; then |
|
| 133 |
+ echo "No free NBD slots" |
|
| 122 | 134 |
exit 1 |
| 123 | 135 |
fi |
| 136 |
+NBD_DEV=`basename $NBD` |
|
| 124 | 137 |
|
| 125 | 138 |
# Resize partition 1 to full size of the disk image |
| 126 | 139 |
echo "d |
| ... | ... |
@@ -153,3 +162,5 @@ rm -f $MNTDIR/etc/resolv.conf |
| 153 | 153 |
umount $MNTDIR |
| 154 | 154 |
rmdir $MNTDIR |
| 155 | 155 |
qemu-nbd -d $NBD |
| 156 |
+ |
|
| 157 |
+mv $IMG_FILE_TMP $IMG_FILE |