it-swarm.com.de

Schreibt rsync - inplace in der gesamten Datei oder nur in den Teilen, die aktualisiert werden müssen? (für btrfs + rsync backups)

Ich habe mehrere Anleitungen gelesen, wie man btrfs-Snapshots mit rsync kombiniert, um eine effiziente Backup-Lösung mit Verlauf zu erstellen. Es hängt jedoch davon ab, ob rsync --inplace nur die Teile von Dateien ändert, die sich tatsächlich geändert haben, oder ob die gesamte Datei nacheinander überschrieben wird. Wenn die gesamte Datei geschrieben wird, scheint btrfs immer eine neue Kopie der Datei zu erstellen, was die Effizienz der Idee erheblich beeinträchtigen würde.

20
Petr Pudlák

Wenn Sie zwei lokale Pfade mit rsync übergeben, wird standardmäßig "--whole-file" und keine Delta-Übertragung verwendet. Also, was Sie suchen, ist "--no-whole-file". Sie erhalten auch Delta-Transfer, wenn Sie '-c' angefordert haben.

So können Sie überprüfen:

$ 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

Berühren Sie dann eine Datei und synchronisieren Sie sie erneut

$ 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

Sie können mit "ls -li" überprüfen, ob der Inode wiederverwendet wurde. Beachten Sie jedoch, dass er ganze 64 KByte gesendet hat. Versuchen Sie es erneut mit --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

Jetzt haben Sie nur 494 Bytes gesendet. Sie können strace verwenden, um weiter zu überprüfen, ob eine der Dateien geschrieben wurde. Dies zeigt jedoch, dass mindestens die Delta-Übertragung verwendet wurde.

Beachten Sie (siehe Kommentare), dass für lokale Dateisysteme --whole-file angenommen wird (siehe Manpage für rsync). Andererseits wird in einem Netzwerk --no-whole-file angenommen, sodass sich --inplace für sich als --inplace --no-whole-file verhält.

29
dataless

Hier die eindeutige Antwort, die ich unter Berufung auf den korrekten Teil des Handbuchs vermute:

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

--inplace überschreibt nur Regionen, die sich geändert haben. Verwenden Sie es immer, wenn Sie in Btrfs schreiben.

4
Gabriel

der Delta-Transfer-Algorithmus von rsync behandelt, ob die gesamte Datei übertragen wird oder nur die Teile, die sich unterscheiden. Dies ist das Standardverhalten beim Synchronisieren einer Datei zwischen zwei Computern, um Bandbreite zu sparen. Dies kann mit dem --whole-file (oder -W) überschrieben werden, um rsync zu zwingen, die gesamte Datei zu übertragen.

--inplace legt fest, ob rsync während der Übertragung eine temporäre Datei erstellt oder nicht. Standardmäßig wird eine temporäre Datei erstellt. Dies bietet ein gewisses Maß an Sicherheit, da bei einer Unterbrechung der Übertragung die vorhandene Datei auf dem Zielcomputer erhalten bleibt. --inplace überschreibt dieses Verhalten und weist rsync an, die vorhandene Datei direkt zu aktualisieren. Auf diese Weise laufen Sie Gefahr, eine inkonsistente Datei auf dem Zielcomputer zu haben, wenn die Übertragung unterbrochen wird.

3
Mike T.

Von der Manpage:

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.

Dies lässt mich glauben, dass die Datei vollständig überschrieben wird. Ich stelle mir vor, dass es für Rsync nahezu unmöglich ist, auf andere Weise zu arbeiten.

2
Laxsnor

Die theoretische Arbeit zu In-Place-Rsync wird in diesem Artikel beschrieben .

Referenz: D. Rasch und R. Burns. In-Place Rsync: Dateisynchronisierung für mobile und drahtlose Geräte. USENIX Annual Technical Conference, FREENIX-Strecke, 91-100, USENIX, 2003.

Über den Link:

... Wir haben die vorhandene rsync-Implementierung geändert, um die direkte Rekonstruktion zu unterstützen.

Abstract: [...] Wir haben rsync so geändert, dass es auf Geräten mit eingeschränktem Speicherplatz funktioniert. Dateien auf dem Zielhost werden im selben Speicher aktualisiert, den die aktuelle Version der Datei belegt. Speicherplatzbeschränkte Geräte können herkömmliches rsync nicht verwenden, da für die alte und die neue Version der Datei Speicher oder Speicher erforderlich ist. Beispiele für das Synchronisieren von Dateien auf Mobiltelefonen und Handheld-PCs mit kleinem Speicher. Der In-Place-Rsync-Algorithmus codiert die komprimierte Darstellung einer Datei in einem Diagramm, das dann topologisch sortiert wird, um die In-Place-Eigenschaft zu erzielen. [...]

Dies scheinen also die technischen Details dessen zu sein, was rsync - inplace tut. Nach dem Beginn der Arbeit:

Wir haben rsync so geändert, dass es Dateisynchronisierungsaufgaben mit direkter Rekonstruktion ausführt. [...] Anstatt temporären Speicherplatz zu verwenden, werden die Änderungen an der Zieldatei an dem Speicherplatz vorgenommen, der bereits von der aktuellen Version belegt wird. Mit diesem Tool können Geräte synchronisiert werden, auf denen der Platz ist begrenzt.

Wie aus der Antwort von @ dataless hervorgeht, verwendet --inplace denselben Speicherplatz, kopiert jedoch möglicherweise die gesamte Datei in diesen Speicherplatz. Insbesondere wenn Kopien von/zu lokalen Dateisystemen erstellt werden, geht rsync von der Option --whole-file aus. Wenn es sich dagegen um ein systemübergreifendes Netzwerk handelt, wird die Option --no-whole-file verwendet.

0
user92979