Назад | Перейти на главную страницу

bsdtar vs gnu tar - разреженные файлы

Я работал с необработанными изображениями qemu, и у меня возникло несколько вопросов об использовании с ними tar.

Из того, что я читал, bsdtar с ядром> = 3.1 может обрабатывать разреженные файлы изображений намного быстрее, чем gnu tar, потому что он может использовать преимущества функции seek_hole в ядре. Я тестировал его, и он значительно быстрее tar.

Мой вопрос в том, что ... мой файл изображения (полный размер) составляет 260 ГБ. Поскольку он не заполнен и разрежен, он фактически занимает всего 38G. Когда я делаю tar -cvSf test.img.tar test.img это занимает много времени (~ 10 минут), но я получаю файл размером 20 ГБ. Если я распакую, он вернется к 38G. Когда я делаю bsdtar -cvf test.img.tar test.img it работает намного быстрее (~ 2,5 минуты), но размер файла составляет 38 ГБ вместо 20 ГБ, которые мне дал gnu tar.

Какая разница? Почему размер файла с tar меньше? Я ожидал, что поведение будет похоже на то, что сделал bsdtar, потому что я думал, что tar -S только заставляет tar обрабатывать файл как разреженный файл, а не расширять его, поэтому я не понимаю, почему он меньше.

Заранее спасибо!

Из руководства GNU tar (информация):

8.1.2 Архивирование разреженных файлов

Файлы в файловой системе иногда имеют «дыры». «Дыра» в файле - это часть содержимого файла, которая никогда не записывалась. Содержимое отверстия читается как все нули. Во многих операционных системах фактическая дисковая память не выделяется для дыр, но они учитываются в длине файла. Если вы заархивируете такой файл, tar может создать архив длиннее оригинала. Чтобы tar попытался распознать дыры в файле, используйте '--sparse' ('-S'). Когда вы используете эту опцию, тогда для любого файла, использующего меньше дискового пространства, чем можно было бы ожидать исходя из его длины, tar ищет в файле последовательные отрезки нулей. Затем он записывает в архив для файла, где находятся последовательные отрезки нулей, и архивирует только «реальное содержимое» файла. При извлечении (использование '--sparse' при извлечении не требуется) в любых таких файлах есть дыры, созданные везде, где были обнаружены непрерывные участки нулей. Таким образом, если вы используете --sparse, архивы tar не займут больше места, чем оригинал.

'-S' '--sparse' Этот параметр указывает tar проверять разреженность каждого файла перед попыткой его архивирования. Если файл оказывается разреженным, он обрабатывается особым образом, что позволяет уменьшить объем места, используемого его изображением в архиве.

Эта опция имеет смысл только при создании или обновлении архивов. На экстракцию не влияет.

Рассмотрите возможность использования «--sparse» при выполнении резервного копирования файловой системы, чтобы избежать архивирования расширенных форм файлов, редко хранящихся в системе.

Даже если в вашей системе сейчас нет разреженных файлов, некоторые из них могут быть созданы в будущем. Если вы используете '--sparse' при резервном копировании файловой системы, вы можете быть уверены, что архив никогда не займет на носителе больше места, чем файлы занимают на диске (в противном случае архивирование диска, заполненного разреженными файлами, может взять сотни лент). * Обратите внимание на инкрементальные дампы ::.

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

При использовании формата архива POSIX, GNU tar может хранить разреженные файлы тремя разными способами, называемыми «разреженными форматами». Разреженный формат идентифицируется его «числом», состоящим, как обычно, из двух десятичных чисел, разделенных точкой. По умолчанию используется формат «1.0». Если по какой-то причине вы хотите использовать более ранний формат, вы можете выбрать его с помощью опции --sparse-version.

'--sparse-version = ВЕРСИЯ'

Выберите формат для хранения разреженных файлов. Допустимые значения ВЕРСИИ: «0,0», «0,1» и «1,0». * Обратите внимание на разреженные форматы ::, чтобы получить подробное описание каждого формата.

Использование опции '--sparse-format' подразумевает '--sparse'.

(курсив мой)


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