剛好最近工作上需要透過 4G 網路傳大檔案,但希望大檔案傳到一半斷掉後可以續傳,而不要浪費頻寬整個重傳,所以查了資料並且測了一些東西...
其中一個比較特別的是發現 rsync 的預設是傳整個檔案 (當檔案有變化時),而不是傳 delta (有變更的部份),不過還好,可以透過指令強制使用 delta。
在「Does rsync --inplace write to the entire file, or just to the parts that need to be updated? (for btrfs+rsync backups)」這邊有提到幾個需要設定的指令。
首先是標題就有提到的 --inplace
,在 manpage 裡面有提到是直接更新檔案,而非建立一個新檔案再 rename,這樣做的缺點是其他的應用程式可能會讀到改到一半的檔案:
update destination files in-place
另外一個提到的是 --no-whole-file
,這個要看 --whole-file
的說明來理解,後者就是不開 delta:
copy files whole (w/o delta-xfer algorithm)
第三個是 -c
,強制使用 checksum 比對:
skip based on checksum, not mod-time & size
不過我的應用裡面不太想管這個,就沒設定 -c
了,基本上是靠 ssh 的保護,不會有收到錯誤封包的問題。
整體來說,這個方法對兩邊的機器都比較吃資源,而且會遇到應用程式在還在傳輸時讀到檔案的問題,但如果可以克服,而且目標是省頻寬的話,算是個還不錯的方法...