Со временем эксплуатации виртуальных машин на 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 диск, находится в выключенном состоянии.