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

23

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

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

пример:

1.) Я создаю новое изображение в формате qcow2, размером 100 ГБ.

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

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

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

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

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

bmaeser
источник

Ответы:

26

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

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

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

dyasny
источник
3
Если у вас гостевая система Windows, запустите SDelete -z, чтобы обнулить все свободное пространство (шаги 1,2 выше)
ndemou
17

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

Эрик Блейк
источник
Не уверен, что это было там в 2011 году
дясный
2
@dyasny Если существующие ответы на старые вопросы со временем устарели, стоит написать новый ответ. Этот конкретный новый ответ может, однако, не соответствовать стандартам для этого сайта.
Касперд
4
@dyasny Если кто-то хочет потратить усилия на написание нового качественного ответа, каждый раз, когда старый устаревает, его следует поощрять делать это. Более тщательное обсуждение того, как обращаться с устаревшими ответами, лучше подходит для мета-анализа.
Касперд
1

virt-sparsify fileA fileBсделает все это, но на самом деле не уменьшит размер изображения. Для этого нужно добавить --compress.

cmyster
источник