Создание совместимых tar-архивов macOS для Linux: ошибки xattrs и решения

Создание архивов в macOS кажется простой задачей – до тех пор, пока вы не попробуете распаковать их в Linux. Внезапно появляются непонятные сообщения об «unknown extended header keyword» или дублирующиеся файлы с префиксом ._. Это классическая проблема несовместимости между реализацией tar в macOS (основанной на BSD) и GNU/Linux. Но не спешите винить системы: всё дело в особенностях работы с метаданными.

Почему macOS добавляет «лишнее» в архивы?

Каждый файл в macOS может содержать расширенные атрибуты (xattrs) – дополнительную информацию, которую система использует для тегов, меток безопасности или, например, данных Spotlight (технологии поиска). Например, атрибут com.apple.metadata:kMDItemTextContentLanguage хранит язык текстового содержимого файла. При создании архива через стандартную утилиту tar macOS автоматически включает эти атрибуты, а также резервные файлы AppleDouble (те самые ._F), чтобы сохранить метаданные для файловых систем, которые не поддерживают xattrs.

Но Linux, особенно с ext4 или другими распространёнными ФС, не понимает эти атрибуты. При распаковке вы увидите ошибки вроде:

tar: Ignoring unknown extended header keyword 'LIBARCHIVE.xattr.com.apple.metadata:kMDItemTextContentLanguage'

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

Как создать «чистый» архив для Linux

Решений два: либо отключить добавление xattrs при создании архива, либо очистить уже существующий. Начнём с первого варианта, как наиболее правильного.

Шаг 1. Используйте правильные флаги в команде tar

В macOS (начиная с версий, где используется bsdtar) добавьте –disable-copyfile и –no-xattrs:

tar --disable-copyfile --no-xattrs -cvf archive.tar /путь/к/папке

Поясню, зачем нужны оба параметра:

  • –disable-copyfile отключает использование macOS-специфичных функций (вроде копирования ресурсных вилок файлов, которые в Linux не нужны).
  • –no-xattrs запрещает запись расширенных атрибутов в архив.

Если пропустить один из флагов, могут остаться артефакты. Например, без –disable-copyfile иногда создаются скрытые файлы ._ даже при отключённых xattrs.

Шаг 2. Проверьте архив перед отправкой

Убедиться, что в архиве нет лишних элементов, можно так:

tar -tvf archive.tar

Если в списке есть файлы, начинающиеся на ._, или строки с LIBARCHIVE.xattr, значит, флаги не сработали. Пересоздайте архив, внимательно проверив синтаксис команды.

Шаг 3. Альтернатива: очистка существующего архива

Если архив уже создан без нужных флагов, удалить xattrs и ._ файлы можно на Linux:

tar -xf archive.tar --transform='s/._//' --exclude='._*'

Но это не всегда надёжно. Лучше сразу правильно настраивать процесс архивации.

Дополнительная информация

Почему нельзя просто использовать GNU tar на macOS?

Теоретически можно установить GNU-версию tar через Homebrew:

brew install gnu-tar  
gtar -cvf archive.tar /путь/к/папке

Она по умолчанию игнорирует xattrs. Но есть нюанс: если вы работаете с файлами, которые действительно требуют сохранения атрибутов (например, для резервного копирования внутри экосистемы Apple), такой метод не подойдёт.

Что делать, если ошибки всё равно возникают?

Иногда проблемы сохраняются из-за скрытых файлов .DS_Store или других служебных данных macOS. В этом случае перед архивацией:

1. Удалите ненужные элементы:

find /путь/к/папке -name ".DS_Store" -delete  
find /путь/к/папке -name "._*" -delete

2. Убедитесь, что в команде tar указаны оба ключа (–disable-copyfile и –no-xattrs).

Важные замечания

  • Если вы используете Finder для создания архивов (через «Сжать» в контекстном меню), проблема с xattrs проявится гарантированно. Этот метод всегда добавляет метаданные.
  • При копировании архивов через rsync или scp проверьте, не включена ли опция сохранения атрибутов (например, -X или -E для rsync).

В итоге, проблема с совместимостью tar между macOS и Linux – это не баг, а следствие различий в подходах к метаданным. Используя –disable-copyfile и –no-xattrs, вы создаёте нейтральные архивы, которые корректно распаковываются в любой системе. Если же вам критично сохранить xattrs для macOS-систем, рассматривайте форматы вроде zip или dmg, но помните: их поддержка в Linux может требовать дополнительных настроек.

Кстати, если вы часто обмениваетесь архивами между разными ОС, добавьте команду с нужными флагами в свой bash-профиль как алиас. Например:

alias tarclean='tar --disable-copyfile --no-xattrs -cvf'

Теперь команда “tarclean archive.tar folder” станет вашим стандартом.

Добавить комментарий

Все поля обязательны к заполнению. Ваш адрес email не будет виден никому.

Новое
Интересное