Eu estava lendo vários guias sobre como combinar snapshots btrfs e rsync para criar uma solução de backup eficiente com o histórico. No entanto, tudo depende se rsync --inplace
modifica apenas as partes dos arquivos que realmente foram alteradas ou se substitui o arquivo inteiro sequencialmente. Se ele grava o arquivo inteiro, parece que o btrfs sempre criará uma nova cópia do arquivo, o que tornaria a idéia muito menos eficiente.
21
rsync
ler o arquivo inteiro e depois procurar e atualizar apenas as partes necessárias, o btrfs copiará apenas esses blocos atualizados. Mas sersync
ler e gravar o arquivo inteiro, será um problema.rsync
não apenas sabe que pode evitar gravar o arquivo inteiro, mas consegue fazê-lo sem copiá-lo completamente na rede. Pequeno programa inteligente.Respostas:
Se você passar o rsync dois caminhos locais, o padrão será usar "--whole-file" e não a transferência delta. Então, o que você está procurando é "--no-whole-file". Você também obtém transferência delta se solicitou '-c'.
Veja como você pode verificar:
Em seguida, toque em um arquivo e sincronize novamente
Você pode verificar se reutilizou o inode com "ls -li", mas observe que ele enviou 64K bytes inteiros. Tente novamente com --no-whole-file
Agora você enviou apenas 494 bytes. Você pode usar o strace para verificar se algum arquivo foi gravado, mas isso mostra que pelo menos foi utilizado o delta-transfer.
Observe (veja os comentários) que, para sistemas de arquivos locais,
--whole-file
é assumido (consulte a página de manual do rsync). Por outro lado, através de uma rede--no-whole-file
é assumido, então--inplace
por si só se comportará como--inplace --no-whole-file
.fonte
--inplace
implica--no-whole-file
?--no-whole-file
qualquer maneira, o padrão não é ?--inplace
isso não implica--no-whole-file
na versão do rsync que eu estava usando em 2013, mas você pode repetir esse experimento com sua própria versão do rsync.inplace
não se trata de 'procurar blocos iguais / diferentes', é apenas sobrescrever o arquivo existente imediatamente, a partir do deslocamento 0. (caso contrário, uma cópia temporária é criada, e somente então o arquivo de destino antigo é excluído e a cópia temporária renomeada Provavelmente, é considerado "mais seguro" manter o arquivo antigo o maior tempo possível, se o processo for interrompido. Claro que isso é pior para desempenho, consumo máximo de armazenamento (pense em arquivos grandes), possivelmente fragmentação ...) ...--no-whole-file
sempre implica--inplace
, caso contrário, a maior parte de seu ganho de desempenho teria desaparecido. Porém, não foi possível encontrar isso documentado ...Aqui está a resposta definitiva, eu acho, citando a parte correta do manual:
fonte
--inplace
substitui apenas as regiões que foram alteradas. Sempre use-o ao escrever no Btrfs.fonte
-vvv
mostra pular blocos correspondentesO algoritmo de transferência delta do rsync trata se o arquivo inteiro é transmitido ou apenas as partes que diferem. Esse é o comportamento padrão ao sincronizar novamente um arquivo entre duas máquinas para economizar largura de banda. Isso pode ser substituído pelo
--whole-file
(ou-W
) para forçarrsync
a transmissão do arquivo inteiro.--inplace
trata sersync
, durante a transferência, criará um arquivo temporário ou não. O comportamento padrão é criar um arquivo temporário. Isso fornece uma medida de segurança: se a transferência for interrompida, o arquivo existente na máquina de destino permanecerá intacto / intocado.--inplace
substitui esse comportamento e dizrsync
para atualizar o arquivo existente diretamente. Com isso, você corre o risco de ter um arquivo inconsistente na máquina de destino se a transferência for interrompida.fonte
Na página do manual:
Isso me leva a acreditar que ele escreve sobre o arquivo por inteiro - eu imagino que seria quase impossível para o rsync funcionar de outra maneira.
fonte
O trabalho teórico sobre o rsync no local é descrito neste artigo .
Referência do artigo: D. Rasch e R. Burns. Rsync no local: sincronização de arquivos para dispositivos móveis e sem fio. Conferência Técnica Anual da USENIX, faixa FREENIX, 91-100, USENIX, 2003.
No link:
Portanto, esses parecem ser os detalhes técnicos do que o rsync --inplace está fazendo. De acordo com o início do artigo:
Como fica claro na resposta da @ dataless , isso implica que você
--inplace
está usando o mesmo espaço de armazenamento, mas ainda pode copiar o arquivo inteiro nesse espaço. Especificamente, quando são feitas cópias de / para sistemas de arquivos locais, o rsync assume a--whole-file
opção. Mas quando está em sistemas de rede, por outro lado, assume a--no-whole-file
opção.fonte