O rsync verifica arquivos copiados entre duas unidades locais?

63

Eu quero fazer uma nova cópia de um grande número de arquivos de uma unidade local para outra.

Eu li que o rsync faz uma comparação de soma de verificação de arquivos ao enviá-los para uma máquina remota em uma rede.

  1. O rsync fará a comparação ao copiar os arquivos entre duas unidades locais?

  2. Se ele faz uma verificação - é uma aposta segura? Ou é melhor fazer uma comparação byte a byte?

por Frez 05.02.2012 / 23:35

4 respostas

69

O rsync sempre usa somas de verificação para verificar se um arquivo foi transferido corretamente. Se o arquivo de destino já existir, o rsync pode pular a atualização do arquivo se o horário e o tamanho da modificação corresponderem ao arquivo de origem, mas se o rsync decidir que os dados precisam ser transferidos, as somas de verificação serão sempre usadas nos dados transferidos entre o envio e recebimento de processos de rsync. Isso verifica se os dados recebidos são os mesmos que os dados enviados com alta probabilidade, sem a sobrecarga pesada de uma comparação de nível de byte na rede.

Quando os dados do arquivo são recebidos, o rsync grava os dados no arquivo e confia que, se o kernel indicar uma gravação bem-sucedida, os dados foram gravados sem danos no disco. O rsync não releia os dados e compara com a soma de verificação conhecida como uma verificação adicional.

Quanto à própria verificação, para o protocolo 30 e posteriores (primeiro suportado em 3.0.0), o rsync usa MD5 . Para protocolos mais antigos, a soma de verificação usada é MD4 .

Embora seja considerado obsoleto para hashes criptográficos seguros, o MD5 e o MD4 permanecem adequados para verificar a corrupção do arquivo.

Fonte: a man page e olhando o código-fonte do rsync para verificar.

    
por 06.02.2012 / 00:42
37

rsync não realiza a verificação pós-cópia para cópias de arquivos locais. Você pode verificar se não usa rsync para copiar um arquivo grande para uma unidade lenta (ou seja, USB) e depois copiar o mesmo arquivo com cp , ou seja:

time rsync bigfile /mnt/usb/bigfile

time cp bigfile /mnt/usb/bigfile

Ambos os comandos levam aproximadamente o mesmo tempo, portanto, rsync não pode estar fazendo a soma de verificação - já que isso envolveria a releitura do arquivo de destino do disco lento.

A página man é, infelizmente, enganosa quanto a isso. Também verifiquei isso com strace - depois que a cópia for concluída, rsync não emitirá read() chamadas no arquivo de destino, por isso não pode ser uma soma de verificação. Uma mais que você pode verificar é com algo como iotop : você vê rsync lendo e escrevendo simultaneamente (copiando da origem para o destino), depois sai. Se estivesse verificando a integridade, haveria uma fase somente de leitura.

    
por 03.03.2013 / 07:37
17

rsync faz uma comparação de soma de verificação antes de copiar (em alguns casos), para evitar copiar o que já está lá. O ponto da comparação de soma de verificação não é verificar se a cópia foi bem-sucedida. Esse é o trabalho da infraestrutura subjacente: os drivers do sistema de arquivos, os drivers de disco, os drivers de rede, etc. Aplicativos individuais como rsync não precisam se preocupar com essa loucura. Tudo que o rsync precisa fazer (e faz!) É verificar os valores de retorno das chamadas do sistema para se certificar de que não houve erro.

    
por 06.02.2012 / 00:10
1

Respostas rápidas e sujas, diretamente para as perguntas.

P: O rsync fará a comparação ao copiar os arquivos entre duas unidades locais? R: Ele fará uma comparação para descobrir o que copiar.

Q: Se ele faz uma verificação - é uma aposta segura? Ou é melhor fazer uma comparação byte por byte? A: tão seguro quanto a matemática por trás da soma de verificação MD5 do arquivo. Você pode tentar fazer um experimento simples para aprender e confiar na ferramenta.

Resposta longa: Eu acho que você queria que o rsync fizesse uma comparação de arquivos (bit a bit ou por soma de verificação) depois de copiar os arquivos. Se você é um dos poucos que valorizam a integridade dos dados, você pode achar útil o seguinte:

rscyn -avh [origem] [destino] & & rscyn -avhc [fonte] [destino]

acima da pasta de arquivos rsync do código na primeira execução e, se concluída sem problemas, executará o rsync novamente imediatamente ao executar a mesma comparação de nome de arquivo usando o hash do arquivo inteiro.

    
por 28.11.2018 / 06:29