Когда VHDX вышел из-под контроля

Ubunta в виртуалке с «резиновым» VHDX разрослась до размера диска и перестала стартовать.

Да, у «сисадминов от бога» и такое рано или поздно всегда иногда случается )))

Ubuntu Live CD идёт с GUI по умолчанию и надо править загрузчик, чтобы загрузить её только с терминалом. Даже постоянно «тыкая» кнопку «возобновить» не полчается нормально добраться до окончания загрузки версии с GUI. Mini.iso — официальные мини-образы от Ubuntu — вообще Live-загрузку не поддерживают.

Итак, после часа метаний и установки всяких странных, но маленьких образов системы, я нашёл то, что реально сработало! Образ называется grml64. Приведу цитату из Wiki:

Grml — дистрибутив Linux, основанный на Debian запускающийся в режиме LiveCD.Дистрибутив запускается в режиме LiveCD или LiveUSB с набором инструментов для системного администрирования.

Короче, вещь просто отличная! После загрузки желает нам Счастливого хакинга )) Скачать можно прямо с официального сайта: https://grml.org/download/

Первой задачей стало удаление «свободного, но несвободного» места. Дело в том, что когда из файловой системы удаляется файл, то фактически он не удаляется, а просто помечается «удалённым». Из-за этого начинает «распухать» образ виртуальной машины.

Тут надо обязятельно загрузиться с Live CD версии системы, чтобы можно было размонтировать раздел, который будем «занулять».

Если в систему можно загрузиться нормально — можно также почистить систему руками — поудалять, например, старые логи, почистить кэш. Ещё можно использовать следующие команды:

sudoapt clean
sudo apt autoclean
sudo apt autoremove

Далее останавливаем машину и подкидываем для загрузки образ grml. Грузимся.

Кстати, утилита zerofree уже установления в этом образе по умолчанию. Дальше надо понять, какой раздел мы чистим. Тут нам поможет следующая команда (у меня команду sudo можно было не использовать):

sudo fdisk -l

Находим нужный нам, например как в моём случае, /dev/sda2 b запускаем в работу zerofree

zerofree -v /dev/sda2

После длительного ожидания и постоянного возобновления виртуальной машины дожидаемся окончания работы утилиты. Завершаем работу виртуалки.

Далее нам надо перейти на хостовую машину, на которой крутится Hyper-v.

Открываем свойства машины, выбираем диск, нажимаем Edit и дальше протыкиваем Compact.

Однако, в моём случае это не помогло. Совсем. Ни мегабайта не освободилось. «Косяк», — подумал я и погрузился в гуглинг. И через некоторое время я нашёл решение.

На хостовой машине запускаем cmd с повышенными правами и используем diskpart следующим образом:

diskpart
select vdisk file="c:\vhdx\yourdisk.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit

И это сработало!

Затем, я загрузился с live cd gparted и обрезал раздел.

К сожалению, Сделать vhdx’у Shrink не вышло — система начала валиться в initramfs. Ну, не везде же нам побеждать )))

Пока искал информацию, наткнулся на способ уменьшить VHDX через PowerShell.

Нужно запустить PowerShell от администратора с повышенными правами и произвести следующие манипуляции:

#Замаунтить виртульный диск только для чтения
Mount-VHD -Path "c:\vhdx\yourdisk.vhdx" -ReadOnly
# Ужать
Optimize-VHD -Path "c:\vhdx\yourdisk.vhdx" -Mode Full
# Размаунтить =)
Dismount-VHD -Path "c:\vhdx\yourdisk.vhdx"

В следующий раз обязательно проверю…