Два случая:
1.Если создать образ hdd с помощью 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
После установки в гостевую систему я могу использовать все 20 ГБ любым способом, и размер IMG всегда равен его фактическому содержимому, без каких-либо «нулей», занимающих пространство моего массива.
Вопрос: как уменьшить размер образа диска для случая 1?
Ответ: если dd поддерживает conv=sparse
атрибут, он должен использоваться в дополнение к tar --sparse
. Если нет, обновите coreutils
и попробуйте еще раз. Другой установочный пакет libguestfs-tools
и беги virt-sparcify /md/share/test.img /md/share/test_sparse.img
Эта функция называется разреженные файлы. GNU tar --sparse
справляется с ними хорошо, кроме gzip.
Также не повредит использовать zerofree
на получившемся изображении.
Как сказал @sam_pan_mariusz, изображение уменьшенного размера вы создаете свое «пустое» изображение как «разреженный» файл. Чтобы создать разреженный файл из существующего блочного устройства, добавьте conv=sparse
вариант для dd if=/dev/sda [...]
команда, которую вы использовали для создания исходного изображения. Вам нужно будет поместить файл изображения в tar --sparse
, потому что простое сжатие образа файла приведет к тому, что разреженные фрагменты будут записаны, что сделает их не разреженными.