Questão Incompatibilidade do sistema operacional Linux / OS X - tarballs criados no OS X geram erros quando descompactados no Linux


Quando ligo arquivos no meu Macbook e os descompacte no Linux, recebo repetidamente os seguintes avisos / erros:


 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: Ignoring unknown extended header keyword `SCHILY.ino'
 tar: Ignoring unknown extended header keyword `SCHILY.nlink'
 tar: Ignoring unknown extended header keyword `SCHILY.dev'
 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: Ignoring unknown extended header keyword `SCHILY.ino'
 tar: Ignoring unknown extended header keyword `SCHILY.nlink'
 tar: Ignoring unknown extended header keyword `SCHILY.dev'
 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: Ignoring unknown extended header keyword `SCHILY.ino'
 tar: Ignoring unknown extended header keyword `SCHILY.nlink'
 tar: Error exit delayed from previous errors

Felizmente, isso NÃO afeta os arquivos armazenados no arquivo, que são restaurados perfeitamente. No entanto, isso causa problemas em vários cenários, especialmente ao lidar com processos de construção em que o código de falha diferente de zero retornado por 'tar' faz com que compilações e instalações parem desnecessariamente.

Como posso obter o OS X para construir arquivos tar que funcionam bem com o resto do mundo Linux?

Além disso, para pontos de bônus, existe um arquivo tar distribuído publicamente com esses problemas. Existe alguma maneira de obter Linux para lidar com o arquivo tar graciosamente sem mudando a maneira como foi originalmente comprimido?


93


origem




Respostas:


Eu pesquisei a mensagem de erro e parece um tar contra o GNU BSD tar questão.

Instalar o GNU tar se você puder no Mac OS e usá-lo para criar o tar.


65



O Mac OS X 10.6 usa um tar do BSD por padrão, mas também vem com um gnutar /usr/bin/gnutar.
@ Ned. THX. isso é uma boa informação. - Dave Dopson
FYI: / usr / bin / gnutar não é enviado mais com o Mac OS X (pelo menos a partir de Mavericks) - foobar
sudo port instalar gnutar cd / usr / bin sudo rm tar sudo ln -s / opt / local / bin / gnutar tar - chaosless
Se estiver usando MacPorts, você também pode simplesmente colocar / opt / local / libexec / gnubin / no topo do seu PATH, em vez de remover qualquer coisa de / usr / bin ou criar manualmente links simbólicos. - Lorrin


Se você estiver usando o Mavericks ou mais recente, o gnutar não será mais incluído por padrão.

O trabalho em torno, se você usar homebrew, é executar o seguinte:

brew install gnu-tar

Você pode então usar o comando gtar para compatibilidade com linux.


Se você quiser substituir tar com gtar, simplesmente substitua o link simbólico

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

Para restaurar o tar original fornecido com o Mac OS X, execute os comandos acima, mas substitua which gtar com which bsdtar

Fonte:
https://github.com/jordansissel/fpm/issues/576


54



Não há necessidade de desvincular mais, como instrui brew, você pode simplesmente adicionar isso ao seu PATH em .bashrc (ou o seu equivalente): PATH="/usr/local/opt/gnu-tar/libexec/gnubin:$PATH" - Bryan Petty
Ou apenas crie um tar link em /usr/local/bin de cd /usr/local/bin ; ln -s gtar tar - possivelmente a opção mais simples - Karthik T


O GNU tar não gosta de algumas das informações opcionais que o tar padrão do OSX BSD inclui.

O GNU tar permitirá que você suprima esses avisos com a opção:

--warning=no-unknown-keyword

Vejo: https://www.gnu.org/software/tar/manual/html_section/tar_27.html

Note que o tar do BSD não suporta esse sinalizador então se você precisar executar o mesmo código de desempacotamento em todas as plataformas você pode usar algo como:

isGnuTar=$(tar --version | grep -q 'gnu')
if [ $? -eq 0 ]
then
    echo "Detected GNU tar"
    tar --warning=no-unknown-keyword -zxf my.tar.gz
else
    tar -zxf my.tar.gz
fi

21



essa deve ser a resposta certa, pois não envolve a instalação de uma ferramenta inteiramente nova para suprimir um único aviso. - c z


Para extrair o arquivo tar corretamente sem erros em um sistema Linux, você poderia usar o bsdtar.

sudo apt-get install bsdtar

Então use como normal.

bsdtar -xvf file.tar Onde file.tar é o arquivo tar que você deseja extrair.

Fonte:  https://bugs.launchpad.net/ubuntu/+source/tar/+bug/129314

Alternativamente, você também pode usar o compactador de arquivos do GNOME.


9





COPYFILE_DISABLE=1 tar cf filename.tar

ou

tar --disable-copyfile cf filename.tar

Este é o recurso menos detectável do tar no OS X que eu estou pessoalmente ciente.

Veja também Por que recebo arquivos como ._foo no meu tarball no OS X?


Edit: parece que isso só pode parar a criação do indesejado ._fooarquivos de tipo, não param a criação do cabeçalho (pelo menos no Yosemite / 10.10); obrigado comentaristas por apontar isso. No entanto, (para os pontos de bônus :) você pode facilmente lidar com esses tarballs extraindo-os assim:

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

Isso funcionou usando o gnu tar 1.15.1, que é bem antigo! Alternativamente, você pode usar pax em vez disso, o que (para mim) lança a informação extra em um PaxHeader diretório, mas pelo menos sai sem erro:

pax -rf filename.tar

5



Infelizmente, isso não parece interromper os avisos de palavras-chave de cabeçalho estendidos ao descompactar com gnutar. - JJC
Nenhum destes parece funcionar em Yosemite (tar --version indica bsdtar 2.8.3 - libarchive 2.8.3). Também preciso de um traço antes cf no último caso. - tripleee


MacOSX já vem com gnutar. Se você quiser uma solução rápida e suja, adicione isso ~/.bash_profile

alias tar='gnutar'

e corra source ~/.bash_profile atualizar

Além disso, o OSX vem com o tar GNU e BSD. Então você também pode desvincular a referência de tar do bsd para o gnu:

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

3



Por que /etc/hosts? /etc/hosts é para mapeamento de host / IP, certo? - BenjiWiebe
o que @BenjiWiebe disse. O bit mais estranho é editar / etc / hosts. Eu acho que você quis dizer ~ / .bashrc - Dave Dopson
No OS X, .bashrc não é carregado para sessões do Terminal. Você precisa .bash_profile, uma vez que um shell de login é iniciado com uma nova janela do Terminal. / cc @BenjiWiebe - slhck
Correto :-) Eu também estava trabalhando em / etc / hosts naquele momento, então ele foi expelido no teclado. Boa pegada - Du3


Obrigado. Este tópico foi muito útil. Se você estiver usando o MacPorts, aqui está um tutorial rápido:

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

Adicione a seguinte linha a /Users/[yourname]/.profile

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

Saia e reinicie a janela do Terminal.


2





Sim, o binário integrado do Mac adiciona um monte de coisas extras que o CentOS não gosta. Para corrigir isso, faça o seguinte:

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

Espero que ajude!


1



É um jeito. Eu resolvi a questão GNU / BSD de forma mais abrangente em github.com/ddopson/dotfiles. Eu tenho ~ / bin / coreutils no início do caminho e há pequenos calços lá como github.com/ddopson/dotfiles/blob/master/bin/coreutils/tar que escolhe o executável correto baseado em linux vs Mac e se a variável de ambiente COREUTILS está definida - Dave Dopson
Você pode querer modificar suas instruções para dizer às pessoas para verificar a existência de / usr / bin / gnutar antes de mover seu tar de trabalho. Novatos podem encontrar isso usando o google e não sabem como descompactar seu sistema. - msouth
Isso provavelmente não é uma boa ideia, por algumas razões. 1) Agora os pacotes da Apple não sabem onde encontrar o tar nativo, o tar que sabe como lidar com atributos de arquivos da Apple. 2) Se você deve usar o GNU tar, o local apropriado para colocá-lo está à frente em seu caminho de busca, como / usr / local / bin, ou algo assim, e 3) É provavelmente mais seguro ainda chamar o estrangeiro tar gnutar programa para evitar software confuso esperando um Mac para agir como um Mac. US $ 0,02 -Erik - Erik Bennett


Ok, eu usei a pesquisa do Google, mas os três principais links confirmaram o que eu suspeitava

  1. Bug no seu piche E / OU
  2. Incompatibilidade entre os dois utilitários de tar
    Vejo esse link. Há alguém que relata que "Usando" bsdtar -xvf "funcionou." 

Editar: Você está no sistema Mac, eu pensei de outra maneira. Você precisará usar o gnutar, ele já deve estar instalado, se não for instalado. Naturalmente, você pode ver outros links pesquisando por si mesmo.


0