{"id":309,"date":"2026-09-05T19:15:39","date_gmt":"2026-09-05T22:15:39","guid":{"rendered":"https:\/\/www.linuxpro.com.br\/2026\/09\/ova2xva\/"},"modified":"2026-09-08T11:40:31","modified_gmt":"2026-09-08T14:40:31","slug":"ova2xva","status":"publish","type":"post","link":"https:\/\/www.linuxpro.com.br\/es\/2026\/09\/ova2xva\/","title":{"rendered":"ova2xva: migra VMs de VMware\/VirtualBox a XCP-ng con un solo comando"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" alt=\"Mascote do LinuxPro convertendo um pacote OVA em XVA para importar no XCP-ng\" src=\"\/wp-content\/uploads\/2026\/09\/ova2xva-v4.webp\" width=\"1486\" height=\"856\" \/><\/p>\n<p>Sacar una VM de <a href=\"\/es\/2026\/09\/a-historia-do-virtualbox\/\">VirtualBox<\/a> o de VMware y ponerla en <a href=\"\/es\/2026\/09\/a-historia-do-xcp\/\">XCP-ng<\/a> (o en <a href=\"\/es\/2026\/09\/a-historia-do-xenserver\/\">XenServer<\/a>) suele convertirse en un ritual: exportar OVA, convertir el disco a mano, pelearse con el <code data-no-translation=\"\">xe<\/code>. El <strong>ova2xva<\/strong> es un CLI en <strong>Go<\/strong> (MIT) que hace el camino de ida y el de vuelta en un \u00fanico binario: convierte OVA o disco suelto a XVA, valida, importa mediante XAPI y, si hace falta, devuelve un OVA port\u00e1til. Sin el binario <code data-no-translation=\"\">xe<\/code> en el camino.<\/p>\n<p>El c\u00f3digo y las releases est\u00e1n en <a href=\"https:\/\/github.com\/jniltinho\/ova2xva\">github.com\/jniltinho\/ova2xva<\/a>. La versi\u00f3n actual de los binarios oficiales es la <strong>v0.4.0<\/strong> (1 de agosto de 2026).<\/p>\n<h2>Qu\u00e9 hace<\/h2>\n<table>\n<thead>\n<tr>\n<th>Comando<\/th>\n<th>Funci\u00f3n<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code data-no-translation=\"\">convert<\/code><\/td>\n<td>OVA o disco suelto (<code data-no-translation=\"\">.vmdk<\/code>, <code data-no-translation=\"\">.qcow2<\/code>, <code data-no-translation=\"\">.vhdx<\/code>\u2026) \u2192 <code data-no-translation=\"\">.xva<\/code> (compresi\u00f3n <code data-no-translation=\"\">zstd<\/code> por defecto)<\/td>\n<\/tr>\n<tr>\n<td><code data-no-translation=\"\">to-ova<\/code><\/td>\n<td>El inverso: <code data-no-translation=\"\">.xva<\/code> o disco \u2192 <code data-no-translation=\"\">.ova<\/code> (OVF 1.0 + VMDK stream-optimized + manifiesto SHA-256). Requiere <code data-no-translation=\"\">qemu-img<\/code><\/td>\n<\/tr>\n<tr>\n<td><code data-no-translation=\"\">validate<\/code><\/td>\n<td>Comprueba estructura y SHA1 del <code data-no-translation=\"\">.xva<\/code><\/td>\n<\/tr>\n<tr>\n<td><code data-no-translation=\"\">import<\/code><\/td>\n<td>Sube a XCP-ng\/XenServer con <code data-no-translation=\"\">HTTP PUT \/import<\/code> (XAPI) \u2014 sin <code data-no-translation=\"\">xe<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>La decodificaci\u00f3n de VMDK, QCOW2 y VHDX es <strong>nativa en Go<\/strong>. El <code data-no-translation=\"\">qemu-img<\/code> entra como fallback y es <strong>obligatorio<\/strong> no <code data-no-translation=\"\">to-ova<\/code> (es el que genera el VMDK). VHD y VDI cl\u00e1sicos tambi\u00e9n pasan solo por <code data-no-translation=\"\">qemu-img<\/code>; <code data-no-translation=\"\">.raw<\/code>\/<code data-no-translation=\"\">.img<\/code> van por copia directa.<\/p>\n<h2>En la pr\u00e1ctica<\/h2>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\"># OVA do VirtualBox\/VMware \u2192 XVA\nova2xva convert -o app.xva --name \"App Server\" app.ova\n\n# Disco solto, sem OVA\nova2xva convert -o app.xva --name \"App Server\" --memory 4096 --vcpus 2 disk.vmdk\n\n# Validar (opcional)\nova2xva validate app.xva\n\n# Importar no XCP-ng e j\u00e1 ligar a VM\nexport OVA2XVA_HOST=xcp.example.com OVA2XVA_USER=root OVA2XVA_PASSWORD='...'\nova2xva import --start app.xva\n\n# O caminho contr\u00e1rio: sair do Xen com um OVA port\u00e1til\nova2xva to-ova -o app.ova app.xva<\/code><\/pre>\n<p>Dos detalles que el README deja expl\u00edcitos y que ahorran sorpresas:<\/p>\n<ul>\n<li class=\"translation-block\">la extensi\u00f3n de salida de <code>convert<\/code> es <strong>siempre<\/strong> <code>.xva<\/code> \u2014 <code>-o foo.xva.zst<\/code> se convierte en <code>foo.xva<\/code>;<\/li>\n<li>el disco del guest se expande a <strong>raw en el tama\u00f1o virtual<\/strong> en el directorio de trabajo. Un OVA de 5 GB con disco de 100 GB necesita ~100 GB temporales m\u00e1s el XVA final.<\/li>\n<\/ul>\n<h2>Instalaci\u00f3n<\/h2>\n<p>Por el binario de la release (Linux amd64):<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">curl -LO https:\/\/github.com\/jniltinho\/ova2xva\/releases\/download\/v0.4.0\/ova2xva_0.4.0_linux_amd64.tar.gz\ntar -xzf ova2xva_0.4.0_linux_amd64.tar.gz\nsudo install -m 755 ova2xva \/usr\/local\/bin\/ova2xva\nova2xva version<\/code><\/pre>\n<p>O compilando \u2014 Go 1.22+ y <code data-no-translation=\"\">qemu-utils<\/code> (el paquete Debian\/Ubuntu que trae el <code data-no-translation=\"\">qemu-img<\/code>):<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">sudo apt install golang-go qemu-utils\ngit clone https:\/\/github.com\/jniltinho\/ova2xva\ncd ova2xva &amp;&amp; make build    # \u2192 dist\/ova2xva<\/code><\/pre>\n<h2>Cu\u00e1ndo usar<\/h2>\n<ul>\n<li><strong>Entrar en Xen<\/strong> a partir de un OVA de VirtualBox\/VMware, o de un disco suelto, sin montar un pipeline de <code data-no-translation=\"\">qemu-img<\/code> + <code data-no-translation=\"\">xe vm-import<\/code>;<\/li>\n<li><strong>Salir de Xen<\/strong> con <code data-no-translation=\"\">to-ova<\/code> para copia de seguridad port\u00e1til o para llevar la VM a otro hipervisor;<\/li>\n<li><strong>Importar desde cualquier Linux<\/strong> con red hasta el host \u2014 el <code data-no-translation=\"\">import<\/code> habla XAPI, no necesita el <code data-no-translation=\"\">xe<\/code> instalado en la estaci\u00f3n.<\/li>\n<\/ul>\n<p>No sustituye a una herramienta de orquestaci\u00f3n como Xen Orchestra. Es el conversor + importador de un archivo. La historia m\u00e1s amplia del hipervisor est\u00e1 en <a href=\"\/es\/2026\/09\/a-historia-do-xen\/\">La historia de Xen<\/a> y, en el escritorio KVM, en <a href=\"\/es\/2026\/09\/a-historia-do-proxmox\/\">La historia de Proxmox<\/a>.<\/p>\n<h2>Bugs y PRs<\/h2>\n<p>El proyecto es MIT, de <a href=\"https:\/\/github.com\/jniltinho\">Nilton Oliveira<\/a>. Prueba con VMs reales, abre una incidencia con el caso l\u00edmite y, si te sirve, deja una estrella: <a href=\"https:\/\/github.com\/jniltinho\/ova2xva\">github.com\/jniltinho\/ova2xva<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>Tirar uma VM do VirtualBox ou do VMware e p\u00f4r no XCP-ng (ou no XenServer) costuma virar ritual: exportar OVA, converter disco na m\u00e3o, brigar com o xe. O ova2xva \u00e9 um CLI em Go (MIT) que faz o caminho de ida e o de volta num bin\u00e1rio s\u00f3 \u2014 converte OVA ou disco solto &#8230; <a title=\"ova2xva: migra VMs de VMware\/VirtualBox a XCP-ng con un solo comando\" class=\"read-more\" href=\"https:\/\/www.linuxpro.com.br\/es\/2026\/09\/ova2xva\/\" aria-label=\"Leer m\u00e1s sobre ova2xva: migre VMs do VMware\/VirtualBox para XCP-ng com um comando\">Leer m\u00e1s<\/a><\/p>","protected":false},"author":0,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[21,2,120],"tags":[8,31,140,138,139,136,137],"class_list":["post-309","post","type-post","status-publish","format-standard","hentry","category-infra","category-linux","category-servidores","tag-cli","tag-golang","tag-virtualbox","tag-virtualizacao","tag-vmware","tag-xcp-ng","tag-xenserver"],"_links":{"self":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/309","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/comments?post=309"}],"version-history":[{"count":6,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/309\/revisions"}],"predecessor-version":[{"id":1422,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/309\/revisions\/1422"}],"wp:attachment":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/media?parent=309"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/categories?post=309"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/tags?post=309"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}