O rsync verifica os arquivos copiados entre duas unidades locais?

65

Quero fazer uma nova cópia nova 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 pela rede.

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

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

Frez
fonte

Respostas:

77

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 poderá pular a atualização do arquivo se a hora 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 sempre serão usadas nos dados transferidos entre os processos rsync de envio e recebimento. . Isso verifica se os dados recebidos são iguais aos dados enviados com alta probabilidade, sem a sobrecarga pesada de uma comparação no nível de bytes na rede.

Depois que 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 corrupção no disco. O rsync não relê os dados e compara com a soma de verificação conhecida como uma verificação adicional.

Quanto à verificação em si, para o protocolo 30 e além (primeiro suportado no 3.0.0), o rsync usa MD5 . Para protocolos mais antigos, a soma de verificação usada é MD4 .

Embora por muito tempo considerado obsoleto para hashes criptográficos seguros, o MD5 e o MD4 permanecem adequados para verificar a corrupção de arquivos.

Fonte: a página do manual e o código-fonte do rsync para verificar.

Kyle Jones
fonte
3
Eu odeio estourar a bolha de todos, mas o rsync só verifica a verificação da soma se a bandeira -c for adicionada!
27
@clint Não, a resposta está correta. Na explicação da página de manual sobre o -csinalizador: "Observe que o rsync sempre verifica se cada arquivo transferido foi reconstruído corretamente no lado de recebimento, verificando uma soma de verificação de arquivo inteiro gerada à medida que o arquivo é transferido, mas a automática após a transferência a verificação não tem nada a ver com a opção antes da transferência: "Este arquivo precisa ser atualizado?".
Michael Mrozek
7
Esta resposta não deixa claro se realmente verifica o arquivo após uma cópia. Se a soma de verificação for calculada à medida que o arquivo estiver sendo recebido, não será uma soma de verificação pós-cópia e você não poderá ter certeza de que o arquivo foi gravado corretamente. Você precisaria executar uma comparação adicional.
22815 Andre Miller
7
Baixa na votação porque não gosto do fato de que esta resposta é detalhada, bem escrita e tecnicamente correta e, ao mesmo tempo, tão fora do tópico que engana os leitores. O problema é que a resposta entra em grandes detalhes sobre o que acontece durante a transferência, enquanto o interlocutor afirma especificamente que se importa com cópias locais e não com transferências de rede. Tenho certeza de que Kyle Jones não queria enganar ninguém, mas esta resposta (IMHO) faz.
Ndemou
4
Kyle, não acredito que você responda errado. Eu já notei que é "detalhado bem escrito e tecnicamente correto", mas exige que o leitor seja desnecessariamente focado e cuidadoso. Por que cobrir a falta de verificação dos dados do disco que está sendo questionada no meio da sua resposta após 117 palavras que descrevem repetidamente outro processo de verificação irrelevante? De qualquer forma, obrigado pelo seu tempo e interesse nesta discussão. Eu sinceramente aprecio isso.
Ndemou 01/07/19
40

rsyncse não fazer a verificação pós-cópia para cópias de arquivos locais. Você pode verificar isso, rsynccopiando um arquivo grande para uma unidade lenta (por exemplo, USB) e copiando o mesmo arquivo com cp, por exemplo:

time rsync bigfile /mnt/usb/bigfile

time cp bigfile /mnt/usb/bigfile

Ambos os comandos levam aproximadamente a mesma quantidade de tempo e, portanto, rsyncnão podem estar realizando a soma de verificação - pois isso implicaria reler o arquivo de destino do disco lento.

A manpágina é, infelizmente, enganosa sobre isso. Também verifiquei isso com strace- depois que a cópia é concluída, rsyncnão ocorre read()chamadas no arquivo de destino; portanto, não pode ser feito com a soma de verificação. Mais uma vez, você pode verificar isso com algo como iotop: você vê rsynclendo e gravando simultaneamente (copiando da origem para o destino) e, em seguida, sai. Se estivesse verificando a integridade, haveria uma fase somente leitura.

Felix
fonte
11
"Infelizmente, a página de manual é enganosa sobre isso. Eu também verifiquei isso com strace" Você rastreou o processo remoto, executando o rsync, ou o local? Existem dois ... um é executado no destino, mesmo quando você usa ssh.
User129070
8
Não há verificação pós-cópia para nenhuma cópia, local ou remota. Você executa rsync -cnovamente se quiser forçá-lo a verificar.
Psusi
A verificação é feita no fluxo de entrada à medida que avança. Não é necessário lê-lo novamente no disco se o sistema de arquivos confirmar que foi gravado.
parar de prejudicar Monica
17

rsyncfaz uma comparação de soma de verificação antes de copiar (em alguns casos), para evitar copiar o que já existe. O objetivo da comparação da 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 esses, rsyncnão precisam se preocupar com essa loucura. Tudo o que é rsyncnecessário fazer (e faz!) É verificar os valores de retorno das chamadas do sistema para garantir que não haja erro.

Gilles 'SO- parar de ser mau'
fonte
11
Isto parece contradizer a resposta aceita ...
djule5
2
@ djule5 De que maneira? A resposta aceita parece ser principalmente sobre como o rsync verifica os arquivos transferidos , mas a pergunta e minha resposta são sobre cópias locais .
Gilles 'SO- stop be evil'
3
Ok, nesse contexto, eu concordo que faz mais sentido. Portanto, "O objetivo da comparação da soma de verificação não é verificar se a cópia foi bem-sucedida" é verdadeira apenas para cópias locais ; e "as somas de verificação são sempre usadas nos dados transferidos entre os processos rsync de envio e recebimento" é válido apenas para cópias transferidas . Acho a resposta aceita enganosa em relação à pergunta e acredito que sua resposta deve ser a aceita (apenas meus 2 centavos).
precisa saber é
Ainda sinto que esta resposta é um pouco enganadora. Por exemplo, ele diz que os drivers de rede, em particular, verificam se a cópia foi bem-sucedida - mas se você estava dizendo que a comparação da soma de verificação não verifica se a cópia foi bem-sucedida apenas para locais, os drivers de rede não entrariam em jogo.
Ken
11
@ Ken Eu não entendo o ponto que você está tentando fazer. Eu suspeito que você interpretou mal alguma coisa. Os drivers de rede entram em jogo somente se houver uma cópia em rede. O próprio Rsync faz uma comparação de soma de verificação antes de fazer qualquer cópia, para decidir se deseja copiar. O Rsync não faz nenhuma comparação de soma de verificação após a cópia (porque seria inútil: ele sabe o que acabou de ser copiado).
Gilles 'SO- stop be evil'
4

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

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

P: Se ele faz uma verificação - é uma aposta segura? Ou é melhor fazer uma comparação de byte a byte? R: 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 rsyncfazer uma comparação de arquivos (pouco a pouco ou por soma de verificação) depois de copiar os arquivos. Se você é um dos poucos que valorizam a integridade dos dados, poderá achar o útil abaixo:

rsync -avh [source] [destination] && rsync -avhc [source] [destination] 

A rsyncpasta de arquivos de código acima, na primeira execução e, se concluída sem problemas, será executada rsyncnovamente imediatamente, enquanto você realiza a mesma comparação de nomes de arquivos usando o hash do arquivo inteiro.

MN
fonte
1

Usando o rsync para verificar a integridade de uma duplicata

Para garantir que esse teste re-leia fisicamente os arquivos da mídia da unidade, sugiro desligar as duas unidades e reiniciá-las antes de executar este teste. Isso limpará seus caches voláteis internos.

Se também não reiniciar o Linux, você deve pelo menos descartar os caches ( * ) com:

sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'

Para reler as duas árvores e comparar suas somas de verificação:

rsync --dry-run --checksum --itemize-changes --archive SRC DEST

A soma de verificação moderna do rsync usa MD5, que é de 128 bits. A probabilidade de isso não detectar um erro em um arquivo individual é astronomicamente baixa (algumas discussões aqui ), mas não impossível.

nobar
fonte
Boa sorte em acertar as barras à direita.
nobar 5/04
Nenhuma notícia é boa notícia.
nobar 5/04
Não se preocupe --checksumaté que o teste tenha passado sem ele.
nobar 6/04