Alguém pode esclarecer as diferenças entre as opções --checksum
e --ignore-times
do rsync?
Meu entendimento é o seguinte:
--checksum
Se o tamanho do arquivo e a hora corresponderem, ele fará uma soma de verificação em ambas as extremidades para ver se os arquivos são realmente idênticos.
--ignore-times
'Transfira' todos os arquivos, independentemente de o tempo do arquivo ser o mesmo em ambas as extremidades. Como ele ainda usará o algoritmo de transferência delta, se um arquivo realmente for idêntico, nada será transferido.
Essa é a diferença técnica, mas até onde eu sei, eles são semanticamente a mesma coisa.
Então, o que eu estou querendo saber é:
- Qual é a diferença prática entre as duas opções?
- Em que casos você usaria um ao invés do outro?
- Existe alguma diferença de desempenho entre eles?
Normalmente,
rsync
pula arquivos quando os arquivos têm tamanhos e tempos idênticos nos lados de origem e destino. Essa é uma heurística que geralmente é uma boa ideia, pois evitarsync
a necessidade de examinar o conteúdo de arquivos que provavelmente são idênticos nos lados de origem e destino.--ignore-times
dizrsync
para desativar a heurística de tempos e tamanhos de arquivos e, assim, transferir incondicionalmente TODOS os arquivos da origem para o destino.rsync
irá então proceder à leitura de todos os arquivos do lado de origem, pois precisará usar seu algoritmo de transferência delta ou simplesmente enviar todos os arquivos em sua totalidade, dependendo se a--whole-file
opção foi especificada.--checksum
também modifica a heurística de tempos e tamanhos de arquivo, mas aqui ela ignora tempos e examina apenas tamanhos. Arquivos nos lados de origem e destino que diferem em tamanho são transferidos, pois são obviamente diferentes. Arquivos com o mesmo tamanho são somados (com MD5 narsync
versão 3.0.0+, ou com MD4 em versões anteriores), e aqueles encontrados com somas diferentes também são transferidos.Nos casos em que os lados de origem e destino são basicamente os mesmos,
--checksum
a maioria dos arquivos será somada em ambos os lados. Isso pode levar muito tempo, mas o resultado é que o mínimo de dados será realmente transferido pela rede, especialmente se o algoritmo de transferência delta for usado. Claro, isso só é uma vitória se você tiver redes muito lentas e/ou CPU muito rápida.--ignore-times
, por outro lado, enviará mais dados pela rede e fará com que todos os arquivos de origem sejam lidos, mas pelo menos não imporá a carga adicional de calcular muitos hashsums criptograficamente fortes nas CPUs de origem e destino. Eu esperaria que esta opção tivesse um desempenho melhor do que--checksum
quando suas redes são rápidas e/ou sua CPU relativamente lenta.Acho que só usaria
--checksum
ou--ignore-times
se estivesse transferindo arquivos para um destino onde se suspeitasse que o conteúdo de alguns arquivos estava corrompido, mas cujos tempos de modificação não foram alterados. Não consigo pensar em nenhum outro bom motivo para usar qualquer uma das opções, embora provavelmente existam outros casos de uso.checksum também é útil se você estiver usando outro sistema para sincronizar arquivos, que não preservou registros de data e hora. O checksum transferirá apenas arquivos diferentes E atualizará todos os carimbos de data e hora no final do recebimento para que eles correspondam
Um detalhe: a opção checksum verifica um arquivo inteiro em uma extremidade, depois o arquivo inteiro na outra extremidade. Se seus arquivos são um pouco grandes, esse tipo de paralelismo mata.
Além disso, se você tiver arquivos grandes, é mais provável que você atinja um tempo limite com
--checksum
, pois não com-I
.Em
info rsync
relação à--checksum
opção - "Como essa soma de verificação de todo o arquivo de todos os arquivos em ambos os lados da conexão ocorre além das verificações automáticas de soma de verificação que ocorrem durante a transferência de um arquivo, essa opção pode ser bastante lenta."A
--ignore-times
opção provavelmente resultará em todos os arquivos codificados em delta e o algoritmo de transferência delta (codificação delta) é pelo menos tão lento quanto a soma de verificação.Não sei se o rsync
--ignore-times
é inteligente o suficiente para evitar a "verificação automática após a transferência" no caso frequente em que a transferência delta resultará em nada sendo transferido.Para
--ignore-times
:Ambos
--checksum
e--ignore-times
serão "bastante lentos", mas--ignore-times
provavelmente ainda mais lentos (devido às 2 possibilidades acima).Boa pergunta - por favor poste se você encontrar alguma diferença de desempenho na prática.