Назад | Перейти на главную страницу

освободить неиспользуемое пространство в файле образа qcow2 на kvm / qemu

мы используем kvm / qemu с образами qcow2 для наших виртуальных машин.

qcow2 имеет замечательную особенность, при которой файл образа выделяет виртуальной машине только фактически необходимое пространство. но как уменьшить размер файла изображения, если выделенное пространство виртуальной машины становится меньше?

пример:

1.) создаю новый образ в формате qcow2 размером 100ГБ

2.) Я использую этот образ для установки ubuntu. для установки требуется около 10 ГБ, размер файла-образа увеличивается примерно до 10 ГБ. пока ничего неожиданного.

3.) Я заполняю образ примерно 40 ГБ дополнительных данных. размер файла-образа увеличивается до 50 ГБ. я согласен с этим :-)

4.) Вот где это становится странным: я удаляю все 40 ГБ данных с образа, но размер образа по-прежнему съедает 50 ГБ.

вопрос: как мне освободить эти 40 ГБ данных и уменьшить изображение до необходимых 10 ГБ?

заранее спасибо, Берни

Изображение не сжимается автоматически, поскольку при удалении файлов вы фактически не удаляете данные (вот почему работает функция восстановления). Qemu имеет возможность сжать образы qcow2 обратно, но на самом деле утилита дедуплицирует нули с диска, оставляя всю остальную информацию нетронутой. Итак, идея заключалась бы в следующем:

  1. Залейте диск нулями (dd if=/dev/zero of=/some/file пока у вас не закончится место)
  2. удалить / некоторые / файл
  3. выключить виртуальную машину
  4. cd туда, где хранятся образы для виртуальной машины, и запускаются qemu-img convert -O qcow2 original_image.qcow2 deduplicated_image.qcow2
  5. измените настройки виртуальной машины, чтобы использовать новый deduplicated_image.qcow2, протестируйте работу виртуальной машины и удалите старый образ

Это, afaik, будет работать только с изображениями qcow2, я не тестировал другие форматы.

virt-sparsify может сделать все это без лишних хлопот с вашей стороны: http://libguestfs.org/virt-sparsify.1.html

В дополнение к принятому ответу (который описывает более общий, общий метод сжатия файла qcow2) современная версия (например, RHEL7 +) стека libvirt / qemu / qcow2 поддерживает virtio-scsi драйвер, который поддерживает discard='unmap' вариант.

Если виртуальная машина использует virtio-scsi а определение libvirt включает discard='unmap', простой fstrim в гостевой файловой системе освободит назначенное, но неиспользуемое свободное пространство на хосте. Это можно проверить с помощью du -hs <guestdisk> на стороне хозяина (примечание: ls -al <guestdisk> воля не показать реальный выделенный размер, только логический).

Для даже более новых экземпляров libvirt / qemu (например, RHEL8 +) размер гостевого файла можно уменьшить, даже если гостевая ОС не поддерживает обрезку: включив обе discard='unmap' и discard_zeroes='unmap' (и используя virtio-scsi драйвер), записывая последовательный нулевой поток на гостевой стороне (то есть через dd if=/dev/zero of=/zero.img bs=1M count=1024) вызовет обрезку затронутых диапазонов LBA по размеру хоста. Однако обратите внимание, что это может потребовать больших ресурсов процессора для хоста (который должен был «анализировать» любую гостевую запись в поисках повторяющихся нулей), поэтому его следует включать только в определенных случаях.

Оба метода уменьшат физический выделенный размер (какой du -hs показывает). Для уменьшения логического размера (какой простой ls -al дает) вам нужно использовать virt-spasify или qemu-img (как описано в других ответах).

virt-sparsify --compress fileA fileB уменьшит размер изображения, однако он создаст изображение qcow2 как другой файл, поэтому вам придется переименовывать и перемещать объекты. Вы не можете использовать --compress и --in-place в то же время. См. Следующую ссылку, чтобы узнать больше. http://libguestfs.org/virt-sparsify.1.html

Ты можешь использовать вирт-разреженный для этого. Он автоматически обнуляет и разрежает свободное пространство в большинстве файловых систем, которые он находит в образе исходного диска (поддерживает ext2 / 3/4, btrfs, NTFS и т. Д.).

Пошаговые инструкции по конвертации на месте

  1. Выключите виртуальную машину

  2. Сохраните резервную копию

  3. Перерабатывать: virt-sparsify --in-place disk.img

Пошаговая инструкция конвертации в другой файл (это безопаснее, но требует больше свободного места):

  1. Выключите виртуальную машину

  2. Перерабатывать: virt-sparsify disk.img new-file.img

  3. Заменить старый файл новым изображением: mv disk.img disk.img.bak && mv new-file.img disk.img

  4. Если виртуальная машина запускается нормально, вы можете удалить резервную копию: rm disk.img.bak

P.S .: Вы также можете конвертировать между форматами, используя virt-sparsify:

virt-sparsify disk.raw --convert qcow2 disk.qcow2