Rsync --inplace scrive sull'intero file o solo sulle parti che devono essere aggiornate? (per backup btrfs + rsync)


21

Stavo leggendo diverse guide su come combinare le istantanee di btrfs con rsync per creare una soluzione di backup efficiente con la cronologia. Tuttavia, tutto dipende se rsync --inplacemodifica solo quelle parti di file che sono effettivamente cambiate o se sovrascrive l'intero file in sequenza. Se scrive l'intero file, allora sembra che btrfs creerà sempre una nuova copia del file, il che renderebbe l'idea molto meno efficiente.


Come potrebbe anche sapere se può evitare di scrivere sull'intero file? Non è necessario prima leggere l'intero file per capire cosa è cambiato?
Mehrdad,

2
@Mehrdad sì, sì, ma leggere il tutto non è un problema. Se rsynclegge l'intero file e quindi cerca e aggiorna solo le parti necessarie, btrfs copia solo questi blocchi aggiornati. Ma se rsynclegge e scrive l'intero file, allora sarà un problema.
Petr Pudlák,

1
@Mehrdad rsyncnon solo sa che potrebbe evitare di scrivere l'intero file, ma riesce a farlo senza copiarlo completamente in rete. Piccolo programma intelligente.
Gunther Piez,

Risposte:


31

Se si passa a rsync due percorsi locali, per impostazione predefinita verrà utilizzato "--whole-file" e non delta-transfer. Quindi, quello che stai cercando è "--no-whole-file". Riceverai anche delta-transfer se hai richiesto '-c'.

Ecco come è possibile verificare:

$ 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

Quindi tocca un file e risincronizza

$ 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

È possibile verificare che abbia riutilizzato l'inode con "ls -li", ma si noti che ha inviato un intero 64 KB di byte. Riprova con --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

Ora hai inviato solo 494 byte. È possibile utilizzare strace per verificare ulteriormente se uno qualsiasi dei file è stato scritto, ma questo mostra almeno il delta-transfer utilizzato.

Nota (vedi commenti) che per i filesystem locali --whole-fileè assunto (vedi la pagina man per rsync). D'altra parte, --no-whole-filesi presume che attraverso una rete --inplacesi comporti da solo --inplace --no-whole-file.


Perché non --inplaceimplica --no-whole-file?
Geremia,

Il --no-whole-filedefault non è comunque?
Geremia,

2
@Geremia no se entrambi i percorsi sono locali. E il mio esempio mostra che --inplacenon implica --no-whole-filela versione di rsync che stavo usando nel 2013, ma puoi ripetere questo esperimento con la tua versione di rsync.
dataless

Bene, inplacenon si tratta di "cercare blocchi uguali / diversi", si tratta solo di sovrascrivere immediatamente il file esistente, dall'offset 0. (altrimenti si crea una copia temporanea, e solo allora il vecchio file di destinazione viene eliminato e la copia temporanea rinominata Probabilmente è ritenuto "più sicuro" mantenere il vecchio file il più a lungo possibile, se il processo viene interrotto. Naturalmente questo è peggio per prestazioni, consumo di memoria di picco (pensa a file di grandi dimensioni), possibilmente frammentazione ...) ...
Frank Nocke,

1
Immagino che sia il contrario, --no-whole-fileimplica sempre --inplace, altrimenti gran parte del suo guadagno in termini di prestazioni sarebbe sparito. Non ho trovato questo documentato, però ...
Frank Nocke,

15

Ecco la risposta definitiva immagino, citando la parte corretta del manuale:

   --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.

4

--inplacesovrascrive solo le regioni che sono state modificate. Usalo sempre quando scrivi su Btrfs.


E hai una prova che mostra che non sovrascrive altre parti dei file?
Petr Pudlák,

Lo stesso vale per ZFS?
ewwhite,

@ewwhite: dato che ZFS è COW (copia su scrittura) come BTRFS, allora sì.
Geremia,

@ PetrPudlák lo -vvvmostra saltando i blocchi abbinati
Tom Hale,

3

L'algoritmo di trasferimento delta di rsync si occupa della trasmissione dell'intero file o solo delle parti che differiscono. Questo è il comportamento predefinito quando si risincronizza un file tra due macchine per risparmiare sulla larghezza di banda. Questo può essere sostituito con --whole-file(o -W) per forzare la rsynctrasmissione dell'intero file.

--inplacesi occupa se rsync, durante il trasferimento, creerà o meno un file temporaneo. Il comportamento predefinito è creare un file temporaneo. Ciò fornisce una misura di sicurezza in quanto se il trasferimento viene interrotto, il file esistente nella macchina di destinazione rimane intatto / intatto. --inplaceignora questo comportamento e dice rsyncdi aggiornare direttamente il file esistente. Con questo, si corre il rischio di avere un file incoerente nel computer di destinazione se il trasferimento viene interrotto.


2

Dalla pagina man:

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.

Questo mi porta a credere che sovrascriva il file nella sua interezza: immagino che sarebbe quasi impossibile per rsync funzionare in altro modo.


2
Dopo aver determinato quali parti devono essere aggiornate, potrebbe semplicemente cercare quelle parti e aggiornarle, invece di scrivere l'intero file.
Petr Pudlák,

0

Il lavoro teorico su rsync sul posto è descritto in questo documento .

Riferimento di carta: D. Rasch e R. Burns. Rsync sul posto: sincronizzazione dei file per dispositivi mobili e wireless. Conferenza tecnica annuale USENIX, traccia FREENIX, 91-100, USENIX, 2003.

Dal link:

... Abbiamo modificato l'implementazione rsync esistente per supportare la ricostruzione sul posto.

Riassunto: [...] abbiamo modificato rsync in modo che funzioni su dispositivi con spazio limitato. I file sull'host di destinazione vengono aggiornati nella stessa memoria occupata dalla versione corrente del file. I dispositivi con limitazioni di spazio non possono utilizzare rsync tradizionale perché richiedono memoria o archiviazione per la versione precedente e nuova del file. Gli esempi includono la sincronizzazione di file su telefoni cellulari e PC palmari, che hanno piccoli ricordi. L'algoritmo rsync sul posto codifica la rappresentazione compressa di un file in un grafico, che viene quindi topologicamente ordinato per ottenere la proprietà sul posto. [...]

Quindi questo sembra essere il dettaglio tecnico di ciò che sta facendo rsync --inplace. Secondo l'inizio del documento:

Abbiamo modificato rsync in modo che esegua le attività di sincronizzazione dei file con la ricostruzione sul posto. [...] Invece di utilizzare lo spazio temporaneo, le modifiche al file di destinazione avvengono nello spazio già occupato dalla versione corrente. Questo strumento può essere utilizzato per sincronizzare i dispositivi in ​​cui lo spazio è limitato.

Come risulta dalla risposta di @ dataless , ciò implica che --inplacesta utilizzando lo stesso spazio di archiviazione, ma potrebbe comunque copiare l'intero file in quello spazio. In particolare, quando vengono eseguite copie da / verso filesystem locali, rsync assume l' --whole-fileopzione. D'altra parte, quando si trova su sistemi collegati in rete, assume l' --no-whole-fileopzione.


1
Allora, qual è la risposta?
Xen2050,

Mie scuse. Non stavo prestando sufficiente attenzione. Con la risposta di @ dataless, questo dovrebbe chiarire le cose.
Diagon,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.