Cómo reducir automáticamente un archivo vhdx de Hyper-V después de usar una VM en Windows 11
🔍 WiseChecker

Cómo reducir automáticamente un archivo vhdx de Hyper-V después de usar una VM en Windows 11

Las máquinas virtuales de Hyper-V en Windows 11 crean archivos .vhdx que crecen con el tiempo a medida que instala software, actualiza el sistema operativo o copia archivos. Incluso después de eliminar datos dentro de la VM invitada, el archivo .vhdx del lado del host no se reduce automáticamente para recuperar ese espacio libre. Esto provoca un desperdicio de espacio en disco en el equipo host, a veces decenas de gigabytes por VM. Este artículo explica cómo configurar la compactación automática de archivos .vhdx después de cada apagado de la VM, mediante un script de PowerShell activado por una tarea programada.

Puntos clave: Compactación automática de archivos VHDX de Hyper-V después de su uso

  • Optimize-VHD -Path C:\VMs\VMName.vhdx -Mode Full: El cmdlet de PowerShell que compacta un archivo .vhdx de expansión dinámica recuperando el espacio no utilizado.
  • Programador de tareas > Crear tarea > Desencadenadores > Al desconectarse de la sesión de usuario: El desencadenador que ejecuta el script de compactación cada vez que apaga o se desconecta de una VM.
  • Mount-VHD y Dismount-VHD: Cmdlets necesarios para adjuntar el .vhdx y optimizarlo, y luego desadjuntarlo cuando finaliza la operación.

ADVERTISEMENT

Cómo funcionan la expansión dinámica y la compactación de VHDX en Hyper-V

Hyper-V ofrece dos formatos principales de disco: de tamaño fijo y de expansión dinámica. Un archivo .vhdx de expansión dinámica comienza con un tamaño pequeño, normalmente unos pocos megabytes, y crece a medida que el sistema operativo invitado escribe datos. Cuando elimina archivos dentro de la VM, el archivo .vhdx no se reduce automáticamente. El espacio se marca como libre dentro del invitado, pero el archivo del lado del host permanece en su tamaño máximo.

El proceso de compactación utiliza el cmdlet de PowerShell Optimize-VHD. Este cmdlet lee el archivo .vhdx y lo reescribe, omitiendo los sectores que el sistema operativo invitado ha marcado como libres. El resultado es un archivo del lado del host más pequeño. La compactación requiere que el .vhdx esté montado en el host durante la operación. Después de la compactación, el .vhdx debe desmontarse para que la VM pueda acceder a él con normalidad.

Para esta automatización, necesita una VM apagada o guardada. No se puede compactar el disco de una VM en ejecución. El script montará el .vhdx, ejecutará Optimize-VHD y luego lo desmontará. La tarea programada se activa después de que la VM se detiene, lo que ocurre cuando cierra la conexión de la VM o apaga el invitado.

Pasos para configurar la compactación automática de VHDX en Windows 11

Este proceso utiliza un script de PowerShell y un desencadenador del Programador de tareas. El script se ejecuta después de que se desconecta de una sesión de VM, lo que normalmente coincide con el apagado de la VM. Los pasos siguientes suponen que tiene Hyper-V habilitado y al menos una VM con un archivo .vhdx de expansión dinámica.

  1. Abra PowerShell como administrador
    Presione la tecla Windows, escriba PowerShell, haga clic con el botón derecho en Windows PowerShell en los resultados y seleccione Ejecutar como administrador. Haga clic en Sí en el aviso de Control de cuentas de usuario.
  2. Cree el script de compactación
    En la ventana de PowerShell, ejecute el siguiente comando para crear un nuevo archivo de script en una carpeta de su elección. Reemplace C:\Scripts con la ruta que prefiera.

    New-Item -ItemType Directory -Path "C:\Scripts" -Force

    Luego cree el archivo de script con este contenido. Copie y pegue el bloque completo en PowerShell:

    @"
    param([string]\$VmName)

    # Get the VM object
    \$VM = Get-VM -Name \$VmName -ErrorAction SilentlyContinue
    if (-not \$VM) { exit }

    # Get all hard disk drives attached to this VM
    \$Disks = \$VM.HardDrives | Where-Object { \$_.Path -like "vhdx" }
    if (-not \$Disks) { exit }

    foreach (\$Disk in \$Disks) {
    \$VhdPath = \$Disk.Path
    try {
    Mount-VHD -Path \$VhdPath -ReadOnly
    Optimize-VHD -Path \$VhdPath -Mode Full
    Dismount-VHD -Path \$VhdPath
    } catch {
    # Log error if needed
    }
    }
    "@ | Out-File -FilePath "C:\Scripts\Compact-VHD.ps1" -Encoding utf8

    Este script acepta un nombre de VM como parámetro, busca todos los discos .vhdx conectados a esa VM, monta cada uno como de solo lectura, ejecuta Optimize-VHD y lo desmonta.

  3. Abra el Programador de tareas
    Presione Windows + R, escriba taskschd.msc y presione Entrar. Esto abre la consola del Programador de tareas.
  4. Cree una nueva tarea para el script de compactación
    En el panel Acciones de la derecha, haga clic en Crear tarea. Se abre el cuadro de diálogo Crear tarea.
  5. Asigne un nombre a la tarea y configure las opciones de seguridad
    En la pestaña General, escriba un nombre como Compact Hyper-V VHDX on Disconnect. En Opciones de seguridad, seleccione Ejecutar tanto si el usuario inició sesión como si no. Marque Ejecutar con los privilegios más altos. Esto otorga al script permiso para montar y optimizar archivos VHD.
  6. Configure el desencadenador para que se active al desconectarse la sesión de usuario
    Vaya a la pestaña Desencadenadores y haga clic en Nuevo. En la lista desplegable Iniciar la tarea, seleccione Al desconectarse de la sesión de usuario. En Configuración, deje el valor predeterminado Cualquier usuario. Haga clic en Aceptar. Este desencadenador se activa cada vez que cierra la ventana de conexión de la VM, lo que suele ocurrir después de apagar o guardar la VM.
  7. Configure la acción para ejecutar el script de PowerShell
    Vaya a la pestaña Acciones y haga clic en Nuevo. En la lista desplegable Acción, asegúrese de que esté seleccionada la opción Iniciar un programa. En el cuadro Programa/script, escriba powershell.exe. En el cuadro Agregar argumentos, pegue lo siguiente:

    -ExecutionPolicy Bypass -File "C:\Scripts\Compact-VHD.ps1" -VmName "YourVMName"

    Reemplace YourVMName con el nombre exacto de su VM de Hyper-V. Si tiene varias VM, cree tareas independientes para cada una. Haga clic en Aceptar.

  8. Configure las condiciones y la configuración
    Vaya a la pestaña Condiciones. Desmarque Iniciar la tarea solo si el equipo está conectado a la red eléctrica si desea que se ejecute con batería. En la pestaña Configuración, marque Permitir que la tarea se ejecute a petición. Establezca Si la tarea no se realiza correctamente, reiniciarla cada en 1 minuto y Intentar reiniciar hasta en 3 veces. Esto ayuda si el .vhdx está bloqueado temporalmente. Haga clic en Aceptar para guardar la tarea. Escriba su contraseña si se le solicita.
  9. Pruebe la automatización
    Cierre la ventana de conexión de la VM que configuró. Espere de 30 a 60 segundos. Abra el Explorador de archivos y vaya a la ubicación del archivo .vhdx. Haga clic con el botón derecho en el archivo .vhdx, seleccione Propiedades y anote el Tamaño en disco. Compárelo con el tamaño anterior. Debería ser menor si la VM tenía espacio libre en su interior.

ADVERTISEMENT

Problemas comunes y limitaciones de la compactación automática

El archivo .vhdx está bloqueado y no se puede montar

Si la VM sigue en ejecución o en estado guardado con el disco conectado, el montaje del .vhdx como de solo lectura fallará. El script incluye un bloque try-catch que finalizará silenciosamente si Mount-VHD falla. Asegúrese de que la VM esté completamente apagada o guardada antes de que se ejecute la tarea. El desencadenador de desconexión suele funcionar porque cerrar la ventana de conexión de la VM activa el evento después de que la VM se haya detenido.

Optimize-VHD tarda demasiado y se retrasa el siguiente inicio de la VM

Compactar un archivo .vhdx grande, como uno de más de 100 GB, puede tardar varios minutos. Si inicia la VM antes de que finalice el script, la compactación fallará porque el .vhdx sigue montado. Para evitarlo, configure la tarea para que se ejecute con un retraso. En las propiedades del desencadenador, establezca un retraso de 5 a 10 minutos. Esto da tiempo al script para completarse antes de que intente iniciar la VM de nuevo.

El script no se ejecuta después de desconectarse de una VM

El desencadenador de desconexión se activa para cualquier desconexión de sesión de usuario, no solo para las ventanas de conexión de VM. Si se desconecta de una sesión de Escritorio remoto o bloquea su estación de trabajo, la tarea también se ejecutará. Esto es inofensivo porque el script comprueba un nombre de VM y finalizará si la VM no existe. Para evitar ejecuciones innecesarias, cree una tarea independiente para cada VM y use una condición que compruebe si la VM está apagada antes de ejecutar el script.

La compactación no reduce el archivo tanto como se esperaba

Optimize-VHD solo recupera el espacio que el sistema operativo invitado ha marcado como libre. Si el sistema de archivos invitado está fragmentado o si hay archivos grandes que se eliminaron pero el espacio aún no se ha marcado como libre, la compactación no recuperará ese espacio. Ejecute Optimize-Volume -DriveLetter C -ReTrim -Verbose dentro de la VM invitada antes de apagarla. Este comando indica al invitado que recorte los bloques no utilizados, lo que los hace disponibles para que el host los recupere.

Compactación manual frente a script automático: diferencias clave

Elemento Compactación manual Script automático
Desencadenador Usted ejecuta Optimize-VHD manualmente cuando es necesario Se ejecuta automáticamente después de la desconexión de la VM
Estado de la VM requerido La VM debe estar apagada o guardada La VM debe estar apagada (activado por la desconexión)
Esfuerzo por VM Recordar ejecutar la compactación periódicamente Configurar una vez por VM
Riesgo de pérdida de datos Bajo si sigue los pasos adecuados Bajo, el script monta como de solo lectura
Recuperación de espacio Inmediata después de que finaliza el comando Retrasada hasta después del apagado de la VM
Ideal para Limpieza única o uso poco frecuente Usuarios frecuentes de VM que necesitan una recuperación de espacio constante

La compactación manual le ofrece control total y es más sencilla de realizar de forma ocasional. El script automático es mejor para los usuarios que ejecutan VM a diario y quieren recuperar espacio sin recordar ejecutar el comando. Ambos métodos usan el mismo cmdlet Optimize-VHD y producen resultados idénticos.

El script automático monta el .vhdx como de solo lectura, por lo que no hay riesgo de corrupción de datos. El método manual normalmente requiere que apague la VM y ejecute el comando directamente en el host. El script también registra los errores en la consola de PowerShell, que puede redirigir a un archivo si necesita un registro de la actividad de compactación.

Después de configurar el script automático, puede supervisar su ejecución consultando el historial del Programador de tareas. Haga clic con el botón derecho en la tarea y seleccione Historial para ver cuándo se ejecutó por última vez y si se realizó correctamente. Si la tarea falla, la configuración de reinicio intentará ejecutarla hasta tres veces. Si los errores persisten, compruebe la ruta del script y asegúrese de que el nombre de la VM coincida exactamente.

Ahora tiene una solución totalmente automatizada que reduce sus archivos .vhdx de Hyper-V después de cada uso de la VM. Esto evita que la unidad del host se llene de espacio no utilizado. Para un control avanzado, modifique el script para compactar solo los archivos VHDX que superen un tamaño determinado, o agregue el registro en un archivo de texto. Combine esto con el recorte periódico dentro del invitado mediante Optimize-Volume -ReTrim para obtener la máxima recuperación de espacio.

ADVERTISEMENT