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
Comments
Anonymous
January 01, 2003
Elemental. Al igual que es evidente que una instantánea no es igual que una instantánea, no sea que alguienAnonymous
January 01, 2003
The comment has been removedAnonymous
February 18, 2010
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, GuilleSQLAnonymous
February 24, 2010
Lo miro... No soy muy diestro con Visual Studio, pero puedo intentar ver si puedo hacer alguna cosilla, y si fuciona, te digo. Saludos !Anonymous
February 26, 2010
The comment has been removedAnonymous
April 07, 2011
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)