O rsync --inplace escreve no arquivo inteiro ou apenas nas partes que precisam ser atualizadas? (para backups btrfs + rsync)

17

Eu estava lendo vários guias como combinar snapshots btrfs com o rsync para criar uma solução de backup eficiente com histórico. No entanto, tudo depende se rsync --inplace modifica apenas as partes dos arquivos que realmente foram alteradas ou se substitui todo o arquivo seqüencialmente. Se ele grava todo o arquivo, parece que o btrfs sempre criará uma nova cópia do arquivo, o que tornaria a ideia muito menos eficiente.

    
por Petr Pudlák 31.03.2013 / 15:42

6 respostas

25

Se você passar rsync dois caminhos locais, o padrão será usar "--whole-file", e não delta-transfer. Então, o que você está procurando é "--no-whole-file". Você também obtém delta-transfer se você requisitou '-c'.

Veja como você pode verificar:

$ mkdir a b
$ dd if=/dev/zero of=a/1 bs=1k count=64
$ dd if=/dev/zero of=a/2 bs=1k count=64
$ dd if=/dev/zero of=a/3 bs=1k count=64
$ rsync -av a/ b/
sending incremental file list
./
1
2
3

sent 196831 bytes  received 72 bytes  393806.00 bytes/sec
total size is 196608  speedup is 1.00

Em seguida, toque em um arquivo e sincronize novamente

$ touch a/1
$ rsync -av --inplace a/ b/
sending incremental file list
1

sent 65662 bytes  received 31 bytes  131386.00 bytes/sec
total size is 196608  speedup is 2.99

Você pode verificar se reutilizou o inode com "ls -li", mas notou que ele enviou um total de 64K bytes. Tente novamente com --no-whole-file

$ touch a/1
$ rsync -av --inplace --no-whole-file a/ b/
sending incremental file list
1

sent 494 bytes  received 595 bytes  2178.00 bytes/sec
total size is 196608  speedup is 180.54

Agora você enviou apenas 494 bytes. Você poderia usar strace para verificar se algum arquivo foi escrito, mas isso mostra pelo menos a transferência delta usada.

Note (veja os comentários) que para sistemas de arquivos locais, --whole-file é assumido (veja a man page do rsync). Por outro lado, através de uma rede --no-whole-file é assumida, então --inplace por si só se comportará como --inplace --no-whole-file .

    
por 12.11.2013 / 00:35
11

Aqui a resposta definitiva, eu acho, citando a parte correta do manual:

   --inplace

          [...]

          This option is useful for transferring large files
          with  block-based  changes  or  appended data, and
          also on systems that are disk bound,  not  network
          bound.   It  can  also  help  keep a copy-on-write
                                               *************
          filesystem snapshot from diverging the entire con‐
          *******************
          tents of a file that only has minor changes.
    
por 11.01.2016 / 08:37
4

--inplace sobrescreve apenas as regiões que foram alteradas. Sempre use-o ao gravar no Btrfs.

    
por 25.10.2013 / 14:31
3

O algoritmo de transferência delta do rsync lida com se o arquivo inteiro é transmitido ou apenas as partes que diferem. Esse é o comportamento padrão ao rsyncing um arquivo entre duas máquinas para economizar largura de banda. Isso pode ser cancelado com o --whole-file (ou -W ) para forçar o rsync a transmitir o arquivo inteiro.

--inplace lida com se rsync , durante a transferência, criará um arquivo temporário ou não. O comportamento padrão é criar um arquivo temporário. Isso dá uma medida de segurança, pois se a transferência for interrompida, o arquivo existente na máquina de destino permanecerá intacto / intacto. --inplace substitui esse comportamento e informa ao rsync 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.

    
por 11.11.2015 / 08:56
0

Da página do manual:

This  option  changes  how  rsync transfers a file when its data
needs to be updated: instead of the default method of creating a
new  copy  of  the file and moving it into place when it is com-
plete, rsync instead writes the updated  data  directly  to  the
destination file.

Isso me leva a acreditar que ele grava todo o arquivo - imagino que seria quase impossível para o rsync funcionar de outra maneira.

    
por 01.04.2013 / 04:32
0

O trabalho teórico no rsync local é descrito em este documento .

Referência de papel: D. Rasch e R. Burns. Rsync no local: Sincronização de arquivos para dispositivos móveis e sem fio. Conferência Técnica Anual USENIX, pista FREENIX, 91-100, USENIX, 2003.

Do link:

... We modified the existing rsync implementation to support in-place reconstruction.

Abstract: [...] We have modified rsync so that it operates on space constrained devices. Files on the target host are updated in the same storage the current version of the file occupies. Space-constrained devices cannot use traditional rsync because it requires memory or storage for both the old and new version of the file. Examples include synchronizing files on cellular phones and handheld PCs, which have small memories. The in-place rsync algorithm encodes the compressed representation of a file in a graph, which is then topologically sorted to achieve the in-place property. [...]

Então, esses parecem ser os detalhes técnicos do que o rsync --inplace está fazendo. De acordo com o começo do artigo:

We have modified rsync so that it performs file synchronization tasks with in-place reconstruction. [...] Instead of using temporary space, the changes to the target file take place in the space already occupied by the current version. This tool can be used to synchronize devices where space is limited.

Como fica claro na @ answer @/a>, isso significa que --inplace está usando o mesmo espaço de armazenamento, mas ainda pode copiar todo o arquivo para esse espaço. Especificamente, quando as cópias são feitas de / para sistemas de arquivos locais, o rsync assume a opção --whole-file . Mas quando está em sistemas de rede, por outro lado, assume a opção --no-whole-file .

    
por 22.07.2015 / 10:01