Skip to content

Instantly share code, notes, and snippets.

@romale
Last active April 27, 2025 10:40
Show Gist options
  • Save romale/98e5e6dc2371d960201810dae524f754 to your computer and use it in GitHub Desktop.
Save romale/98e5e6dc2371d960201810dae524f754 to your computer and use it in GitHub Desktop.
Migrate virtual machine from "libvirt" to "openstack" via rbd import
Example architecture is Openstack+Ceph and we need to import images from old Libvirt virtualization to Openstack.
Openstack deployed via kolla ansible.
Problem. Import some big images via "openstack image import" is too slow.
Solution. As a workaround is to import images via rbd import.
# source image
export IMAGE="my-vm.img"
# new network
export NET="my-net"
# old MAC address (if you need migrate it)
export MAC_ADDRESS="52:54:00:08:b7:30"
export FLAVOR="4C-16R-50H"
# destination project
export PROJECT='admin'
# create image file name
export IMAGE_NAME=`echo ${IMAGE} | sed 's/img\|qcow2\|raw\|\.//g'`
# mount your source /var/lib/libvirt/images via nfs, for example
export SRC_IMAGE="/mnt/vms/${IMAGE}"
# where temporary store converted raw images
export DST_IMAGE="/mnt/ceph/migrate_images/${IMAGE_NAME}.img"
# migrated/new VM name
export VM_NAME="${IMAGE_NAME}"
export CEPH_CLUSTER_ID="addbef4c-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
export POOL="images"
export OS_PROJECT_NAME="${PROJECT}"
echo "SRC_IMAGE: $SRC_IMAGE"
echo "DST_IMAGE: $DST_IMAGE"
echo "VM_NAME: $VM_NAME"
echo "IMAGE_NAME: $IMAGE_NAME"
echo "PROJECT: $PROJECT"
qemu-img convert -f qcow2 -O raw $SRC_IMAGE $DST_IMAGE
IMAGE_ID=$(openstack image create \
--disk-format raw \
--project $PROJECT \
$IMAGE_NAME.img -f shell | awk -F "=" '/^id=/ { print $2}' | sed s/\"//g)
echo "IMAGE_ID: $IMAGE_ID"
export IMAGE_ID
openstack image set --property os_require_quiesce=yes --property hw_qemu_guest_agent=yes $IMAGE_NAME.img
rbd import $DST_IMAGE $POOL/${IMAGE_ID} --id glance
rbd snap create $POOL/${IMAGE_ID}@snap --id glance
rbd snap protect $POOL/${IMAGE_ID}@snap --id glance
# where "pub.sh" is auth data from /etc/kolla/public-openrc.sh
docker exec -e CEPH_CLUSTER_ID -e IMAGE_ID -e POOL -it glance_api bash -c 'cd ~/; source pub.sh; glance location-add --url rbd://${CEPH_CLUSTER_ID}/${POOL}/${IMAGE_ID}/snap ${IMAGE_ID}'
PORT_ID=$(openstack port create port1 --network $NET --mac-address $MAC_ADDRESS --project $PROJECT -f shell | awk -F "=" '/^id=/ { print $2}' | sed s/\"//g)
echo "PORT_ID: $PORT_ID"
export PORT_ID
openstack server create \
--port $PORT_ID \
--flavor $FLAVOR \
--no-security-group \
--key-name mykey \
--image $IMAGE_ID \
$VM_NAME
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment