web-dev-qa-db-pt.com

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

Estou curioso e fiz um pouco de leitura, mas ainda tenho dúvidas.

O que torna o CPIO diferente do TAR? Foi-me dito em outra questão 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 compactar a partir do STDOUT. Desejo arquivar/compactar instantâneos do ZFS para backups. Eu queria saber se eu poderia combinar o CPIO com o bzip2 para obter esse efeito.

Ou eu tenho a ideia completamente errada? Não é esse o propósito do CPIO?

Este é o tipo de comandos que eu tenho depois de ler, então o Oracle faz um backup de snapshots do ZFS.

# Backup snapshot to cpio and bzip2 archive
zfs send media/[email protected] | cpio -o | bzip2 -9c > ~/backups/20070607.bz2

# Restore snapshot from cpio and bzip2 archive
zfs recieve media/[email protected] | cpio -i | bunzip2 -c ~/backups/20070607.bz2
40
ianc1215

Tanto tar quanto cpio têm uma única finalidade: concatenar muitos arquivos separados em um único fluxo. Eles não compactam dados. (Estes dias tar é mais popular devido à sua relativa simplicidade - ele pode pegar os arquivos de entrada como argumentos ao invés de ter que ser acoplado com find como cpio tem.)

No seu caso, você não precisa nenhuma dessas ferramentas; eles não teriam nenhum efeito útil, porque você não tem muitos arquivos separados. zfs send já fez a mesma coisa que tar teria feito. Então você não tem nenhum arquivo, apenas um fluxo sem nome .

Para compactar o instantâneo, tudo o que você precisa fazer é canalizar a saída zfs por meio de um programa de compactação:

zfs send media/[email protected] | gzip -c > ~/backups/20070607.gz

gzip -dc ~/backups/20070607.gz | zfs receive media/[email protected]

(Você pode substituir gzip por xz ou bzip2 ou qualquer outra ferramenta de compactação de fluxo, se desejar).

28
grawity

Além disso, o que foi dito antes por grawity e Paul :

histórico

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

Infelizmente, foi nessa época que diferentes fornecedores mancharam o formato -c de cpio (basta olhar a página de manual para GNU cpio e a opção -H). Naquela época tar tornou-se mais portátil do que cpio ... Demorou quase uma década inteira até que os diferentes fornecedores de UNIX tenham resolvido isso. Ter GNU tar e GNU cpio instalado foi uma obrigação para todos os administradores que teve que lidar com fitas de diferentes fontes na época (mesmo hoje em dia eu presumo).

interface do usuário

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

Mas a principal diferença é:

tar é capaz de pesquisar diretórios por conta própria e pega a lista de arquivos ou diretórios dos quais será feito backup dos argumentos da linha de comando.

cpio arquiva apenas os arquivos ou diretórios aos quais é contado, mas não procura subdiretórios de forma recursiva por conta própria. Também cpio obtém a lista de itens a serem arquivados de stdin - this É por isso que quase sempre é usado em combinação com find .

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

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

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

Também o GNU tar oferece a opção -z que faz com que o arquivo seja compactado com GNU Zip na mosca, tornando as coisas ainda mais fáceis.

Por outro lado, pode-se fazer coisas interessantes com find & cpio . Na verdade, é uma abordagem mais parecida com o UNIX: Por que incluir a pesquisa por árvore de diretórios em cpio se já existe uma ferramenta que cuida de quase tudo que se pode imaginar : encontrar . As coisas que vêm à mente são apenas fazer backup de arquivos mais novos que uma determinada data, restringindo os arquivos àqueles que residem no mesmo sistema de arquivos ou filtrando a saída de localização com grep -v para excluir determinados arquivos ...

As pessoas do GNU tar gastaram muito trabalho para incluir muitas daquelas que anteriormente só eram possíveis com cpio . Na verdade, ambas as ferramentas aprenderam umas com as outras - mas somente cpio pode ler o formato de tar - não o contrário.

tar e processamento de saída

Uma última nota para algo que você disse:

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

Bem, toda versão de 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

Também o GNU tar oferece a opção --to-command para especificar um comando postprocessor - embora eu ainda prefira o pipe. Talvez seja útil ao gravar em determinados dispositivos de hardware.

61
ktf

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

Nem o tar nem o cpio fazem qualquer compressão. Tar efetivamente "ganhou" o "o que vamos usar para fazer arquivos agregados" guerra, mas cpio fica olhando em vários lugares. Eu não estou ciente de nenhum benefício de um sobre o outro, alcatrão ganha sendo mais comumente usado.

o tar pode, de fato, receber a entrada no stdin e a saída para o stdout - que então seria canalizado para o bzip2 como você tem ou algo parecido. Se chamado com a opção "z", invocará automaticamente o gzip na saída.

6
Paul

Perguntei a um suporte técnico da HP em ca. 1996 porque usar cpio sobre tar.

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

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

4
Lynn

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

Isso significa que os problemas de usabilidade do comando cpio não precisam impedir que você interaja com arquivos cpio.

4
trombonehero

Embora as respostas aqui já comparem muito bem cpio e tar, gostaria de destacar um dos recursos do cpio chamado de modo pipeline, que torna mais eficiente a cópia de arquivos seletivos (isto é, via find e filter) enquanto preserva sua estrutura de diretórios. Esse recurso é bem documentado e em sua premissa básica é assim:

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

O equivalente a tar envolveria algo assim:

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

Existem outras alternativas como rsync e cp --parents discutidas em outro thread , mas nada se aproxima da flexibilidade oferecida pela combinação de find e cpio. Com tar sendo onipresente para criar arquivos, esta é a única razão pela qual eu ainda uso cpio.

2
haridsv