Aqui está o meu problema: preciso arquivar para tar arquivos (até 60 TB) de arquivos grandes (geralmente 30 a 40 GB cada). Eu gostaria de criar somas de verificação (md5, sha1, qualquer que seja) desses arquivos antes de arquivar; no entanto, não ler todos os arquivos duas vezes (uma para soma de verificação, duas vezes para tar'ing) é mais ou menos uma necessidade para obter um desempenho de arquivamento muito alto (o LTO-4 quer 120 MB / s sustentados e a janela de backup é limitada).
Então, eu precisaria de alguma maneira de ler um arquivo, alimentando uma ferramenta de soma de verificação de um lado e construindo um alcatrão para fita do outro lado, algo junto:
tar cf - files | tee tarfile.tar | md5sum -
Exceto que eu não quero a soma de verificação de todo o arquivo morto (este exemplo de código de shell faz exatamente isso), mas uma soma de verificação para cada arquivo individual no arquivo morto.
Estudei as opções GNU tar, Pax, Star. Eu olhei para a fonte de Archive :: Tar . Não vejo uma maneira óbvia de conseguir isso. Parece que terei que criar manualmente algo em C ou semelhante para conseguir o que preciso. O Perl / Python / etc simplesmente não diminui o desempenho, e os vários programas tar perdem a "arquitetura de plug-in" necessária. Alguém sabe de alguma solução existente para isso antes de começar a agitar o código?
tar
se você decidir escrevê-lo;) #7z
você pode escolher o hash e imprimi-lo de uma forma quesha1sum
esha256sum
pode entender: 7zip.bugaco.com/7zip/7zip_15_09/MANUAL/cmdline/commands/... (e sami-lehtinen.net/blog/... ) Experimente:7z h -scrcsha256 mydir/* | sed --regexp-extended 's, +[0-9]+ +, ,g' > mydir.sha256sum ; sha256sum -c mydir.sha256sum
(testado com a versão 15.09 beta do p7zip)Respostas:
Antes de prosseguir e reescrever o tar, você pode criar um perfil do método rápido e fácil de ler os dados duas vezes, pois pode não ser muito mais lento do que fazê-lo de uma só vez.
O método de duas passagens é implementado aqui:
http://www.g-loaded.eu/2007/12/01/veritar-verify-checksums-of-files-within-a-tar-archive/
com a linha única:
Embora seja verdade que o md5sum está lendo cada arquivo do disco em paralelo com o tar, em vez de obter os dados transmitidos pelo canal, o cache de disco do Linux deve fazer com que este segundo leia uma leitura simples de um buffer de memória, que não deve ser realmente mais lento do que uma leitura stdin. Você só precisa ter espaço suficiente no cache do disco para armazenar o suficiente de cada arquivo que o segundo leitor esteja sempre lendo no cache e não ficando atrás o suficiente para recuperar o disco.
fonte
Aqui está um exemplo de script Python. Ele calcula a soma de verificação do arquivo como sendo adicionada ao arquivo morto. No final do script, o arquivo de soma de verificação é adicionado ao arquivo morto.
Ao desarmar, use o chksum_file para verificar a soma de verificação
fonte
Eu acho que seu problema é uma questão de design do tar, pois o tar não permite acesso / posicionamento aleatório dentro do arquivo morto através de uma tabela de conteúdo, portanto, todos os protocolos serão de arquivo e não baseados em buffer.
Assim, você pode observar diferentes formatos, como PAX ou DAR, que permitem acesso aleatório.
fonte
Os formatos de arquivo recentes geralmente incluem alguns hash para verificação de arquivos, mas eles têm um problema semelhante: nem sempre é possível escolher sua própria função de hash, nem manter uma cópia local dos hashes.
Convém salvar uma cópia local dos hashes, diferente daquela incorporada no próprio arquivo morto: por exemplo, se o arquivo morto estiver armazenado offline (em fitas ou em um datacenter caro para ler) e você desejar verificar uma cópia local de um arquivo / diretório.
O 7zip tem várias opções, como o
7z h
hash personalizado e7z l -slt
a lista de todos os hashes e outros enfeites, mas e se você quiser uma lista de hashes MD5 ou sha1? Você pode usar-bb
e-bs
controlar a verbosidade e reutilizar o método George Notaras mencionado na resposta aceita:fonte