rsync разреженного образа qemu увеличивает размер диска

rsync разреженного образа qemu увеличивает размер диска

У меня есть разреженный сырой образ QEMU, который я хочу перенести на другой сервер. qemu-img infoВыдает:

image: sparse.img
file format: raw
virtual size: 50G
disk size: 16G

Я передаю его с помощью:

rsync -azhP --sparse origin:/path/to/img/sparse.img .

Теперь на целевом сервере у меня есть:

image: sparse.img
file format: raw
virtual size: 50G
disk size: 40G

Однако после virt-sparsifyповторного запуска скопированного изображения я получаю следующее:

image: sparse.img
file format: raw
virtual size: 50G
disk size: 16G

Оба сервера работают под управлением CentOS 7.2 на файловой системе XFS. Так что же произошло?

Обновлять:

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

Вы можете продолжить tarпередачу с помощью rsync --inplace, чтобы убедиться, что файл был передан без ошибок, как объясненоздесь.

ДругойрешениеБыло предложено создать пустой разреженный файл того же размера в месте назначения, а затем использовать его rsync --inplaceдля передачи реальных данных.

Я не писал это как решение, потому что это на самом деле не объясняет, почему все rsync --sparseтак себя ведет.

решение1

Держу пари, что это связано с различиями в ФС между источником и местом назначения.

Позвольте мне пояснить на примере. Разреженные файлы — это файлы, пустые блоки которых (т.е. заполненные нулями) не размещены на диске. Чем меньше размер блока на ФС, тем вероятнее, что такой блок может быть найден. Таким образом, ваша проблема может быть связана с тем, что размер блока на месте назначения больше, чем на источнике.

Возможно, есть и другие параметры XFS, о которых я не знаю.

Смотрите такжеэтот вопрос на ServerFault

решение2

Решение, которое я нашел наиболее подходящим для меня, — это сначала запустить

virt-sparsify imagename

Требуется некоторое время. Это создает образ меньшего размера, который сообщает тот же размер как в ls -h, du -hтак и du -h --apparent-size. Но когда вы монтируете образ, он сообщает правильный размер (и увеличивается, как и ожидалось).

Затем выполните rsync этого образа.

Связанный контент