Как я могу ускорить операции с разреженными файлами с помощью tar, gzip, rsync?

9

У меня есть редкий файл. ( du -hсообщает 3G и du -h --apparent-sizeсообщает 100G.) Пока все хорошо.

Теперь, когда я хочу сжать файл с помощью tarили отправить его по сети rsync, это потребует столько же времени, сколько и 3G. Кажется, эти инструменты читают все нули.

Я думал, что отверстия как-то помечены, и эти инструменты могут как-то просто пропустить их?

Вероятно, нет проблем с моим файлом?

Это отсутствующая функция в tarи rsyncне искать разреженные файлы? Я использовал tarпараметр --sparse, но это не ускорило ситуацию. Ни один не сделал rsyncпараметр --sparse.

Есть ли способ ускорить эти инструменты на разреженных файлах?

adrelanos
источник

Ответы:

7

bsdtar(по крайней мере, из libarchive3.1.2) способен обнаруживать разреженные разделы с помощью FS_IOC_FIEMAPioctl в файловых системах, которые его поддерживают (хотя он также поддерживает ряд других API), однако, по крайней мере, в моем тесте, как ни странно, это не в состоянии обрабатывать tarфайлы, которые он генерирует сам (хотя выглядит как ошибка).

Однако использование GNU tarдля их извлечения работает, но тогда GNU tar не может обрабатывать некоторые расширенные атрибуты, которые поддерживает bsdtar.

Так

bsdtar cf - sparse-files | (cd elsewhere && tar xpf -)

работает до тех пор, пока файлы не имеют расширенных атрибутов или флагов.

Это все еще не работает для файлов, которые полностью разрежены (только нули), поскольку FS_IOC_FIEMAPioctl затем возвращает 0 экстентов, и похоже, bsdtarчто не обрабатывает это должным образом (еще одна ошибка?).

star( Schily tar ) - еще одна реализация tar с открытым исходным кодом, которая может обнаруживать разреженные файлы (используйте -sparseопцию) и не имеет этих ошибок bsdtar(но не упаковывается во многих системах).

Стефан Шазелас
источник
2

Эта статья имеет несколько полезных предложений по rsyncкрайней мере:

Проблемы

Использование rsync --sparse works, но вызывает огромное количество ненужных записей на диск. Изменение 10 байтов на длину 50 ГБ (используется 1 ГБ) должно привести к записи только одного или двух блоков, что приводит к записи 1 ГБ. Это медленно и, возможно, не очень хорошо для долговечности дисков.

Использование rsync --inplaceработает, но создает не разреженные файлы.

Вы не можете использовать --sparse и --inplace одновременно :-( это не разрешено rsync. Rsync: --sparse нельзя использовать с --inplace

Решение

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

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

Тогда rsync --inplace будет работать так, как задумано, оставляя разреженные файлы разреженными, и записывая только измененные блоки на диск.

Итак, если я правильно прочитал, вы хотите сначала создать пустой разреженный файл на цели. Вы можете сделать это с

truncate -s 3G filename

Затем вы можете использовать rsync --inplaceдля копирования файлов. Это должно быть необходимо только один раз.


В той же статье предлагается использовать Virtsync, который

коммерческий инструмент командной строки Linux стоимостью $ 49 для синхронизации содержимого огромных файлов (таких как образы дисков виртуальных машин и базы данных).

Это может быть лучшим решением, если вы готовы заплатить за него, поскольку оно написано специально для такого типа ситуаций.

Тердон
источник