rsync 同步


應用場景

rsync是可以實現增量備份的工具。配合任務計划,rsync能實現定時或間隔同步,配合inotify或sersync,可以實現觸發式的實時同步。

同步過程

rsync同步過程中由兩部分模式組成:決定哪些文件需要同步的檢查模式以及文件同步時的同步模式。

檢查模式

指按照指定規則來檢查哪些文件需要被同步,例如哪些文件是明確被排除不傳輸的。默認情況下,rsync使用"quick check"算法快速檢查源文件和目標文件的大小、
mtime(修改時間)是否一致,如果不一致則需要傳輸。當然,也可以通過在rsync命令行中指定某些選項來改變quick check的檢查模式,比如"--size-only"選項表示"quick check"
將僅檢查文件大小不同的文件作為待傳輸文件。rsync支持非常多的選項,其中檢查模式的自定義性是非常有彈性的。

同步模式

指在文件確定要被同步后,在同步過程發生之前要做哪些額外工作。例如上文所說的是否要先刪除源主機上沒有但目標主機上有的文件,是否要先備份已存在的目標文件,
是否要追蹤鏈接文件等額外操作。rsync也提供非常多的選項使得同步模式變得更具彈性。
相對來說,為rsync手動指定同步模式的選項更常見一些,只有在有特殊需求時才指定檢查模式,因為大多數檢查模式選項都可能會影響rsync的性能。

三種工作模式

本地文件系統上實現同步
  rsync -auv /opt/rsync/ /opt/local/

本地主機使用遠程shell和遠程主機通信(scp方式)
  rsync -auv /opt/rsync/ root@192.168.1.101:/opt/test

本地主機通過網絡套接字連接遠程主機上的rsync daemon
  rsync -auv /opt/rsync test@192.168.1.101::test

說明:

1.前面的命令為源目錄,后者為目的地目錄。表示以源目錄為基准,把源目錄文件同步到目的目錄。

2.如果多余2個路徑,那么最后一個路徑為目標路徑,前面都是源目錄,表示把所有源目錄下文件都同步到目標路徑

3.源目錄如果不帶后綴“/”表示在目標目錄下創建該目錄並把源目錄下文件一並同步過去,帶“/”表示只是把源目錄下的文件全部同步過去。

4.關於第三種模式,server端可以單獨以一個進程方式啟動,也可以通過xinetd方式啟動,兩者都是監聽873端口,第三種模式可以指定要對外開放的目錄,並對目錄上傳/下載權限控制對client端通過ip 限制,可以設置密碼等等。相比於xinetd 獨立進程模式處理請求能力更大,而xinetd 更輕量。

常見用法

-n         僅測試傳輸,而不實際傳輸。常和"-vvvv"配合使用來查看rsync是如何工作的。

-auv (一般常用此3個參數同步)
        -v:顯示rsync過程中詳細信息。可以使用"-vvvv"獲取更詳細信息
        -a --archive :歸檔模式,表示遞歸傳輸並保持文件屬性。等同於"-rtopgDl"。
        -u --update :僅在源mtime比目標已存在文件的mtime新時才拷貝。注意,該選項是接收端判斷的,不會影響刪除行為

--exclude     排除某個目錄/文件 rsync -r -v --exclude="anaconda/*.log" /var/log/anaconda /var/log/audit /tmp

--delete     使用"--delete"選項后,接收端的rsync會先刪除目標目錄下已經存在,但源端目錄不存在的文件。也就是"多則刪之,少則補之"。

注:如果將"--delete"選項和"--exclude"選項一起使用,則被排除的文件不會被刪除

參數說明

-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:要求刪除源端已經成功傳輸的文件。
View Code

安裝配置(第三種模式)

服務端操作

關閉selinux 和 iptables
yum -y install rsync xinetd

vim /etc/xinetd.d/rsync
service rsync
{
disable = no #把yes 改為no
flags = IPv6
socket_type = stream
wait = no
user = root
server = /usr/bin/rsync
server_args = --daemon
log_on_failure += USERID
}

mkdir /etc/rsyncd/


vi /etc/rsyncd/rsyncd.conf #新建文件

#全局配置區域
uid = root              #uid必須是系統真實存在的用戶,表示使用哪個用戶啟動這個進程
gid = root
port = 873              #默認為873,可以更改
read only = no
list = no
use chroot = no
max connections = 4           #最大連接數
strict modes = yes            #檢查pass文件權限
pid file = /var/run/rsyncd.pid
lock file =/var/run/rsync.lock
log file = /var/log/rsyncd.log

#模塊配置區域
#module名字和路徑,一個配置文件可以定義多個模塊針對多個目錄進行同步權限開發限制。
[backup]
path = /usr/local/svndata/
commet = This is backup        #該模塊功能描述
ignore errors               #忽略一些無關的IO錯誤
read only = no               #yes 只能下載不能上傳,no 都可以(如果都不限制最好配置成no,而不是都不寫此配置)
read only = no               #yes 只能上傳不能下載,no 都可以
list = false                #不允許該模塊被客戶端列出
auth users = test           # 指定連接到該模塊的用戶列表,只有列表里的用戶才能連接到模塊,用戶名和對應密碼保存在secrts file中,
                   # 這里使用的不是系統用戶,而是虛擬用戶。不設置時,默認所有用戶都能連接,但使用的是匿名連接
secrets file = /etc/rsyncd/rsync.pass
hosts allow = 192.168.1.102        #允許訪問ip
hosts deny =0.0.0.0/0             #拒絕剩余所有


ln -s /etc/rsyncd/rsyncd.conf /etc/rsyncd.conf

echo "test:test123" > /etc/rsyncd/rsyncd.pass

chmod 600 /etc/rsyncd/rsyncd.pass #必須有此步驟

netstat -lnp | grep 873

客戶端

yum -y install rsync

mkdir /etc/rsyncd/

echo "test:test123" > /etc/rsyncd/rsyncd.pass

chmod 600 /etc/rsyncd/rsyncd.pass

mkdir -p /opt/rsync

#1.back 為服務端定義的模塊名稱,實際路徑為/usr/bin/rsync
#2.第一個路徑為源路徑第二個路徑為目的路徑
rsync -auv --password-file=/etc/rsyncd/rsyncd.pass 192.168.1.101::back /opt/rsync/

注意事項:

1.server端注釋auth users 和 screts file 兩項時那么客戶端無需認證即可同步

2.客戶端同步命令, test@192.168.1.1::back test是通過test用戶與server認證,若不寫默認為root用戶

3.需要認證:同步命令不加指定密碼文件參數那么是交互式,需要手輸

4.需要認證:客戶端同步命令可以加參數 --password-file=/etc/rsyncd/rsyncd.pass 變為免交互,注意密碼文件只記錄密碼而服務端的格式:root:password 格式,客戶端密碼文件格式:password ,且密碼文件權限為600

5.客戶端推到服務端時,文件的屬主和屬組是配置文件中指定的uid和gid,若為非root用戶要保證同步的目錄有相應權限。但是客戶端從服務端拉的時候,文件的屬主和屬組是客戶端       正在操作rsync的用戶身份,因為執行rsync程序的用戶為當前用戶。

6.關於secrets file的權限,實際上並非一定是600,只要滿足除了運行rsync daemon的用戶可讀即可。是否檢查權限的設定是通過選項strict mode設置的,如果設置為false,則無需關注文件的權限。但默認是yes,即需要設置權限

7.服務端啟動可以指定配置文件,也可以指定端口,都不指定默認配置文件為/etc/rsyncd.conf 端口為873。

8、報錯rsync: opendir "." (in xxx) failed: Permission denied (13)

     原因:服務端未關閉selinux。解決:關閉selinux 即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM