一、簡介
rsync 是一個常用的 Linux 應用程式,用於檔案同步。
它可以在本地計算機與遠端計算機之間,或者兩個本地目錄之間同步檔案(但不支援兩臺遠端計算機之間的同步)。它也可以當作檔案複製工具,替代cp
和mv
命令。
它名稱裡面的r
指的是 remote,rsync 其實就是"遠端同步"(remote sync)的意思。與其他檔案傳輸工具(如 FTP 或 scp)不同,rsync 的最大特點是會檢查傳送方和接收方已有的檔案,僅傳輸有變動的部分(預設規則是檔案大小或修改時間有變動)。
二、安裝
如果本機或者遠端計算機沒有安裝 rsync,可以用下面的命令安裝。
# Debian $ sudo apt-get install rsync # Red Hat $ sudo yum install rsync # Arch Linux $ sudo pacman -S rsync
注意,傳輸的雙方都必須安裝 rsync。
三、基本用法
3.1 -r
引數
本機使用 rsync 命令時,可以作為cp
和mv
命令的替代方法,將源目錄同步到目標目錄。
$ rsync -r source destination
上面命令中,-r
表示遞迴,即包含子目錄。注意,-r
是必須的,否則 rsync 執行不會成功。source
目錄表示源目錄,destination
表示目標目錄。
如果有多個檔案或目錄需要同步,可以寫成下面這樣。
$ rsync -r source1 source2 destination
上面命令中,source1
、source2
都會被同步到destination
目錄。
3.2 -a
引數
-a
引數可以替代-r
,除了可以遞迴同步以外,還可以同步元資訊(比如修改時間、許可權等)。由於 rsync 預設使用檔案大小和修改時間決定檔案是否需要更新,所以-a
比-r
更有用。下面的用法才是常見的寫法。
$ rsync -a source destination
目標目錄destination
如果不存在,rsyce 會自動建立。執行上面的命令後,源目錄source
被完整地複製到了目標目錄destination
下面,即形成了destination/source
的目錄結構。
如果只想同步源目錄source
裡面的內容到目標目錄destination
,則需要在源目錄後面加上斜槓。
$ rsync -a source/ destination
上面命令執行後,source
目錄裡面的內容,就都被複制到了destination
目錄裡面,並不會在destination
下面建立一個source
子目錄。
3.3 -n
引數
如果不確定 rsync 執行後會產生什麼結果,可以先用-n
或--dry-run
引數模擬執行的結果。
$ rsync -anv source/ destination
上面命令中,-n
引數模擬命令執行的結果,並不真的執行命令。-v
引數則是將結果輸出到終端,這樣就可以看到哪些內容會被同步。
3.4 --delete
引數
預設情況下,rsync 只確保源目錄的所有內容(明確排除的檔案除外)都複製到目標目錄。它不會使兩個目錄保持相同,並且不會刪除檔案。如果要使得目標目錄成為源目錄的映象副本,則必須使用--delete
引數,這將刪除只存在於目標目錄、不存在於源目錄的檔案。
$ rsync -av --delete source/ destination
上面命令中,--delete
引數會使得destination
成為source
的一個映象。
四、排除檔案
4.1 --exclude
引數
有時,我們希望同步時排除某些檔案或目錄,這時可以用--exclude
引數指定排除模式。
$ rsync -av --exclude='*.txt' source/ destination # 或者 $ rsync -av --exclude '*.txt' source/ destination
上面命令排除了所有 TXT 檔案。
注意,rsync 會同步以"點"開頭的隱藏檔案,如果要排除隱藏檔案,可以這樣寫--exclude=".*"
。
如果要排除某個目錄裡面的所有檔案,但不希望排除目錄本身,可以寫成下面這樣。
$ rsync -av --exclude 'dir1/*' source/ destination
多個排除模式,可以用多個--exclude
引數。
$ rsync -av --exclude 'file1.txt' --exclude 'dir1/*' source/ destination
多個排除模式也可以利用 Bash 的大擴號的擴充套件功能,只用一個--exclude
引數。
$ rsync -av --exclude={'file1.txt','dir1/*'} source/ destination
如果排除模式很多,可以將它們寫入一個檔案,每個模式一行,然後用--exclude-from
引數指定這個檔案。
$ rsync -av --exclude-from='exclude-file.txt' source/ destination
4.2 --include
引數
--include
引數用來指定必須同步的檔案模式,往往與--exclude
結合使用。
$ rsync -av --include="*.txt" --exclude='*' source/ destination
上面命令指定同步時,排除所有檔案,但是會包括 TXT 檔案。
五、遠端同步
5.1 SSH 協議
rsync 除了支援本地兩個目錄之間的同步,也支援遠端同步。它可以將本地內容,同步到遠端伺服器。
$ rsync -av source/ username@remote_host:destination
也可以將遠端內容同步到本地。
$ rsync -av username@remote_host:source/ destination
rsync 預設使用 SSH 進行遠端登入和資料傳輸。
由於早期 rsync 不使用 SSH 協議,需要用-e
引數指定協議,後來才改的。所以,下面-e ssh
可以省略。
$ rsync -av -e ssh source/ user@remote_host:/destination
但是,如果 ssh 命令有附加的引數,則必須使用-e
引數指定所要執行的 SSH 命令。
$ rsync -av -e 'ssh -p 2234' source/ user@remote_host:/destination
上面命令中,-e
引數指定 SSH 使用2234埠。
5.2 rsync 協議
除了使用 SSH,如果另一臺伺服器安裝並執行了 rsync 守護程式,則也可以用rsync://
協議(預設埠873)進行傳輸。具體寫法是伺服器與目標目錄之間使用雙冒號分隔::
。
$ rsync -av source/ 192.168.122.32::module/destination
注意,上面地址中的module
並不是實際路徑名,而是 rsync 守護程式指定的一個資源名,由管理員分配。
如果想知道 rsync 守護程式分配的所有 module 列表,可以執行下面命令。
$ rsync rsync://192.168.122.32
rsync 協議除了使用雙冒號,也可以直接用rsync://
協議指定地址。
$ rsync -av source/ rsync://192.168.122.32/module/destination
六、增量備份
rsync 的最大特點就是它可以完成增量備份,也就是預設只複製有變動的檔案。
除了源目錄與目標目錄直接比較,rsync 還支援使用基準目錄,即將源目錄與基準目錄之間變動的部分,同步到目標目錄。
具體做法是,第一次同步是全量備份,所有檔案在基準目錄裡面同步一份。以後每一次同步都是增量備份,只同步源目錄與基準目錄之間有變動的部分,將這部分儲存在一個新的目標目錄。這個新的目標目錄之中,也是包含所有檔案,但實際上,只有那些變動過的檔案是存在於該目錄,其他沒有變動的檔案都是指向基準目錄檔案的硬連結。
--link-dest
引數用來指定同步時的基準目錄。
$ rsync -a --delete --link-dest /compare/path /source/path /target/path
上面命令中,--link-dest
引數指定基準目錄/compare/path
,然後源目錄/source/path
跟基準目錄進行比較,找出變動的檔案,將它們拷貝到目標目錄/target/path
。那些沒變動的檔案則會生成硬連結。這個命令的第一次備份時是全量備份,後面就都是增量備份了。
下面是一個指令碼示例,備份使用者的主目錄。
#!/bin/bash # A script to perform incremental backups using rsync set -o errexit set -o nounset set -o pipefail readonly SOURCE_DIR="${HOME}" readonly BACKUP_DIR="/mnt/data/backups" readonly DATETIME="$(date '+%Y-%m-%d_%H:%M:%S')" readonly BACKUP_PATH="${BACKUP_DIR}/${DATETIME}" readonly LATEST_LINK="${BACKUP_DIR}/latest" mkdir -p "${BACKUP_DIR}" rsync -av --delete \ "${SOURCE_DIR}/" \ --link-dest "${LATEST_LINK}" \ --exclude=".cache" \ "${BACKUP_PATH}" rm -rf "${LATEST_LINK}" ln -s "${BACKUP_PATH}" "${LATEST_LINK}"
上面指令碼中,上一次備份的目錄${BACKUP_DIR}/${DATETIME}
是基準目錄,每一次同步都會生成一個新目錄,然後將${BACKUP_DIR}/latest
指向這個新目錄,作為下一次的基準目錄,再刪除上一次的基準目錄。由於--link-dest
對於那些沒有變動的檔案,生成的是硬連結,而不是軟連結,所以即使刪除基準目錄,那些檔案依然可以訪問。
七、配置項
-a
、--archive
參數列示存檔模式,儲存所有的後設資料,比如修改時間(modification time)、許可權、所有者等,並且軟連結也會同步過去。
--append
引數指定檔案接著上次中斷的地方,繼續傳輸。
--append-verify
引數跟--append
引數類似,但會對傳輸完成後的檔案進行一次校驗。如果校驗失敗,將重新傳送整個檔案。
-b
、--backup
引數指定在刪除或更新目標目錄已經存在的檔案時,將該檔案更名後進行備份,預設行為是刪除。更名規則是新增由--suffix
引數指定的檔案字尾名,預設是~
。
--backup-dir
引數指定檔案備份時存放的目錄,比如--backup-dir=/path/to/backups
。
--bwlimit
引數指定頻寬限制,預設單位是 KB/s,比如--bwlimit=100
。
-c
、--checksum
引數改變rsync
的校驗方式。預設情況下,rsync 只檢查檔案的大小和最後修改日期是否發生變化,如果發生變化,就重新傳輸;使用這個引數以後,則通過判斷檔案內容的校驗和,決定是否重新傳輸。
--delete
引數刪除只存在於目標目錄、不存在於源目標的檔案,即保證目標目錄是源目標的映象。
-e
引數指定使用 SSH 協議傳輸資料。
--exclude
引數指定排除不進行同步的檔案,比如--exclude="*.iso"
。
--exclude-from
引數指定一個本地檔案,裡面是需要排除的檔案模式,每個模式一行。
--existing
、--ignore-non-existing
參數列示不同步目標目錄中不存在的檔案和目錄。
-h
參數列示以人類可讀的格式輸出。
-h
、--help
引數返回幫助資訊。
-i
參數列示輸出源目錄與目標目錄之間檔案差異的詳細情況。
--ignore-existing
參數列示只要該檔案在目標目錄中已經存在,就跳過去,不再同步這些檔案。
--include
引數指定同步時要包括的檔案,一般與--exclude
結合使用。
--link-dest
引數指定增量備份的基準目錄。
-m
引數指定不同步空目錄。
--max-size
引數設定傳輸的最大檔案的大小限制,比如不超過200KB(--max-size='200k'
)。
--min-size
引數設定傳輸的最小檔案的大小限制,比如不小於10KB(--min-size=10k
)。
-n
引數或--dry-run
引數模擬將要執行的操作,而並不真的執行。配合-v
引數使用,可以看到哪些內容會被同步過去。
-P
引數是--progress
和--partial
這兩個引數的結合。
--partial
引數允許恢復中斷的傳輸。不使用該引數時,rsync
會刪除傳輸到一半被打斷的檔案;使用該引數後,傳輸到一半的檔案也會同步到目標目錄,下次同步時再恢復中斷的傳輸。一般需要與--append
或--append-verify
配合使用。
--partial-dir
引數指定將傳輸到一半的檔案儲存到一個臨時目錄,比如--partial-dir=.rsync-partial
。一般需要與--append
或--append-verify
配合使用。
--progress
參數列示顯示進展。
-r
參數列示遞迴,即包含子目錄。
--remove-source-files
參數列示傳輸成功後,刪除傳送方的檔案。
--size-only
參數列示只同步大小有變化的檔案,不考慮檔案修改時間的差異。
--suffix
引數指定檔名備份時,對檔名新增的字尾,預設是~
。
-u
、--update
參數列示同步時跳過目標目錄中修改時間更新的檔案,即不同步這些有更新的時間戳的檔案。
-v
參數列示輸出細節。-vv
表示輸出更詳細的資訊,-vvv
表示輸出最詳細的資訊。
--version
引數返回 rsync 的版本。
-z
引數指定同步時壓縮資料。
八、參考連結
- How To Use Rsync to Sync Local and Remote Directories on a VPS, Justin Ellingwood
- Mirror Your Web Site With rsync, Falko Timme
- Examples on how to use Rsync, Egidio Docile
- How to create incremental backups using rsync on Linux, Egidio Docile
(完)