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

Comments (6)

  1. Anonymous says:

    Elemental. Al igual que es evidente que una instantánea no es igual que una instantánea, no sea que alguien

  2. Gracias Guille, buen trabajo

    Intentaré rehacer el script para dar permisos a todos los elementos que conforman la VM. Se supone que si la VM no se ha movido del lugar, esos permisos persiten y solo hay que darlos sobe el elemento nuevo, el enlace simbolico. Pero ciertamente el escenario más general es que hayamos perdido el host original.

    Realmente no debería ser necesario reiniciar el host, sino solo el servicio de gestión

    Por cierto, ¿como se te da hacer aplicaciones GUI?. ¿Te curras una herramienta?. Te paso las especificaciones… 🙂

    Saludos

  3. GuilleSQL says:

    Mil gracias por el tip !!

    Lo probé hace tiempo con Windows Server 2008, y genial.

    Con Windows Server 2008 R2 no me funcionó, pero un tiempo más tarde volví a intentarlo, y parece que después de ejecutar los comandos mklink e icacls, es necesario reiniciar el Host para que se entere (ojo, sólo en la R2).

    En ambos casos, también tuve que dar permisos con icacls sobre los discos virtuales (VHD).

    Si alguién quiere más detalles y pantallazos (esta tarde los actualizo):

    http://www.guillesql.es/Articulos/Registrar_Manualmente_Maquina_Virtual_HyperV_R2_Windows_Server_2008_R2.aspx

    http://www.guillesql.es/Articulos/HyperV_Mover_Maquinas_Virtuales_sin_Export_Import.aspx

    Lo dicho, muchas gracias por el truquillo.

    Saludos,

    GuilleSQL

  4. GuilleSQL says:

    Lo miro…

    No soy muy diestro con Visual Studio, pero puedo intentar ver si puedo hacer alguna cosilla, y si fuciona, te digo.

    Saludos !

  5. GuilleSQL says:

    Buenas,

    Aquí va un primer intento, que acabo de colgar:

    http://www.guillesql.es/descargas/VMAttach.beta01.zip

    He hecho alguna prueba en Windows Server 2008, y me ha funcionado OK, si genero el Script, y luego lo ejecuta manualmente. Sin embargo, si genero el Script y lo ejecuto desde esta utilidad, me crea el symbolic link, pero al dar permisos NTFS me dice que me peine ¿? No he pillado el porqué… sorrys… (se admiten ideas)

    Para quien lo quiera probar, ahí va. Se admite feedback.

    Por cierto, el lenguaje es un dialecto de mi barrio. Se llama Carabanchinglish, y es una derivación del inglés 😉 Si he puesto alguna burrada, me decís, jeje 😉

    Un Saludo !

    Guille

  6. SerJuan says:

    Tras realizar realizar los pasos del Post de David en Windows 2008 R2 SP1 en español, no he conseguido iniciar la maquina virtual a mover.

    Lo que quería hacer era mover una maquina cuyos archivos estaban en C:MaquinasVirtuales a la carpeta CSV C:ClusterStorage para poder poner la maquina en un cluster Hyper-V.

    Los pasos que he dado son:

    1-Apagar la maquina

    2-Cambiar la ubicación del disco vhd y de instantáneas de la maquina en la configuración de Hyper-V

    3-Copiar la carpeta de C:MaquinasVirtualesxp a C:ClusterStorageVolumen1xp

    4-Borrar el enlace simbólico de la maquina de "C:ProgramDataMicrosoftWindowsHyper-VVirtual Machines<SID>.xml"

    5-Crear el nuevo enlace simbólico del archivo "C:ClusterStorageVolumen1xpVitual Machines<SID>.xml"

    6-Dar permisos totales al grupo "MÁQUINA VIRTUAL NT<SID>" en el enlace simbólico. (Recordar poner el parámetro /L)

    Hasta aquí todo casi igual al post de David, excepto en el idioma del grupo que si tienes instalado en español el nombre es "MÁQUINA VIRTUAL NT" en vez de "NT VIRTUAL MACHINE".

    7-Dar el mismo permiso total al mismo grupo "MÁQUINA VIRTUAL NT<SID>" pero sobre 2 archivos mas y 1 directorio. Los archivos y el directorio son:

    "C:ClusterStorageVolumen1xpVitual Machines<SID>.xml"

    "C:ClusterStorageVolumen1xpxp.vhd"

    "C:ClusterStorageVolumen1xpVitual Machines<SID>"

    (Recordar NO poner el parametro /L)

    8-Dar permiso total al grupo "MÁQUINA VIRTUAL NTMáquinas virtuales"

    (Recordar NO poner el parámetro /L)

    9-Reiniciar el servidor

    10-Revisar la configuración de la maquina en Hyper-V (lo cuál indica un error, pero al dar a aceptar se soluciona solo)

Skip to main content