[О блоге] [наверх] [пред] [2017-09-20 15:12:25+03:00] [b4b36a45ec721be274a4b6c0f9f243d5672f3a48]
Темы: [tip]

Про форматы архивов

Когда-то давно, делая бэкапы, столкнулся с тем, что cpio или tar команда
у меня не смогли сделать архив большого размера и часть имён файлов там
не умещалась. Начитался про разные форматы одного только tar-а, но
позабыл. Решил вспомнить.

В POSIX/UNIX мире можно выделить три команды для работы с архивами: tar,
cpio и pax (ar не в счёт). Вне POSIX мира единственный формат имеющий
самую широкую поддержку это ZIP (какие конкретно версии -- не знаю). Про
него речь тоже не веду.

Лично мне tar мало когда нравился своим интерфейсом. После знакомства с
cpio я для себя сделал вывод что вот именно вот так должен выглядеть
архиватор. Долгое время использовал исключительно cpio, бойкотируя tar,
ибо уж правильно в нём всё с точки зрения интерфейса. Однако его формат
(cpio) имел и имеет существенные ограничения из-за которых им нельзя
просто так брать и архивировать всё что угодно.

После cpio я узнал о существовании pax. Pax создавался POSIX-ом именно
как архиватор всех архиваторов -- подружить ("pax" это "мир", с
греческого, вроде бы) tar и cpio, сделав что-то унифицированное.
Интерфейс pax повторяет cpio-шный: что круто. Формат поддерживаемый
pax-ом это один из tar-ов в котором нет крупных ограничений cpio -- тоже
хорошо. Вроде бы идеальная команда -- интерфейс cpio, формат tar, однако
pax мало популярен и большинстве дистрибутивов его не будет из коробки.

Остаётся tar. Однако форматов tar-а которые сейчас можно увидеть на
практике целых три: GNU tar, UStar, pax, всякое старьё о котором стоит
забыть.

Всякое старьё это между собой не очень совместимые vendor-specific
форматы, которые POSIX решил унифицировать и сделать "Unix standard
TAR". UStar поддерживает длину *полного* имени файла в 256 байт -- это
единственное что на данный момент прям может сильно "ударить" по глазам.
Но, насколько понимаю, UStar поддерживается широко и это формат который
должны открыть все и везде. Ну уж, существуя с 1988 года, не удивительно.

GNU tar, как всегда всё GNU-шное, куда более сложный формат, только с
собой совместимый, но в него можно запаковать всё без ограничений в 256
байт.

Но в POSIX.1-2001 стандарте, Sun предложила обновить UStar, сделав
pax-формат. Это UStar в котором в виде расширений добавлена
дополнительная информация о файлах: точность timestamp-ов хоть до
наносекунд, нет ограничений на длину имён файлов, как и символических
ссылок, пользователей/групп. Нет ограничений по размеру файлов. Сделан
этот архив так, что его отличия от UStar хранятся в виде PaxHeaders
файлов -- открыв такой архив мы увидим эти специфичные файлы, но многое
сможет достать. В FreeBSD версии tar есть restricted-pax формат который,
везде где можно, убирает PaxHeaders, добавляя только при необходимости.
То есть, если можно сделать архив UStar, то он и будет делаться и только
в худшем случае будет создан pax.

pax формат открывают все современные дистрибутивы. И именно его и стоит
использовать. А если точнее, то стоит использовать наверное
restricted-pax -- создавая UStar если это можно. Что забавно: pax
команда не поддерживает pax формат.

Подводя итог (в том числе субъективный, зависящий от моих дистрибутивов):

Формат(ы) cpio: все архаичны и имеют существенные ограничения
Формат UStar: до сих пор может быть часто использован без геморроя
Формат pax: лучший, может быть часто обратно-совместим с UStar

Команда cpio: хороший интерфейс, не может pax
Команда pax:  хороший интерфейс, не может pax
Команда tar:  плохой интерфейс,  может pax

Хотя моя FreeBSD версия cpio умеет pax.

    [оставить комментарий]