Вопрос или проблема
Когда я архивирую файлы на своем 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
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, но три лучших ссылки подтвердили то, что я подозревал
- Ошибка в вашем tar И/ИЛИ
- Несовместимость между двумя утилитами 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 году:
-
В терминале:
brew install gnu-tar
-
В
~/.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 значительно упрощает работу с архивами во множестве сценариев, особенно при автоматизации процессов сборок и установок.