Existe um tar ou cpio mais inteligente disponível para recuperar eficientemente um arquivo armazenado no arquivo morto?

24

Estou usando tarpara arquivar um grupo de arquivos muito grandes (vários GB) bz2.

Se eu uso tar -tf file.tarpara listar os arquivos no arquivo morto, isso leva muito tempo para ser concluído (~ 10 a 15 minutos).

Da mesma forma, cpio -t < file.cpioleva tanto tempo para concluir, mais ou menos alguns segundos.

Consequentemente, a recuperação de um arquivo de um arquivo morto (por tar -xf file.tar myFileOfInterest.bz2exemplo) é tão lenta.

Existe um método de arquivamento por aí que mantém um "catálogo" prontamente disponível com o arquivo, para que um arquivo individual dentro do arquivo possa ser recuperado rapidamente?

Por exemplo, algum tipo de catálogo que armazena um ponteiro para um byte específico no arquivo morto, bem como o tamanho do arquivo a ser recuperado (assim como quaisquer outras informações específicas do sistema de arquivos).

Existe uma ferramenta (ou argumento para tarou cpio) que permita a recuperação eficiente de um arquivo dentro do arquivo morto?

Alex Reynolds
fonte

Respostas:

15

tar (e cpio e afio e pax e programas similares) são formatos orientados para o fluxo - eles devem ser transmitidos diretamente para uma fita ou canalizados para outro processo. enquanto, em teoria, seria possível adicionar um índice no final do arquivo / fluxo, eu não conheço nenhuma versão que o faça (seria uma melhoria útil)

ele não ajudará nos seus arquivos tar ou cpio existentes, mas há outra ferramenta, dar ("arquivamento em disco"), que cria arquivos que contêm esse índice e pode fornecer rápido acesso direto a arquivos individuais dentro do arquivamento. .

se o dar não estiver incluído no seu unix / linux-dist, você pode encontrá-lo em:

http://dar.linux.free.fr/

cas
fonte
Existe uma maneira de canalizar uma extração para a saída padrão? Parece que há uma maneira de criar um arquivo a partir da entrada padrão, mas não uma maneira (pelo menos não diretamente) de extrair para a saída padrão. Não está claro na documentação se existe uma maneira de fazer isso. Você sabe como isso pode ser feito?
Alex Reynolds
1
não, não sei. Na verdade, eu não uso o dar-me ... eu apenas sei que ele existe. Estou feliz o suficiente com o tar e tendem a apenas criar arquivos de texto que listam o conteúdo de arquivos tar grandes que talvez eu queira pesquisar mais tarde. você pode fazer isso ao mesmo tempo em que cria o arquivo tar usando a opção v duas vezes (por exemplo, "tar cvvjf /tmp/foo.tar.bz2 / path / to / backup> /tmp/foo.txt")
cas
10

Você pode usar o SquashFS para esses arquivos. Isto é

  • projetado para ser acessado usando um driver de fusível (embora exista uma interface tradicional)
  • compactado (quanto maior o tamanho do bloco, mais eficiente)
  • incluído no kernel do Linux
  • armazena UIDs / GIDs e tempo de criação
  • ciente de endianess, portanto, bastante portátil

A única desvantagem que conheço é que é somente leitura.

http://squashfs.sourceforge.net/ http://www.tldp.org/HOWTO/SquashFS-HOWTO/whatis.html

MauganRa
fonte
8

Embora não armazene um índice, staré suposto ser mais rápido que tar. Além disso, ele suporta nomes de arquivos mais longos e oferece melhor suporte para atributos de arquivo.

Como eu sei, descompactar o arquivo leva tempo e provavelmente seria um fator na velocidade da extração, mesmo que houvesse um índice.

Editar: Você também pode querer dar uma olhada xar. Ele tem um cabeçalho XML que contém informações sobre os arquivos no arquivo morto.

Na página referenciada:

O cabeçalho XML de Xar permite que ele contenha metadados arbitrários sobre arquivos contidos no arquivo morto. Além dos metadados do arquivo unix padrão, como o tamanho do arquivo e os tempos de modificação e criação, o xar pode armazenar informações como bits do arquivo ext2fs e hfs, sinalizadores unix, referências a atributos estendidos, informações do Mac OS X Finder, Mac OS X bifurcações de recursos e hashes dos dados do arquivo.

Pausado até novo aviso.
fonte
+1 por me alertar sobre uma ferramenta útil que eu nunca tinha ouvido falar antes.
cas
O link de starestá inativo ......
Pacerier
5

Thorbjørn Ravn Anderser está certo. O tar GNU cria arquivos "procuráveis" por padrão. Mas ele não usa essas informações quando lê esses arquivos se a opção -n não for fornecida. Com a opção -n, acabei de extrair o arquivo de 7 GB do arquivo de 300 GB no tempo necessário para ler / gravar 7 GB. Sem -n demorou mais de uma hora e não produziu resultado.

Não tenho certeza de como a compressão afeta isso. Meu arquivo não foi compactado. Os arquivos compactados não são "procuráveis" porque o tar atual do GNU (1.26) transfere a compactação para o programa externo.

Aidas Kasparas
fonte
de acordo com a página de manual do tar man7.org/linux/man-pages/man1/tar.1.html , o GNU tar usará, por padrão, o formato buscável ao escrever e, se o arquivo for procurável, o usará ao ler (por lista ou extrato). Se você estiver usando o GNU tar e ainda estiver vendo o problema, envie um relatório de bug com o GNU.
Brian Minton 22/12
7
Se eu li o manual corretamente, ele nunca diz que tem algum tipo de índice e pode pular para qualquer arquivo dentro do arquivo morto, com o nome do arquivo. --seek significa apenas que a mídia subjacente é procurável, de modo que, quando lê desde o início, pode pular a leitura do conteúdo do arquivo, mas ainda precisa ler os cabeçalhos de entrada desde o início. Dito isto, se você possui um arquivo com 1 milhão de arquivos e tenta extrair o último com --no-seek, precisa ler o conteúdo de todos os arquivos; com --seek, você só precisa ler cabeçalhos de 1 milhão, um para cada arquivo, mas ainda é super lento.
icando
4

O único formato de arquivo que conheço que armazena um índice é o ZIP, porque tive que reconstruir índices corrompidos mais de uma vez.

mulher
fonte
2

Ele não indexa o que eu sei, mas eu uso o dump & restore com arquivos grandes, e navegar na árvore de restauração no modo interativo para selecionar arquivos aleatórios é MUITO rápido.

MediaManNJ
fonte
2

Você pode usar o formato de arquivo / compactação 7z (7zip) se tiver acesso ao p7zip-fullpacote.

No Ubuntu, você pode usar este comando para instalá-lo:

$ sudo apt-get install p7zip-full

Para criar um arquivo morto, você pode usar 7z a <archive_name> <file_or_directory>e, se você não deseja compactar os arquivos e apenas "armazená-los" como estão, pode usar a -mx0opção como:

$ 7z a -mx0 myarchive.7z myfile.txt

Creating archive myarchive.7z

Você pode extrair os arquivos usando 7z e:

$ 7z e myarchive.7z

Processing archive: myarchive.7z
Extracting  myfile.txt

Ou você pode listar o índice do arquivo com o 7z lque é útil para pesquisar grep:

$ 7z l myarchive.7z | grep

2014-07-08 12:13:39 ....A            0            0  myfile.txt

Essa também é a topção para testar a integridade, uadicionar / atualizar um arquivo no arquivo morto e dexcluir um arquivo.

NOTA IMPORTANTE
Do não usar o formato 7zip para Linux sistema de arquivos backups, pois não armazena o proprietário eo grupo dos arquivos contidos.

complistic
fonte
Para o Linux, seria bom compactar 7 zip um arquivo tar.
Thorbjørn Ravn Andersen
1

Eu acredito que o GNU tar é capaz de fazer o que você deseja, mas não consigo localizar um recurso definitivo para isso.

De qualquer forma, você precisa de um formato de arquivamento com um índice (pois isso permitirá que você faça o que deseja). Eu não acredito que os arquivos ZIP possam crescer tanto assim, infelizmente.

Thorbjørn Ravn Andersen
fonte
Arquivos ZIP podem crescer muito .
Pacerier
1
Se eu li o manual corretamente, ele nunca diz que tem algum tipo de índice e pode pular para qualquer arquivo dentro do arquivo morto, com o nome do arquivo. --seek significa apenas que a mídia subjacente é procurável, de modo que, quando lê desde o início, pode pular a leitura do conteúdo do arquivo, mas ainda precisa ler os cabeçalhos de entrada desde o início. Dito isto, se você possui um arquivo com 1 milhão de arquivos e tenta extrair o último com --no-seek, precisa ler o conteúdo de todos os arquivos; com --seek, você só precisa ler cabeçalhos de 1 milhão, um para cada arquivo, mas ainda é super lento.
icando
2
@Pacerier No meu entender, o formato ZIP64 permite arquivos muito grandes, mas o formato ZIP original não.
Thorbjørn Ravn Andersen
@ ThorbjørnRavnAndersen, Um único arquivo de 4 GB é grande .
21715 Pacerier
3
O @Pacerier 4GB não tem sido grande desde que as ISOs de DVD entraram em cena há quase vinte anos. Terrabytes é grande hoje em dia.
Oligofren