From e931fbeaa5ac32ef5f73ae833f7649cd44aee845 Mon Sep 17 00:00:00 2001 From: Ben Howard Date: Thu, 12 Nov 2015 17:21:33 -0700 Subject: [PATCH] ubuntu-cpc: move vmdk creation code into common funtion to support Vagrant Box builds --- live-build/ubuntu-cpc/functions | 63 +++++++++++++++++++ .../ubuntu-cpc/hooks/040-vmdk-image.binary | 62 +----------------- .../ubuntu-cpc/hooks/042-vagrant.binary | 5 +- 3 files changed, 70 insertions(+), 60 deletions(-) diff --git a/live-build/ubuntu-cpc/functions b/live-build/ubuntu-cpc/functions index 3c082ff2..513cc9e8 100644 --- a/live-build/ubuntu-cpc/functions +++ b/live-build/ubuntu-cpc/functions @@ -59,3 +59,66 @@ umount_partition() { umount "$mountpoint/dev" umount "$mountpoint" } + +modify_vmdk_header() { + # Modify the VMDK headers so that both VirtualBox _and_ VMware can + # read the vmdk and import them. The vodoo here is _not_ documented + # anywhere....so this will have to do. + + vmdk_name="${1}" + descriptor=$(mktemp) + newdescriptor=$(mktemp) + + # Extract the vmdk header for manipulation + dd if="${vmdk_name}" of="${descriptor}" bs=1 skip=512 count=1024 + + # The sed lines below is where the magic is. Specifically: + # ddb.toolsVersion: sets the open-vm-tools so that VMware shows + # the tooling as current + # ddb.virtualHWVersion: set the version to 7, which covers most + # current versions of VMware + # createType: make sure its set to stream Optimized + # remove the vmdk-stream-converter comment and replace with + # # Disk DescriptorFile. This is needed for Virtualbox + # remove the comments from vmdk-stream-converter which causes + # VirtualBox and others to fail VMDK validation + + sed -e 's|ddb.comment.*|ddb.toolsVersion = "2147483647"|' \ + -e 's|ddb.virtualHWVersion.*|ddb.virtualHWVersion = "7"|' \ + -e 's|createType.*|createType="streamOptimized"|' \ + -e 's|# Description file.*|# Disk DescriptorFile|' \ + -e '/# Believe.*/d' \ + -e '/# Indicates no parent/d' \ + "${descriptor}" > "${new_descriptor}" + + # The header is cannot be bigger than 1024 + expr $(stat --format=%s ${new_descriptor}) \< 1024 || { + echo "descriptor is too large, VMDK will be invalid!"; exit 1; } + + # Overwrite the vmdk header with our new, modified one + dd conv=notrunc,nocreat \ + if="${new_descriptor}" of="${vmdk_name}" \ + bs=1 seek=512 count=1024 + + rm ${descriptor} ${new_descriptor} +} + +create_vmdk() { + src="$1" + destination="$2" + size="${3:-102400}" + + apt-get install -qqy qemu-utils vmdk-stream-converter + streamconverter="/usr/share/pyshared/VMDKstream.py" + scratch_d=$(mktemp -d) + + cp ${src} ${scratch_d}/resize.img + qemu-img resize ${scratch_d}/resize.img ${size}M + python ${streamconverter} ${scratch_d}/resize.img "${destination}" + modify_vmdk_header "${destination}" + qemu-img info "${destination}" + + rm -rf ${scratch_d} +} + + diff --git a/live-build/ubuntu-cpc/hooks/040-vmdk-image.binary b/live-build/ubuntu-cpc/hooks/040-vmdk-image.binary index 51d91768..2fc48065 100755 --- a/live-build/ubuntu-cpc/hooks/040-vmdk-image.binary +++ b/live-build/ubuntu-cpc/hooks/040-vmdk-image.binary @@ -18,66 +18,10 @@ case ${architecture} in exit 0;; esac -apt-get install -qqy qemu-utils vmdk-stream-converter +. /build/config/functions -streamconverter="/usr/share/pyshared/VMDKstream.py" - -# Lets be safe about this -scratch_d=$(mktemp -d) -trap "rm -rf ${scratch_d}" EXIT - -modify_vmdk_header() { - # Modify the VMDK headers so that both VirtualBox _and_ VMware can - # read the vmdk and import them. The vodoo here is _not_ documented - # anywhere....so this will have to do. - - vmdk_name="${1}" - - # Extract the vmdk header for manipulation - dd if="${vmdk_name}" of=descriptor.txt bs=1 skip=512 count=1024 - - # The sed lines below is where the magic is. Specifically: - # ddb.toolsVersion: sets the open-vm-tools so that VMware shows - # the tooling as current - # ddb.virtualHWVersion: set the version to 7, which covers most - # current versions of VMware - # createType: make sure its set to stream Optimized - # remove the vmdk-stream-converter comment and replace with - # # Disk DescriptorFile. This is needed for Virtualbox - # remove the comments from vmdk-stream-converter which causes - # VirtualBox and others to fail VMDK validation - - sed -e 's|ddb.comment.*|ddb.toolsVersion = "2147483647"|' \ - -e 's|ddb.virtualHWVersion.*|ddb.virtualHWVersion = "7"|' \ - -e 's|createType.*|createType="streamOptimized"|' \ - -e 's|# Description file.*|# Disk DescriptorFile|' \ - -e '/# Believe.*/d' \ - -e '/# Indicates no parent/d' \ - descriptor.txt > new_descriptor.txt - - # The header is cannot be bigger than 1024 - expr $(stat --format=%s new_descriptor.txt) \< 1024 || { - echo "descriptor is too large, VMDK will be invalid!"; exit 1; } - - # Overwrite the vmdk header with our new, modified one - dd conv=notrunc,nocreat \ - if=new_descriptor.txt of="${vmdk_name}" \ - bs=1 seek=512 count=1024 -} - -convert_image() { - src="$1" - destination="$2" - - cp ${src} ${scratch_d}/resize.img - qemu-img resize ${scratch_d}/resize.img 10G - python ${streamconverter} ${scratch_d}/resize.img "${destination}" - modify_vmdk_header "${destination}" - qemu-img info "${destination}" -} - -convert_image binary/boot/disk.ext4 livecd.ubuntu-cpc.disk1.vmdk +create_vmdk binary/boot/disk.ext4 livecd.ubuntu-cpc.disk1.vmdk if [ -e binary/boot/disk-uefi.ext4 ]; then - convert_image binary/boot/disk-uefi.ext4 livecd.ubuntu-cpc.uefi.vmdk + create_vmdk binary/boot/disk-uefi.ext4 livecd.ubuntu-cpc.uefi.vmdk fi diff --git a/live-build/ubuntu-cpc/hooks/042-vagrant.binary b/live-build/ubuntu-cpc/hooks/042-vagrant.binary index 6c185881..fa53778a 100755 --- a/live-build/ubuntu-cpc/hooks/042-vagrant.binary +++ b/live-build/ubuntu-cpc/hooks/042-vagrant.binary @@ -28,6 +28,8 @@ if [ ! -e ${base_vmdk} ]; then exit 0 fi +. /build/config/functions + # Virtualbox is needed for making a small VMDK apt-get -qqy install genisoimage qemu-utils @@ -83,12 +85,13 @@ genisoimage \ -output ${seed_d}/seed.iso \ -volid cidata \ -joliet -rock \ + -input-charset utf-8 \ ${seed_d}/user-data \ ${seed_d}/meta-data \ ${seed_d}/bloat_file # Make a VMDK out of the seed file. -qemu-img convert -O vmdk ${seed_d}/seed.iso ${cdrom_vmdk_f} +create_vmdk ${seed_d}/seed.iso ${cdrom_vmdk_f} ### END Create ConfigDrive ##########################