Со временем эксплуатации виртуальных машин на Hyper-V возникает необходимость сжатия дисков. В моём случае виртуальная машина с AlmaLinux на борту занимала место на разделе 8.5 Гб. При этом VHDX был размером в 23 Гб. Запуск операции сжатия средствами Hyper-V давал нулевой результат. То есть VHDX не сжимался. Решение оказалось простое: нужно забить свободное пространство нулями.

1. Забиваем диск нулями:

1.1. Если у Вас VHDX лежит на SSD диске, то самый быстрый вариант использовать команду fstrim:

# fstrim /

После этого снова запускаем сжатие VHDX средствами Hyper-V. На этот раз диск сжался до положенных 8.5 Гб:

1.2. Если у Вас VHDX лежит на HDD диске, то ищем альтернативные варианты:

1.2.1. Создание и удаление файла с нулями командой dd:

# dd if=/dev/zero of=~/zeroes
# sync
# rm ~/zeroes

1.2.2. Использовать утилиту zerofree в безопасном режиме (resque mode):

# zerofree /dev/sda1

В случае нескольких разделов на VHDX данную команду можно выполнить для каждого из них, чтобы достичь максимальный результат.

1.2.3. Использовать утилиту sfill из пакета secure-delete:

# sfill -llz /

В данном случаем можно задать конкретную папку, которую хотите вычистить из VHDX.

2. Сжимаем VHDX диск:

Optimize-VHD -Path $VHD -Mode Full

Перед сжатием убедитесь, что ВМ, к которой подключен сжимаемый VHDX диск, находится в выключенном состоянии.