I've discussed my local OpenStack installation before, such as here and here. One of the results of the changes I've made to it over time is that I have some instances that are booted from volume. Unfortunately, instances booted from volume don't snapshot properly with the nova image-create. Below is the quick and dirty method I've been using to take snapshot backups of those vms for a while now.
I won't go too deeply into the implementation details since you can read the script below, but the basic process is to stop the instance, find the volume it was booted from, use Cinder to create an image from the volume, then restart the instance. I also download the image and then delete it from Glance because I'm primarily using this as a backup method.
There are some obvious limitations to this method (having to stop the instance could be a problem for many people), but I've been running it a few times a week for several months now and it's been working well for me so I figured I'd share it. If there's a simpler way to do this I'm all ears. :-)
vms_to_backup="space separated list of vms to run the script on"
wait_for_image()
{
image=$1
count=0
while ! glance image-show $image | grep active
do
count=$(($count+1))
if [ $count -ge 200 ]
then
echo "Image never became active"
exit 1
fi
sleep 10
done
}
for i in $vms_to_backup
do
img_name=backup-$i
restart=0
if nova show $i | grep ACTIVE
then
nova stop $i
restart=1
fi
# This is likely to break with multiple attached volumes
volid=$(nova show $i | grep volumes_attached | sed 's/.*\[{"id": "\([a-zA-Z0-9\-]\+\)"}\].*/\1/')
while nova show $i | grep ACTIVE
do
sleep 1
done
cinder upload-to-image $volid $img_name --disk-format qcow2 --force True || continue
wait_for_image $img_name
if [ $restart -eq 1 ]
then
nova start $i
fi
glance image-download $img_name --file /backup/$i.qcow2
glance image-delete $img_name
done