Booteando Windows 7 desde VHD
No suelo escribir mucho sobre funcionalidades de Windows, pero a partir de un problema que me surgió me parece que esta nota puede ayudar a más de uno.
Como empezó mi inquietud? Me compre una netbook y para mi sorpresa la placa de red wireless no era soportada por Windows 7, después de instalarla 2 veces y cansado del proceso me busque una salida un poco más elegante. Porque no levantar el Windows 7 desde un VHD y ver cuando sale el driver de Windows Update o se me ocurre alguna cosa para levantarlo.
Como sabrán, la funcionalidad de bootear desde VHD es nativa de Windows 7 y no de vista. Así que no estoy seguro de que esto este soportado, pero en mi caso funciono. Por ende, pruébenlo bajo su propio riesgo ;).
Que use:
- Windows Vista SP2
- Windows 7 RC (Build 7100) Instalado en un VHD desde Hyper-v
Paso 1: Preparando el Windows 7
Como la funcionalidad de bootear desde VHD no está soportada por vista lo que vamos a hacer es reemplazar los archivos encargados de este proceso en vista por lo de Windows 7.
Para esto de nuestra maquina virtual de Windows 7 vamos a copiar 2 archivos:
Bootmgr
En Windows 7 RC el bootmgr está en la carpeta c:\windows\boot\pcat y obviamente oculto. Asi que lo vamos a copiar a una ubicación externa, en mi caso un pendrive y lo vamos a hacer usando xcopy, pero lo pueden hacer desde la GUI si quieren.
Para eso ubicados en la carpeta c:\windows\boot\pcat vamos a ejecutar:
Xcopy /h /y bootmgr f: (f: es mi pendrive)
Bcdedit.exe
Al igual que el bootmgr pero ubicados en c:\windows\system32 vamos a ejecutar
Xcopy /h /y bcdedit.exe f:
Una vez que resguardamos estos archivos podemos disponer del VHD de Windows 7. Lo primero que tenemos que haces es ejecutar el sysprep para que Windows esté listo para bootear en otro hardware, para eso vamos a usar el sysprep (c:\windows\system32\sysprep)

Cuando la maquina termine el proceso se apagara automáticamente dejando un VHD listo para usar.
Paso 2: preparando el Windows Vista
Lo primero que tenemos que hacer en el vista es reemplazar los archivos que tomamos del Windows 7. Para eso hacemos un backup de los files existentes: (Noten que el cmd esta corriendo como administrator)

Y luego lo reemplazamos con las versiones de Windows 7. Este paso es un poco molesto, porque Vista no nos permitirá reemplazar los archivos con el sistema levantado asi que tendremos que usar un cd booteable, yo en mi caso estoy usando el de Windows 7, pero pueden usar el de Windows Vista, BootPE, ERD o el que se les ocurra.
Una vez en este modo vamos a poder reemplazar los archivos sin problemas.
Paso 3. Configurar el doble booteo.
Ya tenemos el VHD creado, los archivos del Vista actualizados, solo nos queda probar si esto anda. Vamos a usar el bcdedit.exe para editar el booteo y registrar el VHD que generamos
La sintaxis del comando sería la siguiente:
C:\>bcdedit /copy {current} /d "Windows 7 VHD"
C:\>bcdedit /set <guid> device vhd=[Unidad:]\<Directorio>\<archivo.vhd>
C:\>bcdedit /set <guid> osdevice vhd=[Unidad:]\<Directorio>\<archivo.vhd>
C:\>bcdedit /set <guid> detecthal on
La sintaxis es medio engañosa, ya que los parámetros que están entre corchetes no son opcionales como generalmente se lee, sino que tenemos que ponerlos. En mi caso quedo asi:
C:\>bcdedit /set <guid> device vhd=[e:]\7\7.vhd
Conclusión
Hace rato que trabajo con maquinas virtuales en producción y por lo tanto con VHD, pero estoy muy sorprendido de la performance que logre con este método. Realmente no esperaba que funcione tan rápido, incluso habiendo hecho todo el proceso con un disco dinámico.
Ya estoy empezando a armar una maquina más completa en un disco de tamaño fijo para dejar mi equipo booteando de esta manera y mantener varias instancias de sistema operativo para pruebas y distintos entornos.
Espero les haya sido de utilidad
Saludos