Faz rsync sobre qualquer tipo de soma de verificação? [duplicado]

4

Eu preciso transferir arquivos de vários servidores para um único host remoto usando o Rsync via SSH. No entanto, preciso ter certeza de que, antes que o arquivo seja excluído na origem usando o argumento --remove-from-source, o arquivo transferido está realmente lá.

Pelo que tenho lido, não há checksums pós-transferência e o rsync confia na resposta do kernel, mas esses artigos foram datados de 2005-2009. Eu queria saber se isso mudou nas atualizações recentes do rsync? Se não, que método (s) existem para verificar isso e, em seguida, excluir o arquivo de origem depois de verificado?

Edit: Eu não entendo como isso é uma duplicata. Minha pergunta não pertence a unidades locais no mesmo sistema ...

    
por linguru772x 11.08.2015 / 17:50

1 resposta

1

Resumo : Se o rsync obter dados em um disco, ele será executado sem perdas. No entanto, para ter certeza absoluta de que eles realmente conseguiram dados no disco , você precisará aplicar o patch fsync.diff ou chamar sync <files> posteriormente.

SSH fornece dados integridade - você está recebendo os mesmos dados que está enviando. Isso representa a rede.

Em seguida, o rsync usa a chamada de sistema write , pedindo ao kernel para gravar os dados no disco. A menos que seu disco rígido esteja falhando (uma pergunta diferente), isso também preservará a integridade dos dados.

No entanto, garantir que os dados estejam realmente no disco agora não é tão simples assim. A página de manual write faz a seguinte observação:

A successful return from write() does not make any guarantee that data has been committed to disk. In fact, on some buggy implementations, it does not even guarantee that space has successfully been reserved for the data. The only way to be sure is to call fsync(2) after you are done writing all your data.

Eu fiz o download do código-fonte mais recente do rsync (3.1.2pre1), usei fsync e não obtive nada. Por padrão, o rsync não chama fsync (também usei a versão% metadata-lessfdatasync: also nothing). Isso significa se esses write s fizeram alguma coisa ainda é dependente do sistema de arquivos.

Como solução, você pode:

  • Execute sync <files> , que chama fsync nos arquivos fornecidos. Quando isso retorna, eles definitivamente estão no disco.

  • Faça o download do diretório de correções de origem do rsync (fornecido como um download separado). Aplique o patch fsync.diff por Sami Farin. Ele “permite que você especifique --fsync se quiser que o fsync () seja chamado em todos os arquivos que escrevemos”. (Espero que isso se torne padrão no futuro.)

Normalmente, embora , os sistemas de arquivos modernos fazem suas gravações Pretty Soon ™, aproveitando brevemente a liberdade de cache quando o carregamento de IO é alto. Se você conhece o seu sistema, pode estar certo em pular este passo. Mas tenha em mente ao escrever código para uso mais amplo que os resultados podem diferir com base em seu sistema de arquivos, como ele é ajustado e se o deus do firmware na unidade está se sentindo benevolente.

    
por 11.08.2015 / 20:09