Cómo: Montar Discos Virtuales (VHD) en Windows Explorer con Hyper-V

En esta entrega quiero compartir con la comunidad de qué forma podemos Montar, Desmontar y Compactar Discos Virtuales (VHD’s) en Hyper-V sobre Windows Server 2008.

Estoy seguro que en algún momento haz pensado en la posibilidad de explorar el contenido de un VHD (Virtual Hard Disk) fuera de linea (Offline), es decir, que puedas ver el contenido del Disco Virtual sin tenerlo asociado a una VM (Virtual Machine), o si por el contrario está asociado a una VM, ésta se encuentre apagada.

Este artículo le brindará los pasos para que pueda asociar un VHD al Sistema de Archivos de Host o del Servidor Físico donde reside su VM de forma tal que tenga la oportunidad de manipular el contenido del disco virtual a través del Explorador de Windows y hacer una revisión de éste o un Arrastrar y Soltar (Copiar y Pegar) carpetas, archivos o inclusive crear data.

A continuación describo los pasos a seguir:

Existen dos formas de Montar discos virtuales creados en Hyper-V, la primera es por medio de un Script de PowerShell y otra por VBScript. En cualquier caso se trata de que nos presente la siguiente opción cuando hagamos click botón derecho del mouse sobre un archivo VHD:

Mount VHD
Las opciones: Montar, Compactar y Desmontar luego del Script PowerShel

Paso 1: Por medio de PowerShell

Crear archivo: MontarVHD.ps1

Lo primero que debemos hacer es crear el archivo «MontarVHD.ps1 con el script de powershell que monta, desmonta o compacta un .vhd

$VHDService = get-wmiobject -class «Msvm_ImageManagementService» -namespace «root\virtualization» -computername «.»
if($args[1] -eq «Mount»){$Result = $VHDService.Mount($args[0])}
elseif($args[1] -eq «UnMount»){$Result = $VHDService.UnMount($args[0])}
elseif($args[1] -eq «Compact»){$Result = $VHDService.CompactVirtualHardDisk($args[0])}

Este script de powershell acepta dos parámetros: El primero es el path completo al .vhd y el segundo es la acción a llevar a cabo, que puede ser Mount, UnMount o Compact. Por ejemplo:

  • PS> mountvhd c:\VirtualMachines\server1.vhd Mount
  • PS> mountvhd c:\VirtualMachines\server1.vhd UnMount
  • PS> mountvhd c:\VirtualMachines\server1.vhd Compact

NOTA IMPORTANTE: Para que este archivo funcione, será necesario tener la política de ejecución irrestricta en powershell que permita la correcta ejecución de scripts. Entonces, abrir el powershel y copiar: set-executionpolicy unrestricted

Paso 2: Luego, debe crearse el archivo: ArchivoVHD.reg

Luego de crear el archivo PS1, lo segundo es insertar las entradas necesarias en el registo para que la Interfaz de Usuario  nos muestre las opciones deseadas al hacer clic con el botón derecho del mouse sobre un archivo .vhd:

Nota: se debe copiar y pegar desde la primera línea: Windows Registry Editor Version 5.00

Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\.vhd]
@=»vhdfile»
[HKEY_CLASSES_ROOT\vhdfile]
@=»Virtual Hard Disk»
[HKEY_CLASSES_ROOT\vhdfile\shell]
@=»Mount»
[HKEY_CLASSES_ROOT\vhdfile\shell\Mount]
[HKEY_CLASSES_ROOT\vhdfile\shell\Mount\command]
@=»powershell mountvhd ‘%1’ Mount»
[HKEY_CLASSES_ROOT\vhdfile\shell\UnMount]
[HKEY_CLASSES_ROOT\vhdfile\shell\Unmount\command]
@=»powershell mountvhd ‘%1’ UnMount»
[HKEY_CLASSES_ROOT\vhdfile\shell\Compact]
[HKEY_CLASSES_ROOT\vhdfile\shell\Compact\command]
@=»powershell mountvhd ‘%1’ Compact»

Una vez importado este .reg, ya tendremos las opciones Mount, Compact y UnMount disponibles en la interfaz gráfica de usuario. Dado que la opción por defecto es «Mount», eso es lo que sucederá si hacemos doble clic sobre un archivo de disco virtual .vhd

Consideraciones importantes:

  • Si el archivo que contiene el Script de PowerShell «MountVHD.ps1» no está en unca carpeta incluida en el path del sistema (System32), será necesario incluir su path completo en el .reg
  • Cuando se monta un .vhd, no aparece necesariamente una letra de unidad asociada en el Explorador de Windows (del equipo físico), ya que el disco estará offline. Es necesario ir al Disk Management (administrador de discos) y ponerlo online de manera manual.
  • La operación de compactar no muestra interfaz gráfica alguna. Es necesario fijarse en cuando desaparece la unidad que se asocia en el explorador, y tener la precaudicón de no hacer ninguna operación con ese disco ni intentar desmontarlo mientras dure el proceso.
  • Algo similar a esto puede lograrse con Virtual Server 2005 R2 SP1. Más información aquí

Como había comentado, también podrán hacerlo utilizando VBScript:

Option Explicit
 
Dim WMIService
Dim VHDService
Dim VHD
 
'Especificar el archivo .VHD a ser Montado
VHD = "F:\Windows.vhd"
 
'Tomar la Instancia 'virtualization' del servicio WMI en el computador Local
Set WMIService = GetObject("winmgmts:\\.\root\virtualization")
 
'Usar el Objeto MSVM_ImageManagementService
Set VHDService = WMIService.ExecQuery("SELECT * FROM Msvm_ImageManagementService").ItemIndex(0)
 
'Montar el archivo VHD
VHDService.Mount(VHD)

Como ven sólo utilizo el objeto  MSVM_ImageManagementService y luego llamo el método «Mount» .  Para desmontar el disco virtual  deben corren el mismo códgio pero llamando al métodol «Unmount» .

 Espero les sea de utilidad.!!

Un comentario sobre “Cómo: Montar Discos Virtuales (VHD) en Windows Explorer con Hyper-V

  1. Hola Felix, excelente artículo. Despues de ver cómo nos apoyamos en powershell para montar discos virtuales, también es bueno agregar que con powershell no solo se puede hacer esto sino que también se puede manejar y administrar en buena parte Hyper-V.

    En los siguientes links se encuentra una serie de librerías con scripts y agregados para powershell que nos permiten hacer esto:
    http://www.codeplex.com/PSHyperv
    http://www.codeplex.com/PowerShellHyperV

    Vamos a evaluar la posibilidad de tocar esto en una charla o evento, es bastante interesante y productivo.

    Un abrazo. Saludos,

Replica a Eduardo Sojo Cancelar la respuesta