Оглавление
У вас Гипервизор Proxmox и вы создали образ диска для гостевой виртуальной машины больше чем нужно. Со временем машина стала разрастаться, но вы вовремя это заметили и удалили данные внутри нее. Теперь задачка стоит как “сжать контейнер qcow2 виртуального диска”. Не проблема.
Дисклеймер: всегда делайте резервные копии, мало ли что!
Со временем файлы гоcтевых *.qcow2 дисков могут начать занимать больше места чем фактические данные, которые они хранят. Это происходит потому, что гостевые системы при удалении файлов обычно просто помечают их нулями, но не удаляют их по факту (по причинам производительности). Поэтому в содержащим данные qcow2 файле не видно разницы между распределенным и используемым и распределенным и неиспользуемым пространством.
Для того чтобы сжать *.qcow2 файл есть два выхода: включить поддержку TRIM или пометить нулями все свободное пространство гостевой системы, а затем переконвертировать образ диска с помощью qemu-img.
Рекомендуемый план действий:
- Добиваетесь, чтобы нужный диск был корректно подключен в Proxmox
- Запускаете на гостевой машине TRIM вместе с оптимизацией пространства
- PROFIT!
Рекомендуемое решение через использование TRIM
Решать проблему рекомендуется передачей команд TRIM (которые используются при работе с SSD) из VM в хранилище гипервизора. Преимущества такого подхода в том, что он работает в автоматическом режиме, не требует перезаписи всех свободных разделов всех дисков и настраивается только единожды.
Конфигурация PVE
Требования:
- Хранилище гипервизора должно быть thin-provisioned, то есть это должен быть qcow2 диск или thin-lvm или zfs …
- Диск должен быть подключен на гостевую систему через Virtio-SCSI контроллер
- На гостевых scsi* дисковых контейнерах должна быть включена опция discard
Нужны подробности? Посмотрите: Qemu trim/discard and virtio scsi
Еще раз. Чтобы все сработало, ваш диск должен быть подключен к гипервизору по шине SCSI к контроллеру Virtio SCSI и для него должна быть включена опция Discard:
Конфигурирование гостевых ОС Linux
Для того чтобы запустить TRIM и освободить все неиспользуемое пространство в современных ОС Linux используется распространенная команда:
fstrim -av
Большинство современных дистрибутивов Linux изначально имеют преднастроенный таймер cron, который выполняет TRIM примерно раз в неделю.
Конфигурирование гостевых ОС Windows
Для систем которые поддерживаю TRIM (Win7/2008R2 и позднее) ничего настраивать не нужно. Windows сама периодически запускает TRIM
Проверить, включен ли TRIM в ОС Windows
Можно командой:
fsutil behavior query DisableDeleteNotify
Она должна возвратить 0 если TRIM включен:
fsutil behavior set DisableDeleteNotify 0
Ручной запуск TRIM на ОС Windows
Запустить TRIM и очистку Windows вручную возможно через Powershell командой:
Optimize-Volume -DriveLetter БУКВА_ВАШЕГО_ДИСКА -ReTrim -Verbose
Где вместо БУКВА_ВАШЕГО_ДИСКА надо подставить соответственно букву диска который вы хотите оптимизировать.
Решение вручную
Этот путь больше не рекомендуется и может использоваться для устаревших систем типа Windows XP и более ранних и старых дистрибутивов Linux которые не поддерживают fstrim.
За ручным вариантом решения прочитайте официальную документацию Proxmox: https://pve.proxmox.com/wiki/Shrink_Qcow2_Disk_Files
Возможные проблемы и их решение
Виртуальный диск гостевой системы Proxmox всегда можно отключить и подключить заново с нужными параметрами. Для этого придется погасить виртуальную машину.
Ваш виртуальный диск был изначально подключен не по шине SCSI
В этом случае после включения гостевая ОС Windows может не загрузиться, так как не найдет драйверов SCSI.
Вам потребуется выключить машину, подключить новый SCSI диск любого размера и скачать и подключить диск с Virtio драйверами для гостевых систем. Затем нужно загрузить гостевую ОС в работающем режиме и установить SCSI драйвер для нового подключенного SCSI диска. После этого снова выключить гостевую машину, перевести “боевой” диск на SCSI и гостевая Windows запустится.