Ich habe mehrere Anleitungen gelesen, wie man btrfs-Snapshots mit rsync kombiniert, um eine effiziente Backup-Lösung mit dem Verlauf zu erstellen. Es hängt jedoch davon ab, ob rsync --inplace
nur die Teile der Dateien geändert werden, 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.
21
rsync
die gesamte Datei gelesen und dann nur die benötigten Teile gesucht und aktualisiert werden, kopiert btrfs nur diese aktualisierten Blöcke. Wenn jedoch die gesamte Dateirsync
gelesen und geschrieben wird, ist dies ein Problem.rsync
weiß nicht nur, dass es das Schreiben der gesamten Datei vermeiden kann, es schafft dies auch, ohne sie vollständig über das Netz zu kopieren. Schlaues kleines Programm.Antworten:
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:
Berühren Sie dann eine Datei und synchronisieren Sie sie erneut
Sie können überprüfen, ob der Inode wieder verwendet wurde, indem Sie "ls -li" eingeben. Beachten Sie jedoch, dass 64 KByte gesendet wurden. Versuchen Sie es erneut mit --no-whole-file
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
davon ausgegangen wird (siehe Manpage für rsync). Andererseits wird in einem Netzwerk--no-whole-file
davon ausgegangen, dass--inplace
es sich als solches verhält--inplace --no-whole-file
.quelle
--inplace
impliziert das nicht--no-whole-file
?--no-whole-file
sowieso Standard?--inplace
dies nicht--no-whole-file
für die Version von rsync gilt, die ich 2013 verwendet habe. Sie können dieses Experiment jedoch gerne mit Ihrer eigenen Version von rsync wiederholen.inplace
geht nicht darum, nach gleichen / unterschiedlichen Blöcken zu suchen, es geht nur darum, die vorhandene Datei sofort von Offset 0 aus zu überschreiben . Es ist wahrscheinlich „sicherer“ als die alte Datei zu halten , so lange wie möglich, wenn der Prozess unterbrochen wird natürlich ist schlimmer für die Leistung, Spitzenspeicherverbrauch (denken Sie große Dateien), möglicherweise Fragmentierung ...) ....--no-whole-file
immer impliziert--inplace
, sonst wäre der größte Teil seines Leistungszuwachses weg. Konnte dies jedoch nicht dokumentieren ...Hier die eindeutige Antwort, die ich unter Berufung auf den korrekten Teil des Handbuchs vermute:
quelle
--inplace
überschreibt nur Regionen, die sich geändert haben. Verwenden Sie es immer, wenn Sie in Btrfs schreiben.quelle
-vvv
zeigt es Überspringen von passenden BlöckenDer 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
--whole-file
(oder-W
) überschrieben werden , umrsync
die Übertragung der gesamten Datei zu erzwingen .--inplace
behandelt, obrsync
während der Übertragung eine temporäre Datei erstellt wird 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 fordert Siersync
auf, 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.quelle
Von der Manpage:
Dies lässt mich glauben, dass es die Datei vollständig überschreibt - ich stelle mir vor, dass es für Rsync nahezu unmöglich wäre, auf andere Weise zu arbeiten.
quelle
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:
Dies scheinen also die technischen Details dessen zu sein, was rsync - inplace tut. Nach dem Beginn der Arbeit:
Wie aus der Antwort von @dataless hervorgeht , bedeutet dies, dass
--inplace
derselbe Speicherplatz verwendet wird, die gesamte Datei jedoch möglicherweise in diesen Speicherplatz kopiert wird. Insbesondere wenn Kopien von / zu lokalen Dateisystemen erstellt werden, geht rsync von dieser--whole-file
Option aus. Wenn es sich jedoch um ein systemübergreifendes Netzwerk handelt, wird die--no-whole-file
Option angenommen.quelle