# 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

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1767687108801/d363d98b-b9ac-4fb0-9af3-8dff78a8bab1.png align="center")

---

## 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

```bash
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

```bash
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

```bash
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:

```bash
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)

```bash
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

```bash
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:

```plaintext
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

```bash
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

```bash
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
