Migrating VMware ESXi Workloads to OpenStack Using MigrateKit

This guide describes a practical, production-tested workflow to migrate virtual machines from VMware ESXi to OpenStack using MigrateKit — an open-source migration tool developed by VEXXHOST.
The approach focuses on:
Near-zero downtime
Full data integrity
Repeatable and automated execution
Objectives
Migrate virtual machines from VMware ESXi to OpenStack
Minimize service downtime (typically 5–10 minutes)
Preserve data integrity
Enable repeatable and automated migration runs
Architecture Overview

Prerequisites
MigrateKit Server
OS: Ubuntu 22.04 LTS
Memory: minimum 4 GB
Disk: minimum 50 GB
Network access to both VMware and OpenStack endpoints
VMware VDDK
Version: 8.0.3 or later
Download from VMware Developer Portal
Source Environment (VMware)
ESXi 6.7+ or vCenter-managed environment
Change Block Tracking (CBT) must be enabled
Target Environment (OpenStack)
OpenStack Bobcat (2023.2) or later
Required services: Cinder, Nova, Neutron
Part 1: MigrateKit Server Setup
Install Docker
sudo apt update && sudo apt upgrade -y
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
docker --version
Install VMware VDDK
scp VMware-vix-disklib-8.0.3-*.tar.gz root@migratekit:/tmp/
ssh root@migratekit
cd /tmp
tar -xzf VMware-vix-disklib-8.0.3-*.tar.gz
sudo mkdir -p /usr/lib64/vmware-vix-disklib
sudo cp -r vmware-vix-disklib-distrib/lib64/* /usr/lib64/vmware-vix-disklib/
ls -la /usr/lib64/vmware-vix-disklib/
Configure OpenStack Credentials
cat > ~/openstack-credentials.env << 'EOF'
export OS_AUTH_URL=https://your-openstack.com:5000
export OS_PROJECT_NAME=your-project
export OS_PROJECT_ID=your-project-id
export OS_USERNAME=your-username
export OS_PASSWORD=your-password
export OS_REGION_NAME=RegionOne
export OS_INTERFACE=public
export OS_IDENTITY_API_VERSION=3
export OS_USER_DOMAIN_NAME=default
export OS_PROJECT_DOMAIN_NAME=default
EOF
source ~/openstack-credentials.env
Validate connectivity:
docker run --rm \
--env-file <(env | grep OS_) \
python:3-slim bash -c \
"pip install python-openstackclient && openstack token issue"
Part 2: Preparing the VMware Source
Enable Change Block Tracking (CBT)
ssh root@esxi-host
vim-cmd vmsvc/getallvms | grep your-vm-name
vim-cmd vmsvc/power.off <VM_ID>
vi /vmfs/volumes/datastore1/your-vm/your-vm.vmx
# Add:
ctkEnabled = "TRUE"
scsi0:0.ctkEnabled = "TRUE"
vim-cmd vmsvc/reload <VM_ID>
vim-cmd vmsvc/power.on <VM_ID>
Part 3: Migration Workflow
Phase 1: Initial Full Sync
docker run -it --rm --privileged \
--network host \
-v /dev:/dev \
-v /usr/lib64/vmware-vix-disklib/:/usr/lib64/vmware-vix-disklib:ro \
--env-file <(env | grep OS_) \
ghcr.io/vexxhost/migratekit:main \
migrate \
--vmware-endpoint <ESXI_IP> \
--vmware-username root \
--vmware-password "<ESXI_PASSWORD>" \
--vmware-path /ha-datacenter/vm/<VM_NAME> \
--debug
Expected output:
INFO[0001] Creating snapshot
INFO[0003] Volume created and set bootable
Full copy 100% (25 GiB, 533 MiB/s)
INFO[0061] Migration completed
Phase 2: Incremental Sync
Re-run the migrate command to copy only changed blocks.
This phase can be repeated multiple times to reduce final cutover time.
Phase 3: Final Cutover
openstack network list
openstack subnet list
docker run -it --rm --privileged \
--network host \
-v /usr/lib64/vmware-vix-disklib/:/usr/lib64/vmware-vix-disklib:ro \
--env-file <(env | grep OS_) \
ghcr.io/vexxhost/migratekit:main \
cutover \
--vmware-endpoint <ESXI_IP> \
--vmware-username root \
--vmware-password "<ESXI_PASSWORD>" \
--vmware-path /ha-datacenter/vm/<VM_NAME> \
--flavor <FLAVOR_ID> \
--network-mapping mac=<MAC>,network-id=<NETWORK_ID>,subnet-id=<SUBNET_ID> \
--debug
Cutover sequence:
Create Neutron port
Perform final incremental sync
Power off source VM
Create volume and Nova instance
Boot the migrated VM
Verification
openstack volume list
openstack server list
openstack console url show <INSTANCE_NAME>
ssh ubuntu@<INSTANCE_IP>
Troubleshooting
| Issue | Cause | Resolution |
| Authentication error | Domain variables misconfigured | Remove OS_PROJECT_DOMAIN_ID and OS_USER_DOMAIN_ID |
| CBT not enabled | Missing CBT flags | Verify .vmx configuration |
| Network mapping failed | MAC mismatch | Validate VMware and Neutron mappings |
| Kernel panic on boot | Unsupported virtual hardware version | Use older virtualHW.version |
Performance Observations
| Metric | Result |
| Disk size | 25 GB |
| Throughput | ~533 MiB/s |
| Full sync time | ~47 seconds |
| Downtime | 5–10 minutes |
| Data loss | None |
Operational Best Practices
Before migration
Test with non-production workloads
Enable CBT early
Maintain backups
Perform multiple sync cycles
During migration
Monitor network throughput
Keep source VM running until cutover
Review logs in debug mode
After migration
Validate application behavior
Update DNS and routing
Monitor system performance
Retain source VM temporarily for rollback
Conclusion
MigrateKit provides a clean and reliable migration path from VMware ESXi to OpenStack when Change Block Tracking is available.
Key strengths:
Minimal downtime
Deterministic workflow
Open-source and production-ready
Limitations:
Requires CBT support
Dependent on ESXi API access
Network performance impacts total time
References
MigrateKit GitHub
VEXXHOST: Introducing MigrateKit
VMware VDDK Documentation
OpenStack Official Documentation
