В этой небольшой статье я покажу, как можно использовать PowerShell для сжатия и оптимизации VHD и VHDX файлов виртуальных машин. Все примеры будут выполнятся на компьютере с Windows 10 с установленной ролью Hyper-V.
Полный список командлетов PowerShell для работы с VHD файлами можно вывести так:
Get-Command -Noun VHD* -Module Hyper-V
Командлет Convert-VHD используется для смены формата виртуального диска (с VHD на VHDX и обратно), типа диска (фиксированный, динамический или разностный) и размера блока файла.
Следующая команда запустит процесс преобразования VHD файла в формат VHDX
Convert-VHD -Path 'D:\Hyper-V\Virtual Hard Disks\nano2.vhd' -DestinationPath 'D:\Hyper-V\Virtual Hard Disks\nano2.vhdx'
У командлета Convert-VHD есть несколько полезных ключей. Например, BlockSizeBytes используется для изменения размера блока, DeleteSource для удаления исходного файла после окончания конвертации, и VHDType для указания типа виртуального диска (фиксированный, динамический или разностный).
Следует помнить, что процесс конвертации выполняется в офлайн режиме (виртуальная машина, использующая данный диск должна быть выключена).
Командлет Optimize-VHD используется для оптимизации места на диске, используемого файлом динамического виртуального жесткого диска. При запуске этого командлета выполняется сжатие VHD файла.
Optimize-VHD -Path 'D:\Hyper-V\Virtual Hard Disks\srv1e.vhd'
Согласно справке, командлет не только высвобождает неиспользуемые блоки, но и перестраивает блоки для более эффективного использования дискового пространства, что также уменьшает размер VHD/VHDX файлов. В том случае, если оптимизация не требуется, команда может завершиться без изменения размера файла на диске. Параметр Mode можно использовать для изменения режима сжатия (по умолчанию используется режим Full для VHD файлов и Quick для VHDX дисков).
Командлет Resize-VHD используется для сжатия VHDX файлов или увеличения размеров дисков VHD и VHDX. Операция уменьшения размера не будет выполнена, если указан размер, меньший значения параметра MinimumSize.
Get-VHD -Path 'D:\Hyper-V\Virtual Hard Disks\srv1e.vhd'
Ключ ToMinimumSize можно использовать для автоматического уменьшения размера VHDX диска до минимально допустимого значения.
Resize-VHD -Path 'D:\Hyper-V\Virtual Hard Disks\srv1.vhdx' -ToMinimumSize