implement support for qcow2 images

This commit is contained in:
parazyd 2017-02-15 14:49:02 +01:00
parent 3165af5c09
commit a2a1ecd2c5
No known key found for this signature in database
GPG Key ID: F0CB28FCF78637DE
3 changed files with 75 additions and 27 deletions

View File

@ -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

View File

@ -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
}

View File

@ -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