Mucho se ha hablado ya del soporte nativo de Windows 7 y Windows Server 2008 R2 para el formato de discos virtualizados (VHD). Este soporte, que además de permitirnos el acceso a la información que está contenida en ellos, en ambos modos, lectura y escritura, nos permite también instalar y arrancar nuestro sistema operativo nativo desde uno de esos dispositivos virtuales. El despliegue y arranque del sistema operativo de forma nativa, en un VHD, es algo que en Windows 7 sólo está disponible en las ediciones superiores (Enterprise y Ultimate), sin embargo, en el servidor Windows Server 2008 R2, esta funcionalidad está disponible con cualquiera de las ediciones.
Algunas de las ventajas de este tipo de despliegue son:
- Uso de procesos similares para despliegue y gestión de imágenes para entornos virtuales y físicos.
- Arranque de múltiples sistemas operativos sin necesidad de crear particiones independientes, o mover datos para reparticionar el disco.
- Posibilidad de creación de una imagen de referencia (común) para sistemas físicos y virtuales.
Hay una ventaja adicional que no se suele considerar y que normalmente va más asociada a los entornos virtuales. De todas formas, como es algo que responde a una necesidad muy concreta, puede que no sea de aplicación en muchos entornos. Para todos aquellos que habéis podido asistir a algún evento de la gira de TechNet a finales del año pasado (Tour de la Innovación 2009), seguramente sepáis a que me refiero, para los demás vamos a empezar por el principio.
Si aún no habéis probado la instalación del sistema operativo en VHD pero estáis deseando hacerlo, aquí tenéis una descripción detallada, con un video que enseña paso a paso todo el proceso de instalación.
Instantáneas
Una de las comodidades que nos proporcionan los entornos virtuales es la posibilidad de sacar una instantánea (snapshot) de una máquina virtual, a la cual podemos volver más tarde, restaurando el estado de la máquina en el momento de la instantánea. Esto está genial, para realizar pruebas y restaurar el estado del sistema de forma rápida y sin dejar ningún rastro de las pruebas. Otra de la cosas para la que usamos las instantáneas en los entornos de demo de producto, es para tener varios puntos de acceso rápido y poder cargar distintos estados de las maquinas según lo que necesitemos enseñar. Un entorno listo en cuestión de segundos.
Ampliando este concepto a nuestros sistemas físicos, estaría genial si pudiéramos hacer lo mismo con ellos, guardar el estado en determinado momento en el tiempo, realizar todo tipo de pruebas y poder volver atrás como si nada. Uno de los escenarios que se me ocurre, aparte del de la instalación de software para pruebas, que luego vamos a descartar, sin dejar rastro, es otro que no podemos realizar con máquinas virtuales y que corresponde a la instalación y prueba de drivers, antes de su despliegue masivo en la empresa. Como la instalación del sistema operativo sigue siendo nativa, aunque este esté en un VHD, los drivers son los correspondientes a los dispositivos físicos de la máquina, por lo que esto nos permite jugar con ellos.
Antes decía que esto es algo que “estaría” genial poder hacerlo, ahora es hora de cambiar el tiempo verbal y usar otro más adecuado. No es que estuviera genial, es que realmente “está” genial porque esto lo podemos hacer mediante la creación de un disco diferencial sobre nuestro disco de instalación de sistema operativo, para esto también solemos utilizar el término “disco hijo”. Al igual que en los entornos virtualizados, en una relación de discos padre – hijo, mientras exista el hijo (disco diferencial) no podemos realizar ningún cambio al disco padre (disco original). Si se producen cambios en el padre automáticamente se invalida el hijo, por eso, normalmente en los sistemas virtuales, se suele dejar el disco padre en modo “solo lectura” mientras exista un hijo (diferencial) que apunte a él. En este caso pasará exactamente lo mismo, no vamos a poder arrancar con el sistema operativo original mientras el de pruebas sea necesario y esté en uso.
“Say cheeeese!…”
El proceso de creación de un arranque adicional, basado en un disco diferencial de un VHD existente, es bastante sencillo, se necesitan tan solo 4 comandos para realizarlo. En resumen, lo que tenemos que hacer es lo siguiente:
- Crear un disco diferencial del VHD de nuestro sistema operativo.
- Clonar la entrada de arranque, en el BCD, correspondiente a nuestro sistema operativo, añadiendo una adicional para el arranque de pruebas.
- Modificar los atributos en la entrada clonada para que apunten al disco diferencial.
El primer paso, la creación del disco hijo, no se puede realizar desde la interface gráfica, para ello necesitamos recurrir al comando diskpart. El comando a ejecutar en la consola de diskpart tendría el siguiente formato:
create vdisk file=”<ruta_disco_diferencial>” parent=”<ruta_disco_padre>”
Aquí tenéis un ejemplo de la ejecución de este comando en mi sistema, en este caso estoy creando un disco diferencial sobre un VHD de Windows 7 RC que guardo para realizar pruebas.
Ahora que ya tenemos nuestro disco diferencial, tendremos que transformarlo en una entrada adicional en nuestro BCD, para poder arrancar con nuestro sistema de pruebas. Antes de pasar a los comandos a ejecutar para realizar los pasos 2 y 3, y para que tengáis un ejemplo del estado inicial, vamos a echarle un vistazo a una parte de la información de mi BCD.
Aquí podemos observar mi entrada principal de arranque, la del boot manager, señalada con el identificador {bootmgr}, y una entrada de arranque de Windows 7 RC. Esta última es la que vamos a clonar y a convertir en nuestro sistema de pruebas.
Nota: Todo esto se tiene que realizar desde una línea de comando con permisos elevados, solamente los usuarios administradores pueden realizar cambios a la base de datos del BCD.
Todo el proceso se realiza mediante las referencias a las entradas del BCD, por lo que es importante que apuntéis los GUID (identificadores) de la entrada original y de la entrada clonada. Para obtener el GUID de la entrada clonada, podemos ejecutar el comando bcdedit sin parámetros después de realizada la copia.
Los comandos necesarios para clonar la entrada del BCD y cambiar los valores de los atributos son los siguientes:
bcdedit /copy {<GUID_entrada_original>} /d “<nombre_menu_arranque>”
bcdedit /set {<GUID_entrada_clonada>} device “vhd=[<unidad>]<ruta_disco_diferencial>”
bcdedit /set {<GUID_entrada_clonada>} osdevice “vhd=[<unidad>]<ruta_disco_diferencial>”
Esta es la ejecución de los comandos en mi sistema:
Y aquí tenemos el tan esperado estado final. Como se puede ver, tengo un arranque de sistema operativo adicional para realizar las pruebas que necesite, solo faltaría reiniciar la máquina seleccionando la entrada recién creada para usar la instancia de pruebas.
Cuando terminemos con la instancia de pruebas, y queramos descartar los cambios realizados, volviendo al estado inicial, solo tenemos que reiniciar con el sistema operativo original seleccionando la entrada correspondiente en el menú de arranque. Una vez hecho esto, podemos borrar el VHD del disco diferencial y la entrada en nuestro BCD con el comando:
bcdedit /delete {<GUID_entrada_clonada>}
¡Aúpa VHDs!
Actualización (23-09-2010): En este escenario también es posible aplicar los cambios al final de la prueba (gracias a Javier por su comentario). Para hacerlo tenemos que ejecutar un par de comandos de diskpart. Lo primero que haremos será seleccionar el disco diferencial, asegurándonos primero que ninguno de los dos está montado y con letra asignada. Esto lo hacemos con el siguiente comando desde la consola de diskpart:
select vdisk file=”<ruta_disco_diferencial>”
Una vez tengamos el disco diferencial seleccionado, podemos aplicar los cambios. El comando usado para ese fin recibe un parámetro que indica el nivel, en la jerarquía de discos, hasta el cual queremos aplicar esos cambios. En una situación normal con un disco padre y un único diferencial (hijo), este parámetro tomaría el valor 1, en casos con más niveles indicaríamos a cuantos niveles para abajo queremos aplicar los cambios. En resumen, en el escenario de un padre con un diferencial usaríamos el siguiente comando de diskpart:
merge vdisk depth=1
Aquí tenéis un ejemplo de la ejecución de esta prueba en mi máquina, con un disco padre (Padre.vhd) y un disco diferencial (Hijo.vhd).