rsync lädt immer alle Dateien von macOS => Linux hoch

532
f1nn

Ich teste rsync mit dem WebDAV-Server im Docker-Container:

  • lokales Verzeichnis: / Benutzer / Benutzer / Dateien /
  • "Remote" gemounteter Server: / Volumes / webdav /

Hier ist der Ausgangszustand:

# remote ➜ cat /Volumes/webdav/remotefile change ➜ ls -la /Volumes/webdav/remotefile -rwx------ 1 user staff 7 Dec 2 01:39 /Volumes/webdav/remotefile  # local ➜ cat /Users/user/files/remotefile change ➜ ls -la /Users/user/files/remotefile -rwx------ 1 user staff 7 Dec 2 01:39 /Users/user/files/remotefile 

Jetzt ändern wir die lokale Datei und laden sie auf den "entfernten" Server hoch:

➜ files echo 'add#0' > ./remotefile ➜ files cat remotefile add#0 ➜ files \rsync -varP /Users/user/files/* /Volumes/webdav/ --delete building file list ... 1 file to consider remotefile 6 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1)  sent 132 bytes received 42 bytes 348.00 bytes/sec total size is 6 speedup is 0.03 

Datei wurde erfolgreich hochgeladen, da sie geändert wurde. Wenn ich jedoch rsync erneut local => remote starte, wird es erneut hochgeladen:

➜ files \rsync -varP /Users/user/files/* /Volumes/webdav/ --delete building file list ... 1 file to consider remotefile 6 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1)  sent 132 bytes received 42 bytes 348.00 bytes/sec total size is 6 speedup is 0.03 

Jetzt teste ich die Gegenrichtung:

➜ files \rsync -varP /Volumes/webdav/* /Users/user/files/ --delete building file list ... 1 file to consider remotefile 6 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1)  sent 132 bytes received 42 bytes 348.00 bytes/sec total size is 6 speedup is 0.03 

Datei-Downloads erfolgreich. Und noch einmal ...

➜ files \rsync -varP /Volumes/webdav/* /Users/user/files/ --delete building file list ... 1 file to consider  sent 80 bytes received 20 bytes 200.00 bytes/sec total size is 6 speedup is 0.06 

... zeigt 0 Übertragungen, da die Datei nicht geändert wurde. Das ist das erwartete Verhalten.

Warum funktioniert es nicht mit local => remote upload und lädt Dateien immer wieder hoch?

Vielen Dank.

2

1 Antwort auf die Frage

2
StandardEyre

Haben Sie bestätigt, dass die Uhren auf localund synchron sind remote?

Auf der rsync-Manpage :

 Rsync finds files that need to be transferred using a lqquick checkrq algorithm  (by default) that looks for files that have changed in size  or in last-modified time. 

Wenn die Uhren sind nicht synchron, und Sie sind nicht in der Lage ein zu bearbeiten, versuchen, rsync zu sein ein wenig „unschärfer“ mit zu sagen, wie es für die Zeit überprüft. Wieder von der Manpage zu rsync

 --modify-window When comparing two timestamps, rsync treats the timestamps  as being equal if they differ by no more than the modify-window value.  This is normally 0 (for an exact match), but you may find it useful  to set this to a larger value in some situations.  In particular, when transferring to or from an MS Windows FAT filesystem  (which represents times with a 2-second resolution),  --modify-window=1 is useful (allowing times to differ by up to 1 second). 

Führen Sie rsync mit der --size-onlyOption aus und prüfen Sie, ob sich das Verhalten von rsyncÄnderungen ändert.

Eine andere Alternative ist die Verwendung der --checksumOption für rsync. Dies erfordert mehr Platten-E / A und Zyklen, um Prüfsummen zu generieren, sodass sie langsamer sein kann. Es wäre interessant zu wissen, ob das Problem dadurch verschoben wird.


Brillante Vermutung! `date && docker exec 1c3f5cb52a55 Datum => Fr. 2. Dezember 02:18:09 MSK 2016 Do 1. Dez 23:18:09 UTC 2016` f1nn vor 7 Jahren 0
"--size-only" funktioniert wie erwartet, aber wenn sich nur das Dateisymbol in der Datei geändert hat, wird davon ausgegangen, dass die Datei nicht geändert wurde. f1nn vor 7 Jahren 0
Leider kann ich die Zeit des Remote-Servers nicht steuern, da es sich um einen Webdav-Server von Drittanbietern handelt. Nur Größe ist unzuverlässig. Gibt es Abhilfemaßnahmen? Wie löst Dropbox zum Beispiel ähnliche Probleme? Ich denke, sie sollten einen ähnlichen Algorithmus verwenden. f1nn vor 7 Jahren 0
Die Moskauer Standardzeit (MSK) ist UTC +3, was mich zu dem Schluss bringt, dass die Uhren * synchron * sind. Vielleicht ist hier etwas anderes im Spiel. StandardEyre vor 7 Jahren 0
Ah, ich habe dich. Rsync respektiert TZ-Verschiebungen, daher ist die Zeit technisch gleich. Im Moment spiele ich mit der Option --checksum, und es scheint auf den ersten Blick zu funktionieren. Aber nicht sicher, wie es mit Remote-50-GB-Servern mit Millionen von Dateien funktioniert. Vielen Dank für den Hinweis auf die Richtung. f1nn vor 7 Jahren 0