rsync同步基本說明
rsync的目的是實現本地主機和遠程主機上的文件同步(包括本地推到遠程,遠程拉到本地兩種同步方式),也可以實現本地不同路徑下文件的同步,但不能實現遠程路徑1到遠程路徑2之間的同步(scp可以實現)。
不考慮rsync的實現細節,就文件同步而言,涉及了源文件和目標文件的概念,還涉及了以哪邊文件為同步基准。例如,想讓目標主機上的文件和本地文件保持同步,則是以本地文件為同步基准,將本地文件作為源文件推送到目標主機上。反之,如果想讓本地主機上的文件和目標主機上的文件保持同步,則目標主機上的文件為同步基准,實現方式是將目標主機上的文件作為源文件拉取到本地。當然,要保持本地的兩個文件相互同步,rsync也一樣能實現,這就像Linux中cp命令一樣,以本地某文件作為源,另一文件作為目標文件,但請注意,雖然rsync和cp能達到相同的目的,但它們的實現方式是不一樣的。
既然是文件同步,在同步過程中必然會涉及到源和目標兩文件之間版本控制的問題,例如是否要刪除源主機上沒有但目標上多出來的文件,目標文件比源文件更新(newer than source)時是否仍要保持同步,遇到軟鏈接時是拷貝軟鏈接本身還是拷貝軟鏈接所指向的文件,目標文件已存在時是否要先對其做個備份等等。
rsync同步過程中由兩部分模式組成:決定哪些文件需要同步的檢查模式以及文件同步時的同步模式。
(1).檢查模式是指按照指定規則來檢查哪些文件需要被同步,例如哪些文件是明確被排除不傳輸的。默認情況下,rsync使用"quick check"算法快速檢查源文件和目標文件的大小、mtime(修改時間)是否一致,如果不一致則需要傳輸。當然,也可以通過在rsync命令行中指定某些選項來改變quick check的檢查模式,比如"--size-only"選項表示"quick check"將僅檢查文件大小不同的文件作為待傳輸文件。rsync支持非常多的選項,其中檢查模式的自定義性是非常有彈性的。
(2).同步模式是指在文件確定要被同步后,在同步過程發生之前要做哪些額外工作。例如上文所說的是否要先刪除源主機上沒有但目標主機上有的文件,是否要先備份已存在的目標文件,是否要追蹤鏈接文件等額外操作。rsync也提供非常多的選項使得同步模式變得更具彈性。
相對來說,為rsync手動指定同步模式的選項更常見一些,只有在有特殊需求時才指定檢查模式,因為大多數檢查模式選項都可能會影響rsync的性能。
rsync三種工作方式
以下是rsync的語法:
Local: rsync [OPTION...] SRC... [DEST] Access via remote shell: Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST] Push: rsync [OPTION...] SRC... [USER@]HOST:DEST Access via rsync daemon: Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST] rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST] Push: rsync [OPTION...] SRC... [USER@]HOST::DEST rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
由此語法可知,rsync有三種工作方式:
(1).本地文件系統上實現同步。命令行語法格式為上述"Local"段的格式。
(2).本地主機使用遠程shell和遠程主機通信。命令行語法格式為上述"Access via remote shell"段的格式。
(3).本地主機通過網絡套接字連接遠程主機上的rsync daemon。命令行語法格式為上述"Access via rsync daemon"段的格式。
前兩者的本質是通過管道通信,即使是遠程shell。而方式(3)則是讓遠程主機上運行rsync服務,使其監聽在一個端口上,等待客戶端的連接。
但是,還有第四種工作方式:通過遠程shell也能臨時啟動一個rsync daemon,這不同於方式(3),它不要求遠程主機上事先啟動rsync服務,而是臨時派生出rsync daemon,它是單用途的一次性daemon,僅用於臨時讀取daemon的配置文件,當此次rsync同步完成,遠程shell啟動的rsync daemon進程也會自動消逝。此通信方式的命令行語法格式同"Access via rsync daemon",但要求options部分必須明確指定"--rsh"選項或其短選項"-e"。
Local: rsync [OPTION...] SRC... [DEST] Access via remote shell: Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST] Push: rsync [OPTION...] SRC... [USER@]HOST:DEST Access via rsync daemon: Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST] rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST] Push: rsync [OPTION...] SRC... [USER@]HOST::DEST rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
其中,第一個路徑參數一定是源文件路徑,即作為同步基准的一方,可以同時指定多個源文件路徑。最后一個路徑參數則是目標文件路徑,也就是待同步方。路徑的格式可以是本地路徑,也可以是使用user@host:path或user@host::path的遠程路徑,如果主機和path路徑之間使用單個冒號隔開,表示使用的是遠程shell通信方式,而使用雙冒號隔開的則表示的是連接rsync daemon。另外,連接rsync daemon時,還提供了URL格式的路徑表述方式rsync://user@host/path。
如果僅有一個SRC或DEST參數,則將以類似於"ls -l"的方式列出源文件列表(只有一個路徑參數,總會認為是源文件),而不是復制文件。
如果對rsync不熟悉,可暫先只了解本地以及遠程shell格式的user@host:path路徑格式。例如:
[root@node1 ~]# rsync /etc/fstab /tmp # 在本地同步 [root@node1 ~]# rsync -r /etc 192.168.170.133:/tmp # 將本地/etc目錄拷貝到遠程主機的/tmp下,以保證遠程/tmp目錄和本地/etc保持同步 [root@node1 ~]# rsync -r 192.168.170.133:/etc /tmp # 將遠程主機的/etc目錄拷貝到本地/tmp下,以保證本地/tmp目錄和遠程/etc保持同步 [root@node1 ~]# rsync /etc/ # 列出本地/etc/目錄下的文件列表 [root@node1 ~]# rsync 192.168.170.133:/tmp/ # 列出遠程主機上/tmp/目錄下的文件列表
另外,使用rsync一定要注意的一點是,源路徑如果是一個目錄的話,帶上尾隨斜線和不帶尾隨斜線是不一樣的,不帶尾隨斜線表示的是整個目錄包括目錄本身,帶上尾隨斜線表示的是目錄中的文件,不包括目錄本身。例如:
[root@node1 ~]# rsync -a /etc /tmp
[root@node1 ~]# rsync -a /etc/ /tmp
第一個命令會在/tmp目錄下創建etc目錄,而第二個命令不會在/tmp目錄下創建etc目錄,源路徑/etc/中的所有文件都直接放在/tmp目錄下。
rsync參數選項
-v:顯示rsync過程中詳細信息。可以使用"-vvvv"獲取更詳細信息。 -P:顯示文件傳輸的進度信息。(實際上"-P"="--partial --progress",其中的"--progress"才是顯示進度信息的)。 -n --dry-run :僅測試傳輸,而不實際傳輸。常和"-vvvv"配合使用來查看rsync是如何工作的。 -a --archive :歸檔模式,表示遞歸傳輸並保持文件屬性。等同於"-rtopgDl"。 -r --recursive:遞歸到目錄中去。 -t --times:保持mtime屬性。強烈建議任何時候都加上"-t",否則目標文件mtime會設置為系統時間,導致下次更新 :檢查出mtime不同從而導致增量傳輸無效。 -o --owner:保持owner屬性(屬主)。 -g --group:保持group屬性(屬組)。 -p --perms:保持perms屬性(權限,不包括特殊權限)。 -D :是"--device --specials"選項的組合,即也拷貝設備文件和特殊文件。 -l --links:如果文件是軟鏈接文件,則拷貝軟鏈接本身而非軟鏈接所指向的對象。 -z :傳輸時進行壓縮提高效率。 -R --relative:使用相對路徑。意味着將命令行中指定的全路徑而非路徑最尾部的文件名發送給服務端,包括它們的屬性。用法見下文示例。 --size-only :默認算法是檢查文件大小和mtime不同的文件,使用此選項將只檢查文件大小。 -u --update :僅在源mtime比目標已存在文件的mtime新時才拷貝。注意,該選項是接收端判斷的,不會影響刪除行為。 -d --dirs :以不遞歸的方式拷貝目錄本身。默認遞歸時,如果源為"dir1/file1",則不會拷貝dir1目錄,使用該選項將拷貝dir1但不拷貝file1。 --max-size :限制rsync傳輸的最大文件大小。可以使用單位后綴,還可以是一個小數值(例如:"--max-size=1.5m") --min-size :限制rsync傳輸的最小文件大小。這可以用於禁止傳輸小文件或那些垃圾文件。 --exclude :指定排除規則來排除不需要傳輸的文件。 --delete :以SRC為主,對DEST進行同步。多則刪之,少則補之。注意"--delete"是在接收端執行的,所以它是在 :exclude/include規則生效之后才執行的。 -b --backup :對目標上已存在的文件做一個備份,備份的文件名后默認使用"~"做后綴。 --backup-dir:指定備份文件的保存路徑。不指定時默認和待備份文件保存在同一目錄下。 -e :指定所要使用的遠程shell程序,默認為ssh。 --port :連接daemon時使用的端口號,默認為873端口。 --password-file:daemon模式時的密碼文件,可以從中讀取密碼實現非交互式。注意,這不是遠程shell認證的密碼,而是rsync模塊認證的密碼。 -W --whole-file:rsync將不再使用增量傳輸,而是全量傳輸。在網絡帶寬高於磁盤帶寬時,該選項比增量傳輸更高效。 --existing :要求只更新目標端已存在的文件,目標端還不存在的文件不傳輸。注意,使用相對路徑時如果上層目錄不存在也不會傳輸。 --ignore-existing:要求只更新目標端不存在的文件。和"--existing"結合使用有特殊功能,見下文示例。 --remove-source-files:要求刪除源端已經成功傳輸的文件。
rsync的選項非常多,能夠實現非常具有彈性的功能,以上選項僅僅只是很小一部分常用的選項,關於更完整更詳細的選項說明,見rsync官方網站
准備工作
//安裝rsync
[root@node1 ~]# yum install -y rsync
//關閉防火牆和selinux
[root@node1 ~]# systemctl stop firewalld
[root@node1 ~]# setenforce 0
[root@node2 ~]# systemctl stop firewalld
[root@node2 ~]# setenforce 0
本地同步,一般不會用,基本上都是同步到另外一台主機
[root@node1 ~]# tree mei mei └── biao └── jian [root@node1 ~]# rsync -avz mei /opt/haha sending incremental file list mei/ mei/biao/ mei/biao/jian sent 149 bytes received 47 bytes 392.00 bytes/sec total size is 0 speedup is 0.00 [root@node1 ~]# cd /opt/ [root@node1 opt]# ls 123 haha [root@node1 opt]# tree . ├── 123 └── haha └── mei └── biao └── jian 4 directories, 1 file
多個目標進行同步
[root@node1 ~]# ls anaconda-ks.cfg mei [root@node1 ~]# rsync -avz anaconda-ks.cfg mei /opt/AAA sending incremental file list created directory /opt/AAA anaconda-ks.cfg mei/ mei/biao/ mei/biao/jian sent 894 bytes received 97 bytes 1,982.00 bytes/sec total size is 1,184 speedup is 1.19 [root@node1 ~]# ls /opt/ 123 AAA haha [root@node1 ~]# cd /opt/ [root@node1 opt]# tree . ├── 123 ├── AAA │ ├── anaconda-ks.cfg │ └── mei │ └── biao │ └── jian └── haha └── mei └── biao └── jian 7 directories, 3 files
同步文件到遠程主機
被同步的主機和同步的主機都要安裝rsync
//我的node2主機上沒有安裝rsync,測試一下能否使用 [root@node2 opt]# which rsync /usr/bin/which: no rsync in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin) [root@node1 ~]# rsync -avz anaconda-ks.cfg root@192.168.170.133:/opt/ The authenticity of host '192.168.170.133 (192.168.170.133)' can't be established. ECDSA key fingerprint is SHA256:jVnkkd9Xi4gyvKGo6MZuf+RYVysQmAcKhtY+kyMT+IU. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '192.168.170.133' (ECDSA) to the list of known hosts. root@192.168.170.133's password: bash: rsync: command not found rsync: connection unexpectedly closed (0 bytes received so far) [sender] rsync error: remote command not found (code 127) at io.c(226) [sender=3.1.3] //node2安裝rsync,node1同步文件到node2 [root@node2 opt]# yum install -y rsync [root@node2 ~]# cd /opt/ [root@node2 opt]# ls [root@node1 ~]# rsync -avz anaconda-ks.cfg root@192.168.170.133:/opt/ root@192.168.170.133's password: sending incremental file list anaconda-ks.cfg sent 769 bytes received 35 bytes 178.67 bytes/sec total size is 1,184 speedup is 1.47 [root@node2 opt]# ls anaconda-ks.cfg
將遠程主機文件同步到本地
[root@node1 ~]# ls anaconda-ks.cfg mei [root@node1 ~]# rm -rf * [root@node1 ~]# ls [root@node1 ~]# [root@node2 opt]# ls 123 anaconda-ks.cfg [root@node1 ~]# rsync -avz root@192.168.170.133:/opt/* . root@192.168.170.133's password: receiving incremental file list anaconda-ks.cfg 123/ sent 51 bytes received 806 bytes 342.80 bytes/sec total size is 1,184 speedup is 1.38 [root@node1 ~]# tree . ├── 123 └── anaconda-ks.cfg 1 directory, 1 file //把當前目錄發到遠程主機上絕對路徑與相對路徑的區別 [root@node2 opt]# rm -rf * [root@node2 opt]# ls //相對路徑 [root@node1 ~]# rsync -avz . root@192.168.170.133:/opt/ root@192.168.170.133's password: sending incremental file list ./ .bash_history .bash_logout .bash_profile .bashrc .cshrc .tcshrc .viminfo anaconda-ks.cfg .ssh/ .ssh/id_rsa .ssh/id_rsa.pub .ssh/known_hosts 123/ sent 4,901 bytes received 240 bytes 3,427.33 bytes/sec total size is 5,969 speedup is 1.16 [root@node2 opt]# ls 123 anaconda-ks.cfg [root@node2 opt]# tree /opt/ /opt/ ├── 123 └── anaconda-ks.cfg 1 directory, 1 file //絕對路徑 [root@node2 opt]# rm -rf * [root@node2 opt]# ls [root@node2 opt]# [root@node1 ~]# rsync -avz /root root@192.168.170.133:/opt/ root@192.168.170.133's password: sending incremental file list root/ root/.bash_history root/.bash_logout root/.bash_profile root/.bashrc root/.cshrc root/.tcshrc root/.viminfo root/anaconda-ks.cfg root/.ssh/ root/.ssh/id_rsa root/.ssh/id_rsa.pub root/.ssh/known_hosts root/123/ sent 4,917 bytes received 245 bytes 3,441.33 bytes/sec total size is 5,969 speedup is 1.16 [root@node2 opt]# ls root [root@node2 opt]# tree /opt/ /opt/ └── root ├── 123 └── anaconda-ks.cfg 2 directories, 1 file