
У меня есть разреженный сырой образ 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 этого образа.