From a2a1ecd2c58ba86b37057e7805e5b3cc64acf872 Mon Sep 17 00:00:00 2001 From: parazyd Date: Wed, 15 Feb 2017 14:49:02 +0100 Subject: [PATCH] implement support for qcow2 images --- zlibs/helpers | 33 +++++++++++++++++++++++---------- zlibs/imaging | 25 +++++++++++++++++++++++++ zlibs/vm | 44 +++++++++++++++++++++++++++----------------- 3 files changed, 75 insertions(+), 27 deletions(-) diff --git a/zlibs/helpers b/zlibs/helpers index 857b559..d94d056 100644 --- a/zlibs/helpers +++ b/zlibs/helpers @@ -67,21 +67,21 @@ build_iso_dist() { build_vagrant_dist() { fn build_vagrant_dist - req=(workdir strapdir os arch) + req=(workdir strapdir os arch imageformat) ckreq || return 1 notice "building complete vagrant image" - image_raw_as_strapdir || zerr - bootstrap_complete_base || zerr - vm_inject_overrides || zerr + image_${imageformat}_as_strapdir || zerr + bootstrap_complete_base || zerr + vm_inject_overrides || zerr [[ $BLEND = 1 ]] && blend_preinst || zerr - vm_setup_grub || zerr + vm_setup_grub || zerr [[ $BLEND = 1 ]] && blend_postinst || zerr - vm_umount_raw || zerr - vm_vbox_setup || zerr - vm_vagrant_package || zerr - vm_pack_dist || zerr + vm_umount_${imageformat} || zerr + vm_vbox_setup || zerr + vm_vagrant_package || zerr + vm_pack_dist || zerr } getfield() { @@ -127,6 +127,19 @@ findloopmapp() { silly sleep 4 } +findfreenbd() { + fn findfreenbd + + notice "looking for a free /dev/nbd" + + for i in $(seq 0 8); do + grep "^/dev/nbd${i}" /proc/mounts >/dev/null || { + print "/dev/nbd${i}" + break + } + done +} + qemu_install_user() { fn qemu_install_user req=(qemu_bin strapdir) @@ -231,7 +244,7 @@ chroot-script() { *) local script="$1" notice "chrooting to execute $script..." - sudochmod +x "$strapdir/$script" || zerr + sudo chmod +x "$strapdir/$script" || zerr sudo -E chroot "$strapdir" "/$script" || zerr ;; esac diff --git a/zlibs/imaging b/zlibs/imaging index 6b05777..28ab361 100644 --- a/zlibs/imaging +++ b/zlibs/imaging @@ -170,3 +170,28 @@ image_raw_as_strapdir() { popd } + +image_qcow2_as_strapdir() { + fn image_qcow2_as_strapdir + req=(workdir strapdir size) + ckreq || return 1 + + pushd "$workdir" + + notice "creating qcow2 image of $size MB" + rm -f base.qcow2 + qemu-img create -f qcow2 base.qcow2 ${size}M || zerr + sudo modprobe nbd max_part=8 || zerr + loopdevice="$(findfreenbd)" + [ -n "$loopdevice" ] || zerr + sudo qemu-nbd --connect=${loopdevice} base.qcow2 || zerr + notice "partitioning" + sudo parted ${loopdevice} mktable msdos || zerr + sudo parted ${loopdevice} mkpart primary '0%' '100%' || zerr + sudo mkfs.ext4 ${loopdevice}p1 || zerr + + notice "mounting qcow2 image to strapdir" + sudo mount ${loopdevice}p1 $strapdir || zerr + + popd +} diff --git a/zlibs/vm b/zlibs/vm index 22bbd78..1f6bcf9 100644 --- a/zlibs/vm +++ b/zlibs/vm @@ -63,41 +63,49 @@ EOF devprocsys umount $strapdir || zerr } -vm_umount_raw() { - fn vm_umount_raw - req=(strapdir loopdevice) +vm_umount_${imageformat}() { + fn vm_umount_${imageformat} + req=(strapdir loopdevice imageformat) ckreq || return 1 - notice "remounting raw image" + notice "remounting ${imageformat} image" sudo mount -o remount,ro $strapdir || zerr sync notice "flushing bytes and buffers" sudo blockdev --flushbufs $loopdevice || zerr sudo python -c 'import os; os.fsync(open("'${loopdevice}'", "r+b"))' || zerr - notice "unmounting raw image from strapdir" - silly sleep 1 + notice "unmounting ${imageformat} image from strapdir" sudo umount $strapdir || zerr + silly sleep 1 sudo rmdir $strapdir || zerr - sync - silly sleep 1 notice "cleaning up" - sudo losetup -d ${loopdevice} || zerr + case "$imageformat" in + raw) + sudo losetup -d ${loopdevice} || zerr + ;; + qcow2) + sudo qemu-nbd --disconnect ${loopdevice} || zerr + ;; + *) + zerr + ;; + esac silly sleep 1 } vm_vbox_setup() { fn vm_vbox_setup - req=(workdir) + req=(workdir imageformat) ckreq || return 1 - notice "converting raw image to vdi" + notice "converting ${imageformat} image to vdi" pushd $workdir - sudo qemu-img convert -f raw -O vdi base.raw base.vdi || zerr - sudo chown $USER base.vdi || zerr + qemu-img convert -f ${imageformat} -O vdi base.${imageformat} base.vdi || zerr + #sudo chown $USER base.vdi || zerr VBoxManage modifyhd base.vdi --type immutable --compact || zerr - act "removing old raw image" - rm -f base.raw + #act "removing old raw image" + #rm -f base.raw vmname="${os}-${release}-prevagrant" notice "importing base.vdi to a VBox" @@ -153,15 +161,17 @@ EOF vm_pack_dist() { fn vm_pack_dist - req=(workdir) + req=(workdir imageformat) ckreq || return 1 notice "packing up dist" mkdir -p $R/dist mv $workdir/${vm_name}.box $R/dist - act "calculating sha256sum..." + mv $workdir/base.${imageformat} $R/dist/${vm_name}.${imageformat} + act "calculating sha256 sums..." silly sha256sum $R/dist/${vm_name}.box > $R/dist/${vm_name}.box.sha + sha256sum $R/dist/${vm_name}.${imageformat} > $R/dist/${vm_name}.${imageformat}.sha # TODO: XXX: cleanup vagrant/virtualbox leftovers notice "done!" ls -1 $R/dist