Несовместимость tar между Linux и OS X – архивы tar, созданные в OS X, выдают ошибки при распаковке в Linux.

Вопрос или проблема

Когда я архивирую файлы на своем Macbook и распаковываю их в Linux, я постоянно получаю следующие предупреждения/ошибки:


 tar: Игнорирование неизвестного ключевого слова расширенного заголовка `SCHILY.ino'
 tar: Игнорирование неизвестного ключевого слова расширенного заголовка `SCHILY.nlink'
 tar: Игнорирование неизвестного ключевого слова расширенного заголовка `SCHILY.dev'
 tar: Игнорирование неизвестного ключевого слова расширенного заголовка `SCHILY.ino'
 tar: Игнорирование неизвестного ключевого слова расширенного заголовка `SCHILY.nlink'
 tar: Игнорирование неизвестного ключевого слова расширенного заголовка `SCHILY.dev'
 tar: Игнорирование неизвестного ключевого слова расширенного заголовка `SCHILY.ino'
 tar: Игнорирование неизвестного ключевого слова расширенного заголовка `SCHILY.nlink'
 tar: Игнорирование неизвестного ключевого слова расширенного заголовка `SCHILY.dev'
 tar: Игнорирование неизвестного ключевого слова расширенного заголовка `SCHILY.ino'
 tar: Игнорирование неизвестного ключевого слова расширенного заголовка `SCHILY.nlink'
 tar: Игнорирование неизвестного ключевого слова расширенного заголовка `SCHILY.dev'
 tar: Игнорирование неизвестного ключевого слова расширенного заголовка `SCHILY.ino'
 tar: Игнорирование неизвестного ключевого слова расширенного заголовка `SCHILY.nlink'
 tar: Игнорирование неизвестного ключевого слова расширенного заголовка `SCHILY.dev'
 tar: Игнорирование неизвестного ключевого слова расширенного заголовка `SCHILY.ino'
 tar: Игнорирование неизвестного ключевого слова расширенного заголовка `SCHILY.nlink'
 tar: Ошибка выхода задержана из-за предыдущих ошибок

К счастью, это НЕ влияет на файлы, сохраненные в архиве, которые восстанавливаются идеально. Однако это создает проблемы в ряде сценариев, особенно при работе с процессами сборки, когда ненулевой код ошибки, возвращаемый ‘tar’, вызывает остановку сборок и установок без необходимости.

Как я могу сделать так, чтобы OS X создавал tar-файлы, которые хорошо взаимодействуют с остальным миром Linux?

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

Я погуглил сообщение об ошибке, и, похоже, это проблема между BSD tar и GNU tar.

Установите GNU tar, если можете, на Mac OS и используйте его для создания tar.

Если вы используете Mavericks или более новую версию, то gnutar больше не включен по умолчанию.

Обходной путь, если вы используете homebrew, это выполнить следующее:

brew install gnu-tar

Вы можете использовать команду gtar для совместимости с Linux.


Если вы хотите заменить tar на gtar, просто замените символическую ссылку

tar --version
ll `which tar`
sudo unlink `which tar`
sudo ln -s `which gtar` /usr/bin/tar
tar --version

Чтобы восстановить оригинальный tar, предоставленный с Mac Os X, выполните вышеуказанные команды, но замените which gtar на which bsdtar

Источник:
https://github.com/jordansissel/fpm/issues/576

GNU tar не любит некоторую опциональную информацию, которую включает по умолчанию BSD tar в OSX.

GNU tar позволит вам подавить эти предупреждения с помощью опции:

--warning=no-unknown-keyword

Смотрите: https://www.gnu.org/software/tar/manual/html_section/tar_27.html

Обратите внимание, что BSD tar не поддерживает этот флаг, поэтому, если вам нужно запустить один и тот же код распаковки на всех платформах, вы можете использовать что-то вроде:

isGnuTar=$(tar --version | grep -q 'gnu')
if [ $? -eq 0 ]
then
    echo "Обнаружен GNU tar"
    tar --warning=no-unknown-keyword -zxf my.tar.gz
else
    tar -zxf my.tar.gz
fi

Чтобы правильно извлечь tar-файл без каких-либо ошибок в системе Linux, вы можете использовать bsdtar.

sudo apt-get install bsdtar

Затем используйте как обычно.

bsdtar -xvf file.tar, где file.tar – это tar-файл, который вы хотите извлечь.

Источник: https://bugs.launchpad.net/ubuntu/+source/tar/+bug/129314

Кроме того, вы также можете использовать GNOME file roller.

COPYFILE_DISABLE=1 tar cf filename.tar

или

tar --disable-copyfile cf filename.tar

Это наименее заметная функция tar на OS X, о которой я лично знаю.

Смотрите также Почему я получаю файлы вроде ._foo в своем тарболе на OS X?


Редактировать: похоже, это может только остановить создание нежелательных файлов типа ._foo, это не останавливает создание заголовка (по крайней мере, на Yosemite/10.10); спасибо комментаторам за указание на это. Однако, (для бонусных баллов:) вы можете корректно обработать такие тарболы, извлекая их вот так:

tar xf filename.tar --pax-option=delete=SCHILY.*,delete=LIBARCHIVE.*

Это сработало с использованием gnu tar 1.15.1, который довольно старый! В качестве альтернативы, вы можете использовать pax, который (для меня) помещает дополнительную информацию в директорию PaxHeader, но, по крайней мере, выходит без ошибки:

pax -rf filename.tar

MacOSX уже поставляется с gnutar. Если вы хотите быстрое и простое решение, добавьте это в ~/.bash_profile

alias tar="gnutar"

и выполните source ~/.bash_profile, чтобы обновить

Кроме того, OSX поставляется как с GNU, так и с BSD tar. Так что вы также можете отсоединить ссылку на tar от bsd на gnu:

sudo unlink /usr/bin/tar;
sudo ln -s /usr/bin/gnutar /usr/bin/tar

Спасибо. Эта тема была очень полезной. Если вы используете MacPorts, вот краткое руководство:

sudo port install gnutar

sudo ln -s /usr/local/opt/gnu-tar/libexec/gnubin/tar /usr/bin/gnutar

sudo ln -s /opt/local/libexec/gnubin/tar /usr/bin/gnutar

Добавьте следующую строку в /Users/[вашеимя]/.profile

alias tar="/opt/local/libexec/gnubin/tar"

Закройте и перезапустите ваше окно терминала.

Используйте опцию --no-xattrs при создании архива:

tar cfz yoyodyne.tgz --no-xattrs /tmp/john_bigbootie/*

Да, встроенный tar в Mac добавляет кучу лишней информации, которая не нравится CentOS. Чтобы это исправить, выполните следующее:

sudo mv /usr/bin/tar /usr/bin/darwintar
sudo ln -s /usr/bin/gnutar /usr/bin/tar
ls -l /usr/bin/tar

Надеюсь, это поможет!

Хорошо, я воспользовался поиском в Google, но три лучших ссылки подтвердили то, что я подозревал

  1. Ошибка в вашем tar И/ИЛИ
  2. Несовместимость между двумя утилитами tar
    Смотрите эту ссылку. Там кто-то сообщает, что “Использование “bsdtar -xvf” сработало.”

Редактировать: Вы на системе Mac, я думал наоборот. Вам нужно использовать gnutar, он должен быть установлен уже, если нет, установите его. Конечно, вы можете посмотреть другие ссылки, поискав самостоятельно.

В MAC OSX установите gnu-tar

brew install gnu-tar

затем создайте ваш совместимый с linux tar:

gtar -c -f ваш_tar_файл файлы

Или вы можете создать свой архив в формате pax

tar -c --format pax -f ваш_tar_файл файлы

Замена macOS tar на GNU tar в 2024 году:

  1. В терминале:

    brew install gnu-tar

  2. В ~/.bashrc

# Apple Silicon
export PATH="/opt/homebrew/opt/gnu-tar/libexec/gnubin:$PATH"

# Intel
export PATH="/usr/local/opt/gnu-tar/libexec/gnubin:$PATH"

Начните новую оболочку и проверьте:

> tar --version
tar (GNU tar) 1.35
Copyright (C) 2023 Free Software Foundation, Inc.

Ответ или решение

Проблема несовместимости tar между macOS и Linux: Причины и Решения

Когда вы создаете архив tar на вашем Mac и пытаетесь его извлечь на системе Linux, встречаете множество предупреждений и ошибок, таких как:

tar: Ignoring unknown extended header keyword `SCHILY.ino'
tar: Ignoring unknown extended header keyword `SCHILY.nlink'
tar: Ignoring unknown extended header keyword `SCHILY.dev'

Эти сообщения являются следствием несовместимости между разными версиями утилиты tar: BSD tar, который имеет место быть на macOS, и GNU tar, часто используемом в средах Linux. Данная несовместимость не мешает целостности файлов в архиве, но может вызывать проблемы в процессе автоматизации сборок и установок из-за ненулевых кодов завершения, возвращаемых утилитой tar.

Почему возникает проблема

macOS использует BSD tar, который добавляет некоторые дополнительные заголовки в создаваемые архивы, включая, но не ограничиваясь, SCHILY.ino, SCHILY.nlink и SCHILY.dev. Linux-системы, использующие GNU tar, не знают о этих заголовках и игнорируют их, что и отражается в сообщениях об ошибках.

Решения для создания совместимых архивов tar

1. Установите GNU tar на macOS

Самый простой способ избежать проблемы – использовать GNU tar для создания архивов:

  • Если вы еще не установили Homebrew, это может быть сделано с помощью:

    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
  • Затем установите GNU tar:

    brew install gnu-tar
  • Для создания совместимого архива используйте команду gtar вместо tar:

    gtar -cvf your_archive.tar your_files

2. Измените символическую ссылку на tar

Если вы хотите, чтобы команда tar всегда использовала GNU tar, вы можете изменить символическую ссылку на gtar:

sudo unlink /usr/bin/tar
sudo ln -s /usr/local/bin/gtar /usr/bin/tar

3. Используйте опции для suppression предупреждений

Если по каким-то причинам вы не хотите менять утилиты или хотите использовать маковский tar, добавьте флаг для подавления предупреждений при извлечении:

tar --warning=no-unknown-keyword -xvf your_archive.tar

Обработчик существующих архивов с проблемами

Для извлечения архивов, созданных с помощью macOS tar, можно использовать пакет bsdtar на Linux или pax с опцией:

pax -r -f your_archive.tar

Также, чтобы избежать ошибок извлечения с дополнительными метаданными, можно использовать:

tar --pax-option=delete=SCHILY.*,delete=LIBARCHIVE.* -xf your_archive.tar

Резюме

Несоответствия между утилитами tar на macOS и Linux могут привести к множеству предупреждений и ненужным ошибкам при разархивировании. Рекомендации включают установку GNU tar на macOS для создания совместимых архивов или применение различных флагов для подавления предупреждений и ошибок на Linux. Уход от использования стандартного BSD tar на Mac к GNU tar значительно упрощает работу с архивами во множестве сценариев, особенно при автоматизации процессов сборок и установок.

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

Капча загружается...