Cómo registrar a mano Máquinas Virtuales en Hyper-V

Hola

Antes de nada es importante mencionar que la única manera soportada de sacar una VM de un host de virtualización para llevarla a otro, o moverla su fichero de configuración a otra localización del sistema de almacenamiento, es mediante la funcionalidad Importar/Exportar de la consola.

Esto funciona de la siguiente manera. Cuando se crea una nueva máquina virtual se genera un fichero .xml que almacena su configuración, y que tiene por nombre un GUID que la representa de manera unívoca (así se pueden crear máquinas virtuales que tengan el mismo nombre sin que haya conflictos). Este fichero se genera en una carpeta llamada "Virtual Machines" dentro del path por defecto que hayamos configurado para ello, o bien dentro del que especifiquemos explícitamente durante la creación de la máquina virtual. Además se genera un "Simbolic Link" a dicho fichero en la carpeta %Allusersprofile%\Application Data\microsoft\Windows\Hyper-V\Virtual Machines, que es lo que realmente lee la pila de gestión de Hyper-V para mostrar dicha VM en la consola. Resumiendo:

  • Asumiendo que el path por defecto es F:\VMs
  • Creamos una nueva VM en el path por defecto
  • Se genera el fichero F:\VMs\Virtual Machines\<GUID unico>.xml
  • En la carpeta %Allusersprofile%\Application Data\microsoft\Windows\Hyper-V\Virtual Machines se genera un symbolic link que apunta a F:\VMs\Virtual Machines\<GUID unico>.xml

Mencionar también que si se borra la máquina virtual desde la consola, todo lo anterior se elimina del sistema, preservándose únicamente el .vhd.

Cambiar la localización de VHD no es demasiado traumático, ya que basta con editar el fichero de configuración con la interfaz gráfica y cambiar su path. Sin embargo, si lo que queremos es que una misma VM este dada de alta en diferentes hosts, o trasladar el fichero de configuración de un path a otro, la cosa cambia.  Esto no es algo que se vaya a hacer de manera frecuente, pero en entornos como el nuestro, en los que almacenamos gran parte de las máquinas virtuales en discos externos que vamos pinchando en diferentes equipos puede resultar útil. No obstante, es muy posible que tengamos que modificar posteriormente a mano algunas cosas, como la asignación de las NICs a los switches virtuales y redes definidas en el nuevo host.

Una vez explicado cómo funciona, aquí va un pequeño procedimiento para registrar/desregistrar a mano VMs en los hosts con Hyper-V, y que cada cual lo aplique como quiera. A partir de este momento entramos dentro del campo de lo no soportado.

Cómo "desregistrar" una máquina virtual

Basta con usar un script "desregistrar.cmd" que contenga:

del "%Allusersprofile%\Application Data\microsoft\Windows\Hyper-V\Virtual Machines"\%1.xml

Este script lo copiamos allí donde resida el <GUID unico>.xml, abrimos un CMD, nos situamos en ese path y lo ejecutamos pasándole como parámetro el <GUID unico> (sin el .xml):

desregistrar.cmd <GUID unico>

Cómo registrar una VM

En este caso el script "registra.cmd" será:

mklink "%Allusersprofile%\Application Data\microsoft\Windows\Hyper-V\Virtual Machines"\%1.xml "%cd%"\%1.xml
icacls "%Allusersprofile%\Application Data\microsoft\Windows\Hyper-V\Virtual Machines"\%1.xml /grant "NT VIRTUAL MACHINE\%1":F /L

Nuevamente, lo copiamos allí donde resida el <GUID unico>.xml, abrimos un CMD, nos situamos en ese path y lo ejecutamos pasándole como parámetro el <GUID unico> (sin el .xml):

registrar.cmd <GUID unico>

Con esto, creamos el enlace simbólico al .xml, y le damos permisos de control total a un SID "invisible" que representa a dicha máquina virtual. Hasta donde yo sé, éste último paso no era necesario antes de la RC0 de Hyper-V, pero ahora si no se hace la VM da un error no especificado al arrancar.

Saludos

David Cervigón