Incompatibilità tar di Linux / OS X: i tarball creati su OS X generano errori se non caricati in Linux


106

Quando eseguo il taring dei file sul mio Macbook e li desento da Linux, ricevo ripetutamente i seguenti avvisi / errori:


 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

Fortunatamente, ciò NON influisce sui file archiviati nell'archivio, che vengono ripristinati perfettamente. Tuttavia, causa problemi in una serie di scenari, in particolare quando si tratta di processi di compilazione in cui il codice di errore diverso da zero restituito da 'tar' provoca l'arresto inutile di build e installazioni.

Come posso ottenere OS X per creare file tar che si riproducono perfettamente con il resto del mondo Linux?

Inoltre, per i punti bonus, esiste un file tar distribuito pubblicamente con questi problemi. Esiste un modo per far sì che Linux gestisca il file tar con garbo senza cambiare il modo in cui è stato originariamente compresso?

Risposte:


71

Ho cercato su Google per il messaggio di errore e sembra un tarproblema di tar BSD vs GNU .

Installa GNU tarse puoi su Mac OS e usalo per creare il file tar.


17
Mac OS X 10.6 utilizza un tar BSD per impostazione predefinita, ma viene anche fornito con un gnutar a /usr/bin/gnutar.

@Ned. Grazie. questa è una buona informazione.
Dave Dopson,

15
Cordiali saluti: / usr / bin / gnutar non viene più spedito con Mac OS X (almeno a partire da Mavericks)
foobar,

sudo port install gnutar cd / usr / bin sudo rm tar sudo ln -s / opt / local / bin / gnutar tar
chaosless

Se usi MacPorts, puoi anche mettere / opt / local / libexec / gnubin / nella parte superiore del tuo PATH piuttosto che rimuovere qualsiasi cosa da / usr / bin o creare manualmente collegamenti simbolici.
Lorrin,

62

Se stai utilizzando Mavericks o versioni successive, gnutar non è più incluso per impostazione predefinita.

Il problema, se si utilizza l'homebrew, è quello di eseguire quanto segue:

brew install gnu-tar

È quindi possibile utilizzare il comando gtarper la compatibilità di Linux.


Se si desidera sostituire tarcon gtar, è sufficiente sostituire il collegamento simbolico

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

Per ripristinare il tar originale fornito con Mac Os X, esegui i comandi sopra ma sostituisci which gtarconwhich bsdtar

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


4
Non è più necessario scollegare più, come indicato da brew, puoi semplicemente aggiungere questo al tuo PERCORSO in .bashrc(o il tuo equivalente):PATH="/usr/local/opt/gnu-tar/libexec/gnubin:$PATH"
Bryan Petty

1
O semplicemente creare un tarcollegamento nel /usr/local/bindal cd /usr/local/bin ; ln -s gtar tar- forse l'opzione più semplice
Karthik T

27

Al tar GNU non piacciono alcune delle informazioni opzionali incluse nel tar OSD BSD predefinito.

Tar GNU ti permetterà di sopprimere quegli avvisi con l'opzione:

--warning=no-unknown-keyword

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

Nota che il tar BSD non supporta quel flag, quindi se devi eseguire lo stesso codice di decompressione su tutte le piattaforme puoi usare qualcosa come:

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

5
questa dovrebbe essere la risposta giusta perché non implica l'installazione di uno strumento completamente nuovo per sopprimere un singolo avviso.
cz

10

Per estrarre correttamente il file tar senza errori su un sistema Linux puoi usare bsdtar.

sudo apt-get install bsdtar

Quindi utilizzare normalmente.

bsdtar -xvf file.tardove si file.tartrova il file tar che si desidera estrarre.

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

In alternativa puoi anche usare il rullo di file GNOME.


6
COPYFILE_DISABLE=1 tar cf filename.tar

o

tar --disable-copyfile cf filename.tar

Questa è la funzionalità meno rilevabile di tar su OS X di cui sono personalmente consapevole.

Vedi anche Perché ottengo file come ._foo nel mio tarball su OS X?


Modifica: sembra che questo potrebbe solo fermare la creazione dei ._foofile indesiderati di tipo, non interrompe la creazione dell'intestazione (almeno su Yosemite / 10.10); grazie ai commentatori per averlo sottolineato. Tuttavia, (per i punti bonus :) puoi gestire con grazia tali tarball estraendoli in questo modo:

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

Funzionava con gnu tar 1.15.1, che è piuttosto vecchio! In alternativa, puoi usare pax invece, che (per me) lancia le informazioni extra in una PaxHeaderdirectory, ma almeno esce senza errori:

pax -rf filename.tar

Purtroppo, questo non sembra fermare gli avvisi delle parole chiave dell'intestazione estesa quando non si esegue la narrazione con gnutar.
JJC,

Nessuno di questi sembra funzionare su Yosemite ( tar --versionindica bsdtar 2.8.3 - libarchive 2.8.3). Anche in questo caso ho bisogno di un trattino cf.
triplo il

4

MacOSX viene già fornito con gnutar. Se vuoi una soluzione rapida e sporca aggiungi questo a~/.bash_profile

alias tar='gnutar'

ed esegui source ~/.bash_profilel'aggiornamento

Inoltre, OSX viene fornito con tar GNU e BSD. Quindi puoi anche scollegare il riferimento di tar da bsd a gnu:

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

1
Perché dentro /etc/hosts? /etc/hostsè per il mapping host / IP, giusto?
BenjiWiebe,

1
cosa ha detto @BenjiWiebe. Il bit ancora più strano è la modifica di / etc / hosts. Penso che volevi dire ~ / .bashrc
Dave Dopson il

2
Su OS X, .bashrcnon viene caricato per le sessioni Terminal. È necessario .bash_profile, poiché una shell di accesso viene avviata con una nuova finestra Terminale. / cc @BenjiWiebe
slhck

Corretto :-) Stavo lavorando anche in / etc / hosts in quel momento, quindi è stato diffuso sulla tastiera. Buona cattura
Du3,

2

Grazie. Questa discussione è stata molto utile. Se stai usando MacPorts ecco un breve howto:

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

Aggiungi la seguente riga a /Users/[yourname[/.profile

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

Esci e riavvia la finestra del Terminale.


1

Sì, il binario tar incorporato nel Mac aggiunge un sacco di cose extra che a CentOS non piacciono. Per risolvere questo, procedi come segue:

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

Spero che aiuti!


Questo è un modo. Ho risolto il problema GNU / BSD in modo più completo in github.com/ddopson/dotfiles . Ho ~ / bin / coreutils all'inizio del percorso e ci sono piccoli spessori come github.com/ddopson/dotfiles/blob/master/bin/coreutils/tar che scelgono l'eseguibile corretto basato su Linux vs Mac e se l'ambiente COREUTILS la variabile è impostata
Dave Dopson

Potresti voler modificare le tue istruzioni per dire alle persone di verificare l'esistenza di / usr / bin / gnutar prima di spostare il loro tar di lavoro. I neofiti possono trovarlo utilizzando Google e non sanno come rompere il loro sistema.
msouth,

Probabilmente non è una buona idea, per un paio di ragioni. 1) Ora i pacchetti Apple non sanno dove trovare il tar nativo, il tar che sa come gestire gli attributi dei file Apple. 2) Se devi usare GNU tar, il posto giusto per metterlo davanti è nel tuo percorso di ricerca, come / usr / local / bin, o qualcosa del genere, e 3) Probabilmente è ancora più sicuro chiamare il tarprogramma esterno gnutar per evitare di confondere il software aspettandosi che un Mac si comporti come un Mac. $ 0,02. -Erik
Erik Bennett,

0

Ok, ho usato la ricerca di Google, ma i primi tre link hanno confermato ciò che sospettavo

  1. Bug nel tuo tar AND / OR
  2. Incompatibilità tra le due utility tar
    Vedi questo link . Lì qualcuno riferisce che "Usare" bsdtar -xvf "ha funzionato".

Modifica: sei su un sistema Mac, ho pensato diversamente. Dovrai usare gnutar, dovrebbe essere già installato, se non installarlo. Certo, puoi guardare altri link cercando te stesso.


0

Su MAC OSX installare gnu-tar

brew install gnu-tar

quindi crea il tuo tar compatibile con Linux con:

gtar -c -f your_tar_file files

Oppure puoi creare il tuo archivio con formato pax

tar -c --format pax -f your_tar_file files
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.