Skip to content

Latest commit

 

History

History
100 lines (69 loc) · 7.3 KB

rsync.md

File metadata and controls

100 lines (69 loc) · 7.3 KB

rsync

  • rsync - Wikipedia #ril
    • rsync 能在不同系統間根據 timestamp 及檔案大小傳輸/同步檔案的工具 (演算法屬 delta encoding,減少網路傳輸量),在 Unix-like 上很常見;用 zlib 進行壓縮,傳輸期間的安全性則可以靠 SSH/stunnel。
    • 例如 rsync local-file user@remote-host:remote-file 可以跟遠端同步 -- 用 user 的身份登入 remote-host,一旦 SSH 連線成功後,兩端的 rsync 就會一同決定哪些檔案 (或部份) 需要交換。
    • rsync 能以 daemon mode 運作,可以用 rsync:// (native protocol) 交換檔案。
  • How To Use Rsync to Sync Local and Remote Directories on a VPS | DigitalOcean (2013-09-10)
    • rsync = remote sync,主要用來同步 remote 與 local 兩端的檔案,利用演算法來最小化需要交換的資料量 -- 只交換有變動的部份。
    • rsync 是個工具,同時也可以是 network protocol (搭配 rsync 工具使用)。

新手上路 {: #getting-started }

$ rsync --archive [--delete] [--verbose] [--dry-run] src-dir/ dest-dir

rsync CLI {: #cli }

  • How To Use Rsync to Sync Local and Remote Directories on a VPS | DigitalOcean (2013-09-10) #ril
    • rsync -r dir1/ dir2 可以將 dir1 內容 (recursively) 同步到 dir2,跟 cp 一樣,第 1 個參數是 source,第 2 個參數是 destination。
    • 不過實務上更常用 -a (archive mode),除了有 -r 的效果,還會保留 symbolic link、device file、mtime、group、owner 權限等。
    • 注意 dir/ 後面的 slash,表示 "the content of dir1",若沒有加 / 的話,會變成 dir2/dir1/[files] 多一層目錄。
    • 可以先用 -n/--dry-run 跑一次,搭配 -v/--verbose 看細節 (事實上,不加 -v 預設看不到任何東西 XD);就能看出 rsync -a dir1/ dir2rsync -a dir1 dir2 的差異。
    • 要跟 remote 同步,只要將 source 或 destination 改成 username@remote_host:file 即可。
    • 如果要同步的檔案未經壓縮,加 -z/--compress 會在傳輸過程中進行壓縮。
    • -P (等同於 --progress --partial),其中 --progress 可以看到 progress bar,而 --partial 則可以支援續傳 (發現 dest 有傳到一半的檔案時,預設會被刪除)
    • 當 dest 比 src 多了一些檔案時,預設並不會從 dest 刪除 (避免 data loss),可以加 --delete 要求刪除 (最好用 --dry-run 先測試過)。
  • Use - rsync - Wikipedia rsync 要描述 source 跟 destination,同時間只能有一邊是 remote -- [USER@]HOST:FILE
  • rsync - ArchWiki #ril

過程中檔案有異動 ??

遠端要 sudo 才能讀取/寫入檔案

某個 user 在 remote 端可以 sudo,但 rsync 期間如何 sudo

  • 在 remote 端的 /etc/sudoers 增加一筆 username ALL=NOPASSWD: /usr/bin/rsync (執行 sudo rsync 時不會問密碼)
  • rsync username@hostname 再搭配 --rsync-path="sudo rsync" 即可。

例如:

$ rsync -avzP --rsync-path="sudo rsync" jeremykao@source-host:/var/log .

參考資料:

如何顯示整體進度?

rsync 3.1.0 後支援 --info=progress2 顯示整體傳輸進度,要避免與 -v/--verbose 一起使用 (螢幕會因輸出檔名而一直捲動)。另外 rsync 3.0 後 recursive 會採用 incremental scan (掃過部份目錄就開始傳輸),要停用 incremental scan 算出來的整體進度才有參考價值 (--no-i-r/--no-inc-recursive),例如:

$ rsync -azP --info=progress2 --no-inc-recursive jermeykao@source-host:/var/log .

參考資料:

  • linux - Showing total progress in rsync: is it possible? - Server Fault
    • Avio: rsync v3.1.0 支援 --info=progress2 的用法
    • Alex: 要搭配 --no-i-r/--no-inc-recursive 使用,在開始 copy 才會掃過整個目錄結構,知道還剩多少要傳。
    • sanmai, Geremia: --info=progress2 不能/不要搭配 -v 使用,否則畫面會充滿 file name。
  • -r, --recursive - rsync rsync 3.0.0 開始,recursive 會採用 incremental scan 以節省記憶體,也就是掃完前面幾個目錄後就開始傳輸。有些操作需要 rsync 知道 full file list,可以用 --no-i-r/--no-inc-recursive 停用。
  • -P - rsync 提到 --info=progress2 會顯示整體進度 (statistics based on the whole transfer),明確指出不想看一堆 filename 在捲動,就要避免 -v--info=name0 的使用。

如何避開尖峰時間?

網路上存在 --time-limit--stop-at 的說法,但這需要套用 patch,多數人建議搭配 timeout 使用,例如:

timeout rsync ...

若要搭配 cron job 在 non-busy hours 同步,過程中不需要輸入密碼才行。

參考資料:

同步大量檔案 ??

參考資料 {: #reference }

手冊: