一,、簡介
rsync 是一個常用的 Linux 應用程序,,用于文件同步。
它可以在本地計算機與遠程計算機之間,,或者兩個本地目錄之間同步文件(但不支持兩臺遠程計算機之間的同步),。它也可以當作文件復制工具,替代cp 和mv 命令,。
它名稱里面的r 指的是 remote,,rsync 其實就是"遠程同步"(remote sync)的意思。與其他文件傳輸工具(如 FTP 或 scp)不同,,rsync 的最大特點是會檢查發(fā)送方和接收方已有的文件,,僅傳輸有變動的部分(默認規(guī)則是文件大小或修改時間有變動)。
二,、安裝
如果本機或者遠程計算機沒有安裝 rsync,,可以用下面的命令安裝。
# Debian
$ sudo apt-get install rsync
# Red Hat
$ sudo yum install rsync
# Arch Linux
$ sudo pacman -S rsync
注意,,傳輸?shù)碾p方都必須安裝 rsync,。
三、基本用法
3.1 -r 參數(shù)
本機使用 rsync 命令時,,可以作為cp 和mv 命令的替代方法,,將源目錄同步到目標目錄。
$ rsync -r source destination
上面命令中,,-r 表示遞歸,,即包含子目錄。注意,,-r 是必須的,,否則 rsync 運行不會成功。source 目錄表示源目錄,,destination 表示目標目錄,。
如果有多個文件或目錄需要同步,可以寫成下面這樣,。
$ rsync -r source1 source2 destination
上面命令中,,source1 、source2 都會被同步到destination 目錄,。
3.2 -a 參數(shù)
-a 參數(shù)可以替代-r ,,除了可以遞歸同步以外,還可以同步元信息(比如修改時間,、權限等),。由于 rsync 默認使用文件大小和修改時間決定文件是否需要更新,所以-a 比-r 更有用,。下面的用法才是常見的寫法,。
$ rsync -a source destination
目標目錄destination 如果不存在,rsync 會自動創(chuàng)建,。執(zhí)行上面的命令后,,源目錄source 被完整地復制到了目標目錄destination 下面,即形成了destination/source 的目錄結構,。
如果只想同步源目錄source 里面的內容到目標目錄destination ,,則需要在源目錄后面加上斜杠。
$ rsync -a source/ destination
上面命令執(zhí)行后,,source 目錄里面的內容,,就都被復制到了destination 目錄里面,并不會在destination 下面創(chuàng)建一個source 子目錄,。
3.3 -n 參數(shù)
如果不確定 rsync 執(zhí)行后會產(chǎn)生什么結果,,可以先用-n 或--dry-run 參數(shù)模擬執(zhí)行的結果。
$ rsync -anv source/ destination
上面命令中,,-n 參數(shù)模擬命令執(zhí)行的結果,,并不真的執(zhí)行命令。-v 參數(shù)則是將結果輸出到終端,,這樣就可以看到哪些內容會被同步,。
3.4 --delete 參數(shù)
默認情況下,rsync 只確保源目錄的所有內容(明確排除的文件除外)都復制到目標目錄,。它不會使兩個目錄保持相同,,并且不會刪除文件。如果要使得目標目錄成為源目錄的鏡像副本,,則必須使用--delete 參數(shù),,這將刪除只存在于目標目錄、不存在于源目錄的文件,。
$ rsync -av --delete source/ destination
上面命令中,,--delete 參數(shù)會使得destination 成為source 的一個鏡像。
四,、排除文件
4.1 --exclude 參數(shù)
有時,,我們希望同步時排除某些文件或目錄,這時可以用--exclude 參數(shù)指定排除模式,。
$ rsync -av --exclude='*.txt' source/ destination
# 或者
$ rsync -av --exclude '*.txt' source/ destination
上面命令排除了所有 TXT 文件,。
注意,rsync 會同步以"點"開頭的隱藏文件,,如果要排除隱藏文件,,可以這樣寫--exclude=".*" 。
如果要排除某個目錄里面的所有文件,但不希望排除目錄本身,,可以寫成下面這樣,。
$ rsync -av --exclude 'dir1/*' source/ destination
多個排除模式,可以用多個--exclude 參數(shù),。
$ rsync -av --exclude 'file1.txt' --exclude 'dir1/*' source/ destination
多個排除模式也可以利用 Bash 的大擴號的擴展功能,,只用一個--exclude 參數(shù)。
$ rsync -av --exclude={'file1.txt','dir1/*'} source/ destination
如果排除模式很多,,可以將它們寫入一個文件,,每個模式一行,然后用--exclude-from 參數(shù)指定這個文件,。
$ rsync -av --exclude-from='exclude-file.txt' source/ destination
4.2 --include 參數(shù)
--include 參數(shù)用來指定必須同步的文件模式,,往往與--exclude 結合使用。
$ rsync -av --include="*.txt" --exclude='*' source/ destination
上面命令指定同步時,,排除所有文件,,但是會包括 TXT 文件。
五,、遠程同步
5.1 SSH 協(xié)議
rsync 除了支持本地兩個目錄之間的同步,,也支持遠程同步。它可以將本地內容,,同步到遠程服務器,。
$ rsync -av source/ username@remote_host:destination
也可以將遠程內容同步到本地。
$ rsync -av username@remote_host:source/ destination
rsync 默認使用 SSH 進行遠程登錄和數(shù)據(jù)傳輸,。
由于早期 rsync 不使用 SSH 協(xié)議,,需要用-e 參數(shù)指定協(xié)議,后來才改的,。所以,,下面-e ssh 可以省略。
$ rsync -av -e ssh source/ user@remote_host:/destination
但是,,如果 ssh 命令有附加的參數(shù),,則必須使用-e 參數(shù)指定所要執(zhí)行的 SSH 命令。
$ rsync -av -e 'ssh -p 2234' source/ user@remote_host:/destination
上面命令中,,-e 參數(shù)指定 SSH 使用2234端口,。
5.2 rsync 協(xié)議
除了使用 SSH,如果另一臺服務器安裝并運行了 rsync 守護程序,,則也可以用rsync:// 協(xié)議(默認端口873)進行傳輸,。具體寫法是服務器與目標目錄之間使用雙冒號分隔:: 。
$ rsync -av source/ 192.168.122.32::module/destination
注意,,上面地址中的module 并不是實際路徑名,,而是 rsync 守護程序指定的一個資源名,由管理員分配。
如果想知道 rsync 守護程序分配的所有 module 列表,,可以執(zhí)行下面命令,。
$ rsync rsync://192.168.122.32
rsync 協(xié)議除了使用雙冒號,也可以直接用rsync:// 協(xié)議指定地址,。
$ rsync -av source/ rsync://192.168.122.32/module/destination
六,、增量備份
rsync 的最大特點就是它可以完成增量備份,,也就是默認只復制有變動的文件,。
除了源目錄與目標目錄直接比較,rsync 還支持使用基準目錄,,即將源目錄與基準目錄之間變動的部分,,同步到目標目錄。
具體做法是,,第一次同步是全量備份,,所有文件在基準目錄里面同步一份。以后每一次同步都是增量備份,,只同步源目錄與基準目錄之間有變動的部分,,將這部分保存在一個新的目標目錄。這個新的目標目錄之中,,也是包含所有文件,,但實際上,只有那些變動過的文件是存在于該目錄,,其他沒有變動的文件都是指向基準目錄文件的硬鏈接,。
--link-dest 參數(shù)用來指定同步時的基準目錄。
$ rsync -a --delete --link-dest /compare/path /source/path /target/path
上面命令中,,--link-dest 參數(shù)指定基準目錄/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 指向這個目錄,。下一次備份時,,就將${BACKUP_DIR}/latest 作為基準目錄,生成新的備份目錄。最后,,再將軟鏈接${BACKUP_DIR}/latest 指向新的備份目錄,。
七、配置項
-a ,、--archive 參數(shù)表示存檔模式,,保存所有的元數(shù)據(jù),比如修改時間(modification time),、權限,、所有者等,并且軟鏈接也會同步過去,。
--append 參數(shù)指定文件接著上次中斷的地方,,繼續(xù)傳輸。
--append-verify 參數(shù)跟--append 參數(shù)類似,,但會對傳輸完成后的文件進行一次校驗,。如果校驗失敗,將重新發(fā)送整個文件,。
-b ,、--backup 參數(shù)指定在刪除或更新目標目錄已經(jīng)存在的文件時,將該文件更名后進行備份,,默認行為是刪除,。更名規(guī)則是添加由--suffix 參數(shù)指定的文件后綴名,默認是~ ,。
--backup-dir 參數(shù)指定文件備份時存放的目錄,,比如--backup-dir=/path/to/backups 。
--bwlimit 參數(shù)指定帶寬限制,,默認單位是 KB/s,,比如--bwlimit=100 。
-c ,、--checksum 參數(shù)改變rsync 的校驗方式,。默認情況下,rsync 只檢查文件的大小和最后修改日期是否發(fā)生變化,,如果發(fā)生變化,,就重新傳輸;使用這個參數(shù)以后,,則通過判斷文件內容的校驗和,,決定是否重新傳輸。
--delete 參數(shù)刪除只存在于目標目錄,、不存在于源目標的文件,,即保證目標目錄是源目標的鏡像,。
-e 參數(shù)指定使用 SSH 協(xié)議傳輸數(shù)據(jù)。
--exclude 參數(shù)指定排除不進行同步的文件,,比如--exclude="*.iso" ,。
--exclude-from 參數(shù)指定一個本地文件,里面是需要排除的文件模式,,每個模式一行,。
--existing 、--ignore-non-existing 參數(shù)表示不同步目標目錄中不存在的文件和目錄,。
-h 參數(shù)表示以人類可讀的格式輸出,。
-h 、--help 參數(shù)返回幫助信息,。
-i 參數(shù)表示輸出源目錄與目標目錄之間文件差異的詳細情況,。
--ignore-existing 參數(shù)表示只要該文件在目標目錄中已經(jīng)存在,,就跳過去,,不再同步這些文件。
--include 參數(shù)指定同步時要包括的文件,,一般與--exclude 結合使用,。
--link-dest 參數(shù)指定增量備份的基準目錄。
-m 參數(shù)指定不同步空目錄,。
--max-size 參數(shù)設置傳輸?shù)淖畲笪募拇笮∠拗?,比如不超過200KB(--max-size='200k' )。
--min-size 參數(shù)設置傳輸?shù)淖钚∥募拇笮∠拗?,比如不小?0KB(--min-size=10k ),。
-n 參數(shù)或--dry-run 參數(shù)模擬將要執(zhí)行的操作,而并不真的執(zhí)行,。配合-v 參數(shù)使用,,可以看到哪些內容會被同步過去。
-P 參數(shù)是--progress 和--partial 這兩個參數(shù)的結合,。
--partial 參數(shù)允許恢復中斷的傳輸,。不使用該參數(shù)時,rsync 會刪除傳輸?shù)揭话氡淮驍嗟奈募?;使用該參?shù)后,,傳輸?shù)揭话氲奈募矔降侥繕四夸洠麓瓮綍r再恢復中斷的傳輸,。一般需要與--append 或--append-verify 配合使用,。
--partial-dir 參數(shù)指定將傳輸?shù)揭话氲奈募4娴揭粋€臨時目錄,比如--partial-dir=.rsync-partial ,。一般需要與--append 或--append-verify 配合使用,。
--progress 參數(shù)表示顯示進展,。
-r 參數(shù)表示遞歸,即包含子目錄,。
--remove-source-files 參數(shù)表示傳輸成功后,,刪除發(fā)送方的文件。
--size-only 參數(shù)表示只同步大小有變化的文件,,不考慮文件修改時間的差異,。
--suffix 參數(shù)指定文件名備份時,對文件名添加的后綴,,默認是~ ,。
-u 、--update 參數(shù)表示同步時跳過目標目錄中修改時間更新的文件,,即不同步這些有更新的時間戳的文件,。
-v 參數(shù)表示輸出細節(jié)。-vv 表示輸出更詳細的信息,,-vvv 表示輸出最詳細的信息,。
--version 參數(shù)返回 rsync 的版本。
-z 參數(shù)指定同步時壓縮數(shù)據(jù),。
八,、參考鏈接
(完)
|