Уменьшите использование диска образа xen

Два случая:

1. Если вы создаете образ жесткого диска с помощью dd и копируете его через nfs на другой сервер:

mount -o ro,remount /
dd if=/dev/sda bs=64K | gzip -c > /share/test.img.gz

затем после gunzip я получаю файл размером 20 Гб (например), заполненный нулями в конце:

du -h /md/share/test.img
21G /md/share/test.img

2. Если я создаю пустое изображение, используя dd:

dd if=/dev/zero of=/md/share/test2.img bs=1024k seek=20480 count=0

Я получил:

du -h /md/share/test2.img
0 /md/share/test2.img
ls -lah /md/share/test2.img
-rw-r--r-- 1 root root 20G Aug 2 14:46 /md/share/test2.img

После монтирования в гостевую систему я могу использовать все 20G любым способом, и размер IMG всегда равен его фактическому содержанию, без каких-либо "нулей", занимающих пространство моего массива.

Вопрос: как я могу уменьшить размер образа диска для случая 1?

Ответ: если дд поддерживает conv=sparse атрибут, он должен использоваться в дополнение к tar --sparse, Если нет, обновите coreutils и попробуйте еще раз. Остальное установить пакет libguestfs-tools и беги virt-sparcify /md/share/test.img /md/share/test_sparse.img

2 ответа

Решение

Как сказал @sam_pan_mariusz, уменьшенное изображение вы создаете "пустым" изображением в виде "разреженного" файла. Чтобы создать разреженный файл из существующего блочного устройства, добавьте conv=sparse вариант к dd if=/dev/sda [...] Команда, которую вы использовали для создания исходного изображения. Вам нужно будет поместить файл изображения в tar --sparseпотому что простое сжатие образа файла приведет к записи разреженных фрагментов, что делает их не разреженными.

Эта функция называется разреженными файлами. GNU tar --sparse обрабатывает их хорошо, кроме одного gzip.

Это также не мешает использовать zerofree на полученном изображении.

Другие вопросы по тегам