Today I wandered into a bit of a rat hole discovering how to export data from OpenStack Cinder volumes when you don’t have admin permissions, and I thought it was worth documenting here so I remember it for next time.
Let’s assume that you have a Cinder volume named “child1”, which is a 64gb volume originally cloned from “parent1”. parent1 is a 7.9gb VMDK, but the only way I can find to extract child1 is to convert it to a glance image and then download the entire volume as a raw. Something like this:
$ cinder upload-to-image $child1 "extract:$child1"
Where $child1 is the UUID of the Cinder volume. You then need to find the UUID of the image in Glance, which the Cinder upload-to-image command will have told you, but you can also find by searching Glance for your image named “extract:$child1”:
$ glance image-list | grep "extract:$cinder_uuid"
You now need to watch that Glance image until the status of the image is “active”. It will go through a series of steps with names like “queued”, and “uploading” first.
Now you can download the image from Glance:
$ glance image-download --file images/$child1.raw --progress $glance_uuid
And then delete the intermediate glance image:
$ glance image-delete $glance_uuid
I have a bad sample script which does this in my junk code repository if that is helpful.
What you have at the end of this is a 64gb raw disk file in my example. You can convert that file to qcow2 like this:
$ qemu-img convert $child1.raw $child1.qcow2
But you’re left with a 64gb qcow2 file for your troubles. I experimented with virt-sparsify to reduce the size of this image, but it doesn’t work in my case (no space is saved), I suspect because the disk image has multiple partitions because it originally came from a VMWare environment.
Luckily qemu-img can also re-create the COW layer that existing on the admin-only side of the public cloud barrier. You do this by rebasing the converted qcow2 file onto the original VMDK file like this:
$ qemu-img create -f qcow2 -b $parent1.qcow2 $child1.delta.qcow2 $ qemu-img rebase -b $parent1.vmdk $child1.delta.qcow2
In my case I ended up with a 289mb $child1.delta.qcow2 file, which isn’t too shabby. It took about five minutes to produce that delta on my Google Cloud instance from a 7.9gb backing file and a 64gb upper layer.