How do I convert a multiple-part VMDK disk image to qcow2?

In the past, I've had to convert them first to raw images, concatenate them together, and then convert the resulting raw image to qcow2:

qemu-img convert guest-s001.vmdk guest-s0001.raw
qemu-img convert guest-s002.vmdk guest-s0002.raw
qemu-img convert guest-s003.vmdk guest-s0003.raw
qemu-img convert guest-s004.vmdk guest-s0004.raw
qemu-img convert guest-s005.vmdk guest-s0005.raw
cat guest-s0001.raw guest-s0002.raw guest-s0003.raw guest-s0004.raw guest-s0005.raw > guest.raw
qemu-img convert guest.raw guest.qcow2

Don't panic if more than just the last file is smaller than 2146762752 bytes. Some VMware products create vmdk spans with different sizes. The size should match 512 times the number of sectors listed in the extent description in the main vmdk file (readable with any text editor or "cat").

It may be possible to do this all at once too, but I haven't tried this:

qemu-img convert guest-s001.vmdk guest-s002.vmdk guest-s003.vmdk guest-s004.vmdk guest-s005.vmdk guest.qcow2

Or, if they're not actually contiguous disk images, then I'm not sure what to suggest. :)

Good luck!


A quick terminal script to convert all of the images at once would be:

for i in *.vmdk; do qemu-img convert -f vmdk $i -O raw $i.raw; done
cat *.raw > tmpImage.raw
qemu-img convert tmpImage.raw finalImage.qcow2
rm *.raw

It looks like the qemu-img command has been enhanced now. I just converted a bunch of VMware multi-part images to qcow2 with the command:

$ qemu-img convert <base of the image without the S0001,2etc>.vmdk new-image.qcow2

I'm trying this to convert to raw:

find . -type f -iname <guest-name>\*-f0\*vmdk -exec qemu-img convert {} {}.raw \;

Then to catenate:

cat <guest-name>*-f0[0-1][1-9]*raw >> <guest-name>.raw

Then to convert:

qemu-img convert <guest-name>.raw -O qcow2 <guest-name>.qcow2

I could have used parallel to do this but here is one that will do the directory:

ls *s0??.vdmk | xargs -n 2 -I % qemu-img convert % %.img

And then:

cat *.img >> imagename.raw

The ls part before the pipe will print all vdmk that have at the end an s0 and two wildcards the xargs command allows it to substitute % twice as a variable to the end of the qemu-img command.


Here's a simple way to do it in one line, making use of arrays:

files=(*s0??.vmdk); qemu-img convert -f vmdk -O qcow2 ${files[@]} ${files%-s001.vmdk}.qcow2;