Intereting Posts

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

У меня есть разреженный файл. ( du -h сообщает 3G и du -h --apparent-size отчеты о du -h --apparent-size 100G.) До сих пор так хорошо.

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

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

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

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

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

bsdtar (по крайней мере, из libarchive 3.1.2) способен обнаруживать разреженные разделы, используя FS_IOC_FIEMAP ioctl для файловых систем, которые его поддерживают (хотя он поддерживает и ряд других API), однако, по крайней мере, в моем тесте, как ни странно , он не может обрабатывать файлы tar которые он генерирует сам (выглядит как ошибка).

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

Так

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

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

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

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

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

Проблемы

Использование rsync --sparse works , но вызывает огромное количество ненужных 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 для синхронизации содержимого огромных файлов (таких как образы дисков виртуальных машин и базы данных).

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