
Existe uma maneira em qualquer distribuição Linux de realizar uma verificação md5sum ou sha1 enquanto o arquivo está sendo transferido de uma partição local para uma partição NFS?
Exemplo:
Eu tenho uma unidade montada em NFS e um arquivo muito grande na minha unidade local. Gostaria de transferir esse arquivo para a unidade montada em NFS e, ao mesmo tempo, fazer uma verificação MD5. Encontrei muitos scripts que fariam o md5 depois que o arquivo fosse copiado no drive remoto, mas como é um arquivo muito grande, 100GB+, gostaria de saber se há uma maneira de aproveitar o fato do arquivo já estar sendo vermelho durante a transferência.
Responder1
Não conheço um utilitário padrão do Linux que possa fazer isso. Se o arquivo coubesse em seu cache baseado em memória, não seria tão ineficiente fazer primeiro o md5sum e depois copiar (a cópia obteria os dados da memória).
Você pode usar a seguinte combinação:
cat filename | tee remote_output_name | md5sum
que você pode alterar para verificar diretamente a soma impressa em md5sum
relação ao md5 armazenado. Isso lê o arquivo do disco apenas uma vez.
Supondo que você tenha gerado um check.md5
com
cd dir_with_big_files
md5sum * > check.md5
, o programa Python a seguir faria a cópia e verificação de um único arquivo, lendo/gravando em 64 MB por vez. Salve-o como /usr/local/bin/chkcopy chmod +x /usr/local/chkcopy
e chame-o comchkcopy file_name check.md5 destination_filename_or_dir
#! /usr/bin/env python
import sys, os, hashlib
m = hashlib.md5()
file_name = sys.argv[1]
md5_name = sys.argv[2]
out_name = sys.argv[3]
if os.path.isdir(out_name):
out_name = os.path.join(out_name, file_name)
BUF_SIZE = 64 * (1024 ** 2)
with open(file_name, 'rb') as ifp:
with open(out_name, 'wb') as ofp:
buf = ifp.read(BUF_SIZE)
while buf:
m.update(buf)
ofp.write(buf)
buf = ifp.read(BUF_SIZE)
with open(md5_name) as fp:
for line in fp:
md5, fn = line.rstrip().split(' ', 1)
if fn == file_name:
assert m.hexdigest() == md5
break
else:
print('no md5 found for ' + file_name)
Responder2
Existe um fork do conhecido dd
com funcionalidade estendida chamadodcfldd
que uso há anos ou uma dd
versão corrigida chamadadc3dd
com funcionalidade um tanto semelhante.
Ambas as ferramentas podem realizar hash (mesmo com vários tipos de hash simultaneamente, se desejado) durante a cópia. Hashes podem ser calculados sobre pedaços e/ou todo o fluxo de dados.
algumas distros como o debian oferecem pacotes diretamente em seus repositórios, os pacotes para o fedora estão disponíveis através do servidor externorepositórios de certificadospor exemplo.
Para copiar um arquivo em pedaços de 8 MiB e calcular o MD5sum de todos os dados que é impresso em STDERR:
dcfldd if=/path/to/input bs=8M hash=md5 of=/path/to/outputfile
Para copiar um arquivo em pedaços de 8 MiB calculando o hash SHA256 de todos os dados mais a soma SHA256 em cada bloco de 64 MiB:
dcfldd if=/path/to/input bs=8M hash=SHA256 hashwindow=64M of=/path/to/outputfile
Um arquivo de saída para o hash calculado também pode ser fornecido especificando um arquivo por meio do hashlog
parâmetro. Ao calcular vários hashes, saídas separadas podem ser especificadas por meio de, por exemplo md5log=FILE1.log sha256log=FILE2.log
, .
Responder3
Você pode usar um programa externo ( crcsum
), que estende cp
e mv
com checksum: