мы используем kvm / qemu с образами qcow2 для наших виртуальных машин.
qcow2 имеет замечательную особенность, при которой файл образа выделяет виртуальной машине только фактически необходимое пространство. но как уменьшить размер файла изображения, если выделенное пространство виртуальной машины становится меньше?
пример:
1.) создаю новый образ в формате qcow2 размером 100ГБ
2.) Я использую этот образ для установки ubuntu. для установки требуется около 10 ГБ, размер файла-образа увеличивается примерно до 10 ГБ. пока ничего неожиданного.
3.) Я заполняю образ примерно 40 ГБ дополнительных данных. размер файла-образа увеличивается до 50 ГБ. я согласен с этим :-)
4.) Вот где это становится странным: я удаляю все 40 ГБ данных с образа, но размер образа по-прежнему съедает 50 ГБ.
вопрос: как мне освободить эти 40 ГБ данных и уменьшить изображение до необходимых 10 ГБ?
заранее спасибо, Берни
Изображение не сжимается автоматически, поскольку при удалении файлов вы фактически не удаляете данные (вот почему работает функция восстановления). Qemu имеет возможность сжать образы qcow2 обратно, но на самом деле утилита дедуплицирует нули с диска, оставляя всю остальную информацию нетронутой. Итак, идея заключалась бы в следующем:
dd if=/dev/zero of=/some/file
пока у вас не закончится место)qemu-img convert -O qcow2 original_image.qcow2 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 и т. Д.).
Пошаговые инструкции по конвертации на месте
Выключите виртуальную машину
Сохраните резервную копию
Перерабатывать: virt-sparsify --in-place disk.img
Пошаговая инструкция конвертации в другой файл (это безопаснее, но требует больше свободного места):
Выключите виртуальную машину
Перерабатывать: virt-sparsify disk.img new-file.img
Заменить старый файл новым изображением: mv disk.img disk.img.bak && mv new-file.img disk.img
Если виртуальная машина запускается нормально, вы можете удалить резервную копию: rm disk.img.bak
P.S .: Вы также можете конвертировать между форматами, используя virt-sparsify:
virt-sparsify disk.raw --convert qcow2 disk.qcow2