ova2xva: migra VMs de VMware/VirtualBox a XCP-ng con un solo comando

Mascote do LinuxPro convertendo um pacote OVA em XVA para importar no XCP-ng

Sacar una VM de VirtualBox o de VMware y ponerla en XCP-ng (o en XenServer) suele convertirse en un ritual: exportar OVA, convertir el disco a mano, pelearse con el xe. El ova2xva es un CLI en Go (MIT) que hace el camino de ida y el de vuelta en un único binario: convierte OVA o disco suelto a XVA, valida, importa mediante XAPI y, si hace falta, devuelve un OVA portátil. Sin el binario xe en el camino.

El código y las releases están en github.com/jniltinho/ova2xva. La versión actual de los binarios oficiales es la v0.4.0 (1 de agosto de 2026).

Qué hace

Comando Función
convert OVA o disco suelto (.vmdk, .qcow2, .vhdx…) → .xva (compresión zstd por defecto)
to-ova El inverso: .xva o disco → .ova (OVF 1.0 + VMDK stream-optimized + manifiesto SHA-256). Requiere qemu-img
validate Comprueba estructura y SHA1 del .xva
import Sube a XCP-ng/XenServer con HTTP PUT /import (XAPI) — sin xe

La decodificación de VMDK, QCOW2 y VHDX es nativa en Go. El qemu-img entra como fallback y es obligatorio no to-ova (es el que genera el VMDK). VHD y VDI clásicos también pasan solo por qemu-img; .raw/.img van por copia directa.

En la práctica

# OVA do VirtualBox/VMware → XVA
ova2xva convert -o app.xva --name "App Server" app.ova

# Disco solto, sem OVA
ova2xva convert -o app.xva --name "App Server" --memory 4096 --vcpus 2 disk.vmdk

# Validar (opcional)
ova2xva validate app.xva

# Importar no XCP-ng e já ligar a VM
export OVA2XVA_HOST=xcp.example.com OVA2XVA_USER=root OVA2XVA_PASSWORD='...'
ova2xva import --start app.xva

# O caminho contrário: sair do Xen com um OVA portátil
ova2xva to-ova -o app.ova app.xva

Dos detalles que el README deja explícitos y que ahorran sorpresas:

  • la extensión de salida de convert es siempre .xva — -o foo.xva.zst se convierte en foo.xva;
  • el disco del guest se expande a raw en el tamaño virtual en el directorio de trabajo. Un OVA de 5 GB con disco de 100 GB necesita ~100 GB temporales más el XVA final.

Instalación

Por el binario de la release (Linux amd64):

curl -LO https://github.com/jniltinho/ova2xva/releases/download/v0.4.0/ova2xva_0.4.0_linux_amd64.tar.gz
tar -xzf ova2xva_0.4.0_linux_amd64.tar.gz
sudo install -m 755 ova2xva /usr/local/bin/ova2xva
ova2xva version

O compilando — Go 1.22+ y qemu-utils (el paquete Debian/Ubuntu que trae el qemu-img):

sudo apt install golang-go qemu-utils
git clone https://github.com/jniltinho/ova2xva
cd ova2xva && make build    # → dist/ova2xva

Cuándo usar

  • Entrar en Xen a partir de un OVA de VirtualBox/VMware, o de un disco suelto, sin montar un pipeline de qemu-img + xe vm-import;
  • Salir de Xen con to-ova para copia de seguridad portátil o para llevar la VM a otro hipervisor;
  • Importar desde cualquier Linux con red hasta el host — el import habla XAPI, no necesita el xe instalado en la estación.

No sustituye a una herramienta de orquestación como Xen Orchestra. Es el conversor + importador de un archivo. La historia más amplia del hipervisor está en La historia de Xen y, en el escritorio KVM, en La historia de Proxmox.

Bugs y PRs

El proyecto es MIT, de Nilton Oliveira. Prueba con VMs reales, abre una incidencia con el caso límite y, si te sirve, deja una estrella: github.com/jniltinho/ova2xva.