Skip to main content

Command Palette

Search for a command to run...

Migrating VMware ESXi Workloads to OpenStack Using MigrateKit

Updated
4 min read
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:

  1. Create Neutron port

  2. Perform final incremental sync

  3. Power off source VM

  4. Create volume and Nova instance

  5. Boot the migrated VM


Verification

openstack volume list
openstack server list
openstack console url show <INSTANCE_NAME>
ssh ubuntu@<INSTANCE_IP>

Troubleshooting

IssueCauseResolution
Authentication errorDomain variables misconfiguredRemove OS_PROJECT_DOMAIN_ID and OS_USER_DOMAIN_ID
CBT not enabledMissing CBT flagsVerify .vmx configuration
Network mapping failedMAC mismatchValidate VMware and Neutron mappings
Kernel panic on bootUnsupported virtual hardware versionUse older virtualHW.version

Performance Observations

MetricResult
Disk size25 GB
Throughput~533 MiB/s
Full sync time~47 seconds
Downtime5–10 minutes
Data lossNone

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

Cloud Migration

Part 1 of 1

Learn how to migrate workloads across VMware, OpenStack, AWS, and other cloud platforms. This series shares practical strategies, tools, and best practices for seamless, secure, and efficient cloud migration.