¡Buenas a todos! Hoy vamos con un artículo en el que os explicaremos como migrar máquinas virtuales de AHV a VMware. Si bien este es un movimiento que se suele hacer a la inversa con Nutanix Move, nunca está de más tenerlo en mente por si nos hace falta en algún momento.
Para evitar problemas con la máquina original y los snapshots que pudiera tener, la clonaremos y trabajaremos sobre dicho clon para la exportación. Es muy importante que la máquina esté apagada en todo momento.
¿Qué vamos a migrar?
Dos máquinas Windows Server 2019 (BIOS y UEFI) y dos máquinas CentOS 7 (BIOS y UEFI) con GNOME Desktop instalado, desde un single node cluster con Nutanix Community Edition a un host VSphere 8. Todas ellas usan un único disco de 100GB.

Versiones y hardware que hemos utilizado
- Intel NUC “Hades Canyon” NUC8i7HVK con Vsphere 8.0.1, 21495797.

- HP Z620 con Nutanix Community Edition 2.0, AOS 6.5.2 LTS y AHV 20220304.342.

- Nutanix VirtIO 1.2.1
Instalación de drivers Nutanix VirtIO
A continuación, os describimos las formas más habituales para instalar los drivers de Nutanix
CentOS 7
No necesitan una instalación específica, puesto que ya vienen integrados en el sitema operativo.
Windows Server 2019
Necesitan una instalación manual, se puede hacer de dos formas:
Durante la instalación del sistema operativo
Aquí cargamos todos los drivers de forma manual mediante una ISO para su instalación. En este caso desde agregar o quitar programas no veremos que están instalados.

Después de la instalación del sistema operativo
Durante la instalación de Windows cargamos la ISO con los drivers de forma manual e instalamos exclusivamente VirtIO SCSI pass-through controller para poder ver el disco duro. Cuando se haya completado procedemos a instalar los VirtIO desde la ISO en Windows.

Desde “Agregar o Quitar Programas” veremos que efectivamente están instalados.

Da igual la forma que hayamos elegido para instalar los VirtIO. Una vez migrada la máquina tendremos que desinstalarlos de forma manual.
Exportación de los discos
Podemos exportar los discos de dos formas diferentes:
- Usando qemu-img convert desde nuestra workstation con Windows.
- Usando qemu-img convert desde la CVM.
AHV usa los discos en formato RAW, por lo que tendremos que convertirlos a VMDK para poder usarlos en VMware. Este procedimiento tiene un consumo elevado de CPU lo que implica que si lo realizamos desde una CVM podemos afectar a sus servicios. Aunque explicaremos las dos opciones, lo recomendable es hacer la conversión del disco desde nuestra workstation.
Tal y como comentábamos al principio, trabajaremos sobre un clon apagado de la máquina de la que queramos exportar los discos. Esto garantiza que no tendremos snapshots y que no afectaremos a la máquina original.
Apertura del puerto 2222
Si tenéis una versión muy vieja de AOS, es posible que el puerto 2222 esté cerrado. Nosotros lo hemos observado en una versión 5.5. Si esto fuera así no os podréis conectar por winSCP.
Para solucionarlo tendremos que abrir el puerto en todas las CVM con el siguiente comando:
allssh modify_firewall -f -o open -i eth0 -p 2222 -a
Desde nuestra workstation con Windows
Lo primero que tenemos que hacer es descargar qemu-img para Windows desde este enlace. Al final de la página tendremos el botón de descarga.

Seguidamente descomprimimos el fichero en la carpeta que más nos guste. Nosotros hemos elegido C:\Work\Software\qemu-img-win-x64-2_3_0

Nos conectamos por Putty a la VIP de nuestro clúster

Ejecutamos este comando para listar los discos de la máquina que queremos exportar y nos quedamos con el vmdisk_uuid.
acli vm.get <Nombre_de_la_máquina> include_vmdisk_paths=1 | grep -E 'disk_list|vmdisk_nfs_path|vmdisk_size|vmdisk_uuid'
Ejemplo:
acli vm.get Server\ 2019\ BIOS include_vmdisk_paths=1 | grep -E 'disk_list|vmdisk_nfs_path|vmdisk_size|vmdisk_uuid'

Ejecutamos este otro comando para ver si hay snapshots y el Storage Container donde están los discos.
nfs_ls -Rlai | grep -E '^/|<disco_1>|...|<disco_n>'
Ejemplo:
nfs_ls -Rlai | grep -E '^/|647eecb2-2352-4b7d-88c2-e3965113efc5'
Como podemos ver en la imágen de abajo, el disco se encuentra en el storage container “SC-Z620” y además tiene un snapshot, por lo que debemos clonar la máquina para eliminarlo.

Este sería el resultado con la máquina clonada, como véis está en el mismo storage container y NO tiene snapshots.

Para descargar el disco, nos conectaremos por WinSCP a la VIP de nuestro clúster por puerto 2222 con las credenciales de admin que usamos en Prism Element.

Nos dirigimos al storage container donde se encuentra el disco de la máquina que vamos a exportar y veremos que inicialmente está “vacío” porque las carpetas están ocultas.

Para mostrar los ficheros ocultos pichamos en el menú Options de WinSCP y seleccionamos Prefences.

Seleccionamos el apartado Panels de la izquierda y activamos el check de Show Hidden Files.

A partir de ahora podremos ver los elementos ocultos.

Entramos en .acropolis y pinchamos sobre Find Files.

En file mask introducimos el vmdisk_uuid de nuestra máquina y pinchamos sobre Start para que nos aparezca listado.

Pinchamos sobre Download y lo descargamos a nuestro disco local.

Sed pacientes porque la transferencia puede tardar bastante en función del tamaño del disco de nuestra máquina. Para 100GB nosotros hemos tardado cerca de una horita.

Con este método tanto las IOPS que generamos en el clúster como el consumo de CPU son mínimos.

Con el disco descargado procederemos a su conversión con qemu. Abrimos un cmd como adminisrtrador y nos dirigimos a la carpeta donde hayamos descomprimido el qemu. Seguidamente ejecutamos el siguiente comando:
qemu-img.exe convert -p -O <formato_de_conversión> <vdisk_descargado_del_cluster> <vmdk_de_salida>
Ejemplo:
qemu-img.exe convert -p -O vmdk "c:\Users\bla_bla_bla\Downloads\VM Exports\044f8eb2-cace-43dc-a9b2-df62f0cfc8f0" "c:\Users\bla_bla_bla\Downloads\VM Exports\Windows Server 2019 BIOS"

Obtendremos el disco convertido en formato vmdk y con el tamaño de los datos escritos.

Le pondremos al archivo una extensión .vmdk y podemos proceder a importarlo en nuestro VMware.

Desde la CVM
Para convertir el disco desde la CVM y descargarlo lo primero que haremos será configurar Putty para que no haga timeout mientras estamos exportando la máquina. Configuraremos por ejemplo a 30 segundos el Seconds between keepalives.

Seguidamente nos conectamos a la VIP de nuestro clúster.

Listamos los discos de la máquina que queremos exportar y nos quedaremos con el vmdisk_uuid con el siguiente comando:.
acli vm.get <Nombre_de_la_máquina> include_vmdisk_paths=1 | grep -E 'disk_list|vmdisk_nfs_path|vmdisk_size|vmdisk_uuid'
Ejemplo:
acli vm.get Server\ 2019\ BIOS include_vmdisk_paths=1 | grep -E 'disk_list|vmdisk_nfs_path|vmdisk_size|vmdisk_uuid'

Comprobamos si hay snapshots y el storage container donde están los discos.
nfs_ls -Rlai | grep -E '^/|<disco_1>|...|<disco_n>'
Ejemplo:
nfs_ls -Rlai | grep -E '^/|647eecb2-2352-4b7d-88c2-e3965113efc5'
En este caso no hay snapshots pero sí que hay discos en la papelera de reciclaje del clúster que no nos afectan para convertir y exportar los discos.

Para convertir el disco del formato RAW que usa AHV a VMDK de VMware usaremos el siguiente comando:
qemu-img convert -p -c -f raw nfs://127.0.0.1/[Storage_Container_Donde_Esté_la_VM]/.acropolis/vmdisk/[VMDISK_UUID] -O vmdk nfs://127.0.0.1/[Storage_Container_Que_Queramos]/[Nombre_Del_Disco_Exportado].vmdk
Ejemplo:
qemu-img convert -p -c -f raw nfs://127.0.0.1/SC-Z620/.acropolis/vmdisk/647eecb2-2352-4b7d-88c2-e3965113efc5 -O vmdk nfs://127.0.0.1/SC-Z620/WS2019BIOS.vmdk

Con un clúster de laboratorio, prácticamente vacío, juzgad vosotros mismos el consumo del proceso.

Una vez se ha convertido el disco procederemos a descargarlo. Abrimos WinSCP y nos contectamos por el puerto 2222 y las credenciales de admin de Prism Element a nuestro clúster.

Entramos al storage container donde hayamos convertido el disco.

Lo descargamos a nuestra workstation. Estará listo para importarlo a nuestro VMware.

Importar las máquinas a VMware
Veamos como importar los discos que hemos exportado a nuestro host de VMware. Lo primero que haremos será crear una nueva máquina virtual.

Introducimos el nombre e indicaremos los datos del sistema operativo que usará

Seleccionamos el datastore donde estará ubicada.

Eliminamos el disco duro (que configuraremos más adelante) y la controladora USB si no la vamos a utilizar.

Dentro de la pestaña VM Options desplegamos Boot Options y configuramos el firmware según el que tuviera nuestra máquina original. En nuestro caso es BIOS

Pinchamos sobre Finish para que se cree la máquina.

Subimos el disco que hemos convertido al datastore donde hemos creado la máquina.

Editamos la configuración de la máquina y seleccionamos add Existing Hard Disk

Seleccionamos el disco que acabamos de subir y guardamos los cambios.

Si comprobamos de nuevo las propiedades del disco, veremos que aparece como Thick provisioned, lazily zeroed.

Si esta opción no os sirve, desde un vCenter podréis clonar la máquina o hacer un storage vMotion para cambiarlo a Thin Provision.

CentOS 7
Después de añadir el disco, cuando intentemos arrancar la máquina, es posible que nos devuelva el error “Unsupported or invalid disk type 2”.

Para solucionarlo nos conectamos por SSH a nuestro host de VMware y ejecutamos el comando detallado más abajo que realizará un clon del disco solucionando el problema. Si el disco ya estuviera en thin provision omitid el “-d thin”.
vmkfstools -i /vmfs/volumes/datastore/carpeta_de_la_maquina/disco_de_la_maquina.vmdk /vmfs/volumes/datastore/carpeta_de_la_maquina/nuevo_disco_de_la_maquina.vmdk -d thin
Ejemplo:
vmkfstools -i /vmfs/volumes/970\ EVO\ 1024/Migrated\ CentOS\ 7\ BIOS/CentOSBIOS.vmdk /vmfs/volumes/970\ EVO\ 1024/Migrated\ CentOS\ 7\ BIOS/Migrated_CentOS_7_BIOS.vmdk -d thin

Si no tenéis posibilidad de conectaros al host de ESX por SSH podemos solucionar el problema haciendo una copia del disco desde el “Datastore Browser”. Para ello nos dirigimos al datastore donde hayamos creado la máquina y copiamos el disco que acabamos de subir.

Como destino usamos la carpeta de la máquina y le ponemos el nombre que más nos guste con extensión .vmdk

Ahora editamos las propiedades de la máquina virtual para eliminar el disco anterior que no permitía el arranque de la máquina virtual. Seleccionamos que se elimine también del datastore y guardamos los cambios.

Volvemos a editar las propiedades de la máquina y añadimos el disco que acabamos de clonar.

Guardamos los cambios y esta vez la máquina arrancará.

Aunque técnicamente la máquina arranque lo hará en el initframs con un dracut-initqueue timeout si la configuramos con BIOS o se quederá esperando infinitamente antes de la pantalla de login si la iniciamos en modo UEFI. Alessandro Nuccio nos explica como solucionarlo en este enlace.

No obstante, veámoslo. Primero forzaremos un reinicio de la máquina y arrancaremos en modo rescue.

Si nuestra máquina tiene interfaz gráfica abrimos la terminal y localizamos el último initramfs con el comando
ls -lrt /boot/initramfs-*

Ahora comprobamos la última versión del kernel dentro del directorio /boot/modules
ls -lrt /lib/modules

Ahora reconstruiremos el initramfs con el comando
sudo dracut -f [última_versión_intramfs_en_/boot] [última_versión_del_Kernel_en_/boot/modules]
Ejemplo:
sudo dracut -f /boot/initramfs-3.10.0-1160.71.1.el7.x86_64.img 3.10.0-1160-71-1-el7-x86_64

Por último reiniciamos la máquina con un reboot y veremos que arranca perfectamente.

Nuestro CentOS 7 con GNOME Desktop está listo para iniciar sesión.

Además las tools funcionan correctamente.

Windows Server 2019
En el caso de Windows Server 2019 la máquina arranca sin problemas. Lo primero que haremos será montar e instalar las VMware Tools. Después reiniciaremos la máquina.

Ahora eliminaremos los drivers de AHV:
- Nutanix VirtIO Balloon Driver
- Nutanix VirtIO Ethernet Adapter
- Nutanis VirtIO SCSO pass-through controller
- QEMU FWCfg Device (null driver)
Abrimos el administrador de dispositivos

En vista pinchamos sobre mostrar dispositivos ocultos

En Disk Drives desinstalamos el dispositivo NUTANIX VDISK SCSI Disk Device.

En DVD/CD-ROM drives desinstalamos QEMU QEMU DVD-ROM ATA Device.

En Network Adapters desinstalamos Nutanix VirtIO Ethernet Adapter.

En Procesadores desinstalamos los que no estén en uso.

En System Devices desinstalamos Nutanix VirtIO Balloon Driver y QEMU FWCfg Device (null driver)

Si hubieramos realizado la instalación desde Windows de los VirtIO, los desinstalaremos desde “Agregar o Quitar Programas” y reiniciaremos la máquina.

Esperamos que el artículo os haya sido de utilidad. ¡Nos vemos!