Qual é a diferença entre os formatos de arquivo TAR e CPIO?

41

Estou curioso e li um pouco, mas ainda tenho dúvidas.

O que torna o CPIO diferente do TAR? Foi-me dito em outra pergunta que o tar é para reunir muitos arquivos em um arquivo, que geralmente é gzip'd ou bzip'd.

Também me disseram que o TAR não pode comprimir do STDOUT. Desejo arquivar / compactar snapshots do ZFS para backups. Eu queria saber se eu poderia combinar o CPIO com o bzip2 para obter esse efeito.

Ou tenho a ideia completamente errada? Não é esse o objetivo do CPIO?

Esse é o tipo de comando que eu criei depois de ler, para que o Oracle documente o backup de snapshots do ZFS.

# Backup snapshot to cpio and bzip2 archive
zfs send media/mypictures@20070607 | cpio -o | bzip2 -9c > ~/backups/20070607.bz2

# Restore snapshot from cpio and bzip2 archive
zfs recieve media/mypictures@20070607 | cpio -i | bunzip2 -c ~/backups/20070607.bz2
ianc1215
fonte

Respostas:

28

Ambos tare cpiotêm um único objetivo: concatenar muitos arquivos separados em um único fluxo. Eles não compactam dados. (Hoje em dia taré mais popular devido à sua relativa simplicidade - ele pode aceitar os arquivos de entrada como argumentos, em vez de precisar ser acoplado findcomo cpiotem.)

No seu caso, você não precisa de nenhuma dessas ferramentas; eles não teriam efeito útil, porque você não possui muitos arquivos separados. zfs sendjá fez a mesma coisa que tarteria feito. Então você não tem quaisquer arquivos, apenas uma corrente sem nome.

Para compactar o instantâneo, tudo o que você precisa fazer é canalizar a zfssaída através de um programa de compactação:

zfs send media/mypictures@20070607 | gzip -c > ~/backups/20070607.gz

gzip -dc ~/backups/20070607.gz | zfs receive media/mypictures@20070607

(Você pode substituir gzippor xzou bzip2qualquer outra ferramenta de compactação de fluxo, se desejar.)

gravidade
fonte
Ah, entendo, então minha saída do ZFS NÃO é um arquivo de fluxo de dados? Isso explicaria por que os exemplos do Oracle não incluem o TAR nos comandos.
Ianc1215 07/10
1
@ Solignis: Você pode pensar assim: zfs sendjá faz o mesmo que tarfaria.
grawity
62

Além do que foi dito anteriormente por grawity e Paul :

História

Nos "velhos tempos", o cpio (com a opção -cusada) era a ferramenta a ser usada quando se tratava de mover arquivos para outros derivados do UNIX, pois era mais portátil e flexível que o tar . Mas os problemas da portabilidade do alcatrão podem ser considerados resolvidos desde o final dos anos 80.

Infelizmente, foi nessa época que diferentes fornecedores manipularam o -cformato do cpio (basta olhar na página de manual do GNU cpio e a opção -H). Naquele momento, o tar se tornou mais portátil que o cpio ... Levou quase uma década inteira até que os diferentes fornecedores do UNIX resolvessem isso. Ter o GNU tar e o GNU cpio instalados era uma obrigação para todos os administradores que tinham que lidar com fitas de diferentes fontes na época (até hoje em dia eu presumo).

Interface de usuário

tar pode usar um arquivo de configuração de fita em que o administrador configuraria as unidades de fita conectadas ao sistema. O usuário então dizia apenas "Bem, eu levarei a unidade de fita 1" em vez de ter que lembrar o nó exato do dispositivo para a fita (o que pode ser muito confuso e também não é padronizado em diferentes plataformas UNIX.

Mas a principal diferença é:

O tar é capaz de pesquisar diretórios por conta própria e usa a lista de arquivos ou diretórios para backup dos argumentos da linha de comando.

O cpio arquiva apenas os arquivos ou diretórios informados, mas não pesquisa subdiretórios por conta própria. Além disso, o cpio obtém a lista de itens a serem arquivados do stdin - é por isso que quase sempre é usado em combinação com o find .

Um comando cpio geralmente parece assustador para o iniciante, se comparado ao tar :

 $ find myfiles -depth -print0 | cpio -ovc0 | gzip -7 > myfiles.cpio.gz
 $ tar czvf myfiles.tar.gz myfiles

Eu acho que essa é a principal razão pela qual a maioria das pessoas usa o tar para criar arquivos compactados: para tarefas simples, como agrupar um diretório completo, é apenas mais fácil de usar.

Além disso, o GNU tar oferece a opção -zque faz com que o arquivo seja compactado com o GNU zip em tempo real, tornando as coisas ainda mais fáceis.

Por outro lado, pode-se fazer coisas bacanas com o find & cpio . Na verdade, é uma abordagem mais semelhante ao UNIX: por que incluir a pesquisa em árvore de diretórios no cpio se já existe uma ferramenta que cuida de quase tudo o que se pode pensar: find . O que vem à mente é apenas fazer backup de arquivos mais recentes que uma determinada data, restringindo os arquivos àqueles que residem no mesmo sistema de arquivos ou filtrando a saída de localização grep -vpara excluir determinados arquivos ...

O pessoal do GNU tar gastou muito trabalho para incluir muitas das coisas que antes eram possíveis apenas com o cpio . De fato, as duas ferramentas aprendidas umas com as outras - mas apenas o cpio pode ler o formato do tar - e não o contrário.

processamento de alcatrão e saída

Uma última nota para algo que você disse:

Também me disseram que o TAR não pode comprimir do STDOUT. Desejo arquivar / compactar snapshots do ZFS para backups. Eu queria saber se eu poderia combinar o CPIO com o bzip2 para obter esse efeito.

Bem, toda versão do tar (GNU ou não) pode ser usada em um pipe. Basta usar um sinal de menos ( -) como nome do arquivo:

 $ tar cvf - myfiles | bzip > myfiles.tar.bz

O GNU tar também oferece a opção --to-commandde especificar um comando pós-processador - embora eu ainda prefira o pipe. Talvez seja útil ao gravar em determinados dispositivos de hardware.

ktf
fonte
Não seria 'a partir de STDIN' que difere, em vez de 'para STDOUT' .. 'de STDOUT' realmente não faz sentido para mim
Joakim Elofsson
Bem, eu estava apenas citando a pergunta original. Ideed - é um pouco errado, mas acho que se entende.
Ktf 7/10
3
"Por que incluir a pesquisa na árvore de diretórios no cpio se já existe uma ferramenta que cuida de quase tudo o que se pode pensar em" Boa pergunta, mas você também deve solicitar cópia ( cp), mover ( mv) diff, etc.; - )
Mecki
1
TromboneHero disse : BSD tar uses libarchive under the hood, so it can handle cpio, pax, shar. você disse: only cpio may read the format of tar. isso não é uma contradição?
N611x007
6

tar e cpio têm essencialmente a mesma função, que é criar um único arquivo contíguo a partir de uma entrada de vários arquivos e diretórios. Originalmente, isso era para colocar o resultado em fita, mas atualmente é geralmente usado para alimentar um utilitário de compactação, como você fez acima. Isso ocorre porque compactar um único arquivo grande é mais eficiente em termos de tempo e espaço do que compactar muitos arquivos pequenos. Você deve observar que muitos formatos de imagem (png, jpg etc.) já estão altamente compactados e podem ficar um pouco maiores se forem colocados em um utilitário de compactação.

O tar ou o cpio não fazem nenhuma compactação. Tar efetivamente "venceu" a guerra "o que usaremos para criar arquivos agregados", mas o cpio é visto em vários lugares. Não conheço nenhum benefício de um sobre o outro, o alcatrão ganha por ser mais comumente usado.

O tar pode, de fato, levar a entrada stdin e a saída para stdout - que seriam canalizados para o bzip2 como você tem ou algo semelhante. Se chamado com a opção "z", ele invocará automaticamente o gzip na saída.

Paulo
fonte
1
Sim e não é -jpara invocar bzip2?
Ianc1215 07/07
2
sim, -j é bzip2 e algumas versões tem -J como xv, por gnutar Thatis (mais se ressentem?)
Joakim Elofsson
4
As versões mais recentes do GNU tar podem até adivinhar o formato de compactação desejado no nome do arquivo quando você usa a opção -a. Então isto: tar -caf myfiles.tar.xz myfiles/comprimirá usando xze isto tar -caf myfiles.tar.gz myfiles/comprimirá usando gzip.
gerlos 29/10
5

Perguntei a um suporte técnico da HP em ca. 1996 por que usar cpiomais tar.

Foi-me dito que as fitas esticam e se desgastam. Quando taratinge uma parte ilegível da fita, ela falha e retorna o número do erro. Quando cpioatinge uma parte ilegível, continua para o próximo bloco legível, ressincroniza e continua.

Eu nunca vi documentação para suportar isso, mas sempre usei cpio.

Lynn
fonte
De acordo com o post, o dano bit a bit do alcatrão parece estar localizado na área / arquivos que afeta, o mesmo que você falou sobre o cpio. oxfordrepo.blogspot.tw/2008/12/archive-file-resiliences.html
okwap
4

Também vale a pena notar: no (pelo menos) FreeBSD e Mac OS X, você pode manipular arquivos cpio com tar. O tar BSD usa libarchive sob o capô, para que ele possa lidar com cpio, pax, shar ...

Isso significa que os problemas de usabilidade do cpiocomando não precisam impedi-lo de interagir com os arquivos cpio.

trombonehero
fonte
KTF disse : only cpio may read the format of tar. você disse: BSD tar uses libarchive under the hood, so it can handle cpio, pax, shar. isso não é uma contradição?
N611x007
1
@ n611x007 Esta resposta fala sobre tar BSD. O outro provavelmente está falando sobre o tar GNU. São programas diferentes.
Navin
3

Embora as respostas aqui já sejam comparadas cpioe tarmuito bem, gostaria de destacar um dos cpiorecursos chamados modo de pipeline, que torna mais eficiente copiar arquivos seletivos (por exemplo, via finde filtro), preservando sua estrutura de diretórios. Esse recurso está bem documentado e, em sua premissa básica, fica assim:

find . <predicates> | cpio -pdmv /destination/dir

O equivalente a tarenvolveria algo como isto:

find . <predicates> | tar -T - -cf - | (cd /destination/dir; tar xvf -)

É claro que existem outras alternativas como rsynce cp --parentsdiscutidas em outro segmento , mas nada se aproxima da flexibilidade oferecida pela combinação de finde cpio. Com tarsendo onipresente para criação de arquivos, esta é a única razão pela qual eu ainda uso cpio.

haridsv
fonte