Generar y personalizar VHDs con Convert-WindowsImage.ps1

Hola

Una excelente manera de generar VHDs con una imagen limpia de sistema operativo para usarlos como base de máquinas virtuales o incluso de equipos físicos utilizando “Boot from VHD” es utilizar la herramienta Convert-WindowsImage.ps1 que podéis descargar desde aquí:

Esta herramienta es la heredera para Windows 8 y Windows Server 2012 de Wim2VHD, que tenia una funcionalidad muy similar y que se basa en el mismo principio. El fichero install.wim que se incluye en la carpeta \sources de todo medio de instalación de Windows desde los tiempos de Windows Vista y Windows Server 2008 contiene una o varias imágenes genéricas del Sistema Operativo, que es lo que se vuelca sobre el disco/partición/volumen de destino del equipo que estamos instalando. Ese volcado se lleva a cabo durante esa aburrida fase de la instalación en la que se copian y expanden los ficheros, que es la que nos vamos a ahorrar, entre otras, usando esta técnica. Convert-WindowsImage nos permite generar un VHD o VHDX del tamaño y características que queramos, y aplicarle la imagen de Windows deseada. De ese modo, al arrancar un equipo, físico o virtual, desde ese disco virtual iremos directamente a la fase de personalización del Sistema Operativo, que podemos automatizar también usando un fichero de respuestas.

Aunque el script de Powershell esta pensado para ejecutarse por línea de comandos con sus parámetros correspondientes, tiene uno muy cómodo (-ShowUI) que nos lanza una interfaz gráfica

 

image

 

image

Vamos a rellenar los campos con un ejemplo. Crearemos un VHDX, de tipo dinámico y con 20 Gb de tamaño, con una instalación de Windows Server 2012 Standard. Como podemos ver, dentro del install.wim de un DVD/ISO de Windows Server 2012 tenemos realmente cuatro imágenes, correspondientes a las ediciones de Standard y Datacenter en sus modos de instalación Full y Server Core. Vamos a aprovechar también para personalizarlo un poco, especificando la contraseña del administrador, la zona horaria, configuración regional la distribución del teclado, o nuestra clave de producto, de modo que nos ahorremos contestar a todo eso al arrancar posteriormente. Podríamos también darle nombre al servidor, meterlo en el dominio, agregarle roles y funcionalidades, habilitar el escritorio remoto, configurar el firewall, etc. Sin embargo, vamos a dejarlo en un punto que nos permita usarlo, por ejemplo como disco padre de diferentes máquinas virtuales o como embrión de una plantilla genérica de máquina virtual:

image

El unattend.xml lo podemos generar con el Windows System Image Manager (SIM) incluido en el Windows Assestment and Deployment Kit (ADK), una herramienta sencillamente imprescindible que podéis descargar de aquí: 

Abrimos la imagen de Windows Server 2012 del DVD/ISO y agregamos los componentes Microsoft-Windows-Shell-Setup y Microsoft-Windows-Internation-Core que es donde encontraremos las opciones mencionadas arriba:

image

Con lo que nos quedaría (poned vuestro Product Key, datos de organizacion y los Locales que correspondan a vuestra región si es diferente a España y Español – Internacional):

 <?xml version="1.0" encoding="utf-8"?>
 <unattend xmlns="urn:schemas-microsoft-com:unattend">
     <settings pass="specialize">
         <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="https://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance">
             <ProductKey>XXXXX-XXXXX-XXXXX-XXXXX-XXXXX</ProductKey>
             <RegisteredOwner>Microsoft</RegisteredOwner>
             <RegisteredOrganization>Microsoft</RegisteredOrganization>
         </component>
     </settings>
     <settings pass="oobeSystem">
         <component name="Microsoft-Windows-International-Core" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="https://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance">
             <InputLocale>es-ES</InputLocale>
             <SystemLocale>es-ES</SystemLocale>
             <UserLocale>es-ES</UserLocale>
         </component>
         <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="https://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance">
             <UserAccounts>
                 <AdministratorPassword>
                     <Value>VQBBAEIAQQBBAEgATQBBAGMAdwBCADMAQQBEAEEAQQBjAGcAQgBrAEEAQwA0AEEAUQB3AEEAdwBBAEcAMABBAGMAQQBCAHMAQQBLAHcAZwBhAGcAQgBBAEEARQBFAEEAWgBBAEIAdABBAEcAawBBAGIAZwBCAHAAQQBIAE0AQQBkAEEAQgB5AEEARwBFAEEAZABBAEIAdgBBAEgASQBBAFUAQQBCAGgAQQBIAE0AQQBjAHcAQgAzAEEARwA4AEEAYwBnAEIAawBBAEEAPQA9AEEAZABtAGkAbgBpAHMAdAByAGEAdABvAHIAUABhAHMAcwB3AG8AcgBkAA==</Value>
                     <PlainText>false</PlainText>
                 </AdministratorPassword>
             </UserAccounts>
             <RegisteredOwner>Microsoft</RegisteredOwner>
             <RegisteredOrganization>Microsoft</RegisteredOrganization>
             <OOBE>
                 <HideEULAPage>true</HideEULAPage>
             </OOBE>
         </component>
     </settings>
     <cpi:offlineImage cpi:source="wim:d:/sources/install.wim#Windows Server 2012 SERVERDATACENTER" xmlns:cpi="urn:schemas-microsoft-com:cpi" />
 </unattend>

 

Ya podemos generar el VHDX y ver como el script termina el trabajo en la ventana de Powershell:

image

Y el resultado. Una máquina virtual generada sobre ese VHDX que nos arranca directamente aquí:

image

NOTA: El script parece tener un bug que produce que no se inyecte el fichero unattend.xml dentro del disco que se genera cuando se especifica dicha opción desde la interfaz gráfica. Tenemos dos workarounds:

  • Lanzar la herramienta enteramente con todos sus parámetros por línea de comando. El equivalente al ejemplo anterior sería
    • .\Convert-WindowsImage.ps1 –WIM d:\sources\install.wim -edition ServerStandard -Size 20GB -DiskType Dynamic -VHDFormat VHDX -Unattend c:\Temp\Unattend.xml -VHD C:\Temp\Win2012Standard.vhdx
  • Inyectar nosotros a mano el fichero unattend.xml. Para ello, montamos el fichero resultante haciendo doble clic, copiamos el unattend.xml a la raíz del disco y lo desmontamos para poderlo usar.

Saludos

David Cervigón