Ubuntu – How to convert a multiple-part VMDK disk image to qcow2


I have a VMDK disk image that exists as multiple files:

2.0G guest-s001.vmdk  1.8G guest-s003.vmdk  128K guest-s005.vmdk
2.0G guest-s002.vmdk  1.7G guest-s004.vmdk  4.0K guest.vmdk

When running qemu-img to convert it to the qcow2 format, which input filename(s) should I specify? Just guest.vmdk, all of them, or something like guest-*.vmdk?

Best Answer

  • 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
  • Related Question