CentOS 7.3 Rsync服務的安裝與配置

、Rsync服務簡介

1. 什麼是Rsync

它是一個遠程數據同步工具,它在同步文件的同時,可通過LAN/WAN快速同步多臺主機間的文件。Rsync使用所謂的“rsync算法”來使本地和遠程兩個主機之間的文件達到同步,這個算法只傳送兩個文件的不同部分,而不是每次都整份傳送,因此速度相當快。可以保持原來文件的權限、時間、軟硬鏈接等附加信息。

 

2. Rsync的特性

(1)可以鏡像保存整個目錄樹和文件系統;

(2)容易做到保存原有的權限,owner、group、時間(修改時間 modify time)、軟硬鏈接等;

(3)傳輸效率高,使用同步算法,只比較變化的部分;

(4)支持匿名傳輸,方便網站鏡像管理。


二、Rsync配置使用

1. 安裝rsync軟件

#  yum  -y  install  rsync                               --安裝rsync

image.png


2. 配置文件

rsync的主要有以下三個配置文件,後面兩個文件默認不存在,請手動創建它。

(1)rsyncd.conf(主配置文件)

(2)rsyncd.secrets(密碼文件)

(3)rsyncd.motd(rsync服務器信息)


3. Rsync選項

-v      # verbose 詳細模式輸出
-q      # quiet 精簡輸出模式。
-c      # checksum 打開校驗開關,強制對文件傳輸進行校驗
-a      # archive 歸檔模式,以遞歸的方式傳輸文件,並保持所有文件屬性,(-a = -rlptgoD)
-r      # recursive 對子目錄以遞歸模式處理
-R      # relative 保留相對路徑信息
-b      # backup 創建備份,也就是對於目的已經存在有同樣的文件名時,將老的文件重新命名爲~filename。可以使用--suffix選項來指定不>同的備份文件前綴
--backup-dir    # 將備份文件(如~filename)存放在在目錄下
-suffix=SUFFIX  # 定義備份文件前綴
-u      # update 僅進行更新,也就是跳過所有已經存在於DST(目標主機),並且文件時間晚於要備份的文件,不覆蓋更新的文件
-l      # links 保留軟鏈接
-L      # copy-links 想對待常規文件一樣處理軟鏈接
--copy-unsafe-links     # 僅僅拷貝指向SRC(源主機)路徑目錄樹以外的鏈結
--safe-links    # 忽略指向SRC(源主機)路徑目錄樹以外的鏈結
-H      # hard-links 保留硬鏈結
-p      # perms 保留文件權限
-t      # times 保持文件時間信息
-g      # group 保持文件屬組信息
-o      # owner 保持文件屬主信息
-D      # devices 保持設備文件信息,表示支持b,c,s,p類型的文件
-A      # 保留acl(訪問控制權限)權限
-S      # sparse 對稀疏文件進行特殊處理以節省DST(目標主機)的空間
-n      # dry-run 現實哪些文件將被傳輸。
-w      # whole-file 拷貝文件,不進行增量檢測
-x      # one-file-system 不要跨越文件系統邊界
-B      # block-size=SIZE 檢驗算法使用的塊尺寸,默認是700字節
-e      # rsh=command 指定使用rsh、ssh方式進行數據同步
--rsync-path=PATH       # 指定遠程服務器上的rsync命令所在路徑信息
-C      # cvs-exclude 使用和CVS一樣的方法自動忽略文件,用來排除那些不希望傳輸的文件
--existing      # 僅僅更新那些已經存在於DST(目標主機)的文件,而不備份那些新創建的文件
--delete        # 刪除那些DST(目標主機)中SRC(源主機)沒有的文件
--delete-excluded       # 同樣刪除接收端那些被該選項指定排除的文件
--delete-after  # 傳輸結束以後再刪除
--ignore-errors # 及時出現IO錯誤也進行刪除
--max-delete=NUM        # 最多刪除NUM個文件
--partial       # 保留那些因故沒有完全傳輸的文件,以是加快隨後的再次傳輸
--force         # 強制刪除目錄,即使不爲空
--numeric-ids   # 不將數字的用戶和組id匹配爲用戶名和組名
--timeout=time ip       # 超時時間,單位爲秒
-I      # ignore-times 不跳過那些有同樣的時間和長度的文件
--size-only     # 當決定是否要備份文件時,僅僅察看文件大小而不考慮文件時間
--modify-window=NUM     # 決定文件是否時間相同時使用的時間戳窗口,默認爲0
-T      # temp-dir=DIR 在DIR中創建臨時文件
--compare-dest=DIR      # 同樣比較DIR中的文件來決定是否需要備份
-P      # 等同於 --partial
--progress      # 顯示備份過程
-z      # compress 對備份的文件在傳輸時進行壓縮處理
--exclude       # 指定不傳輸的文件
--exclude=PATTERN       # 指定排除不需要傳輸的文件模式
--include=PATTERN       # 指定不排除而需要傳輸的文件模式
--exclude-from=FILE     # 排除FILE中指定模式的文件
--include-from=FILE     # 不排除FILE指定模式匹配的文件
--version       # 打印版本信息
--address       # 綁定到特定的地址
--config=FILE   # 指定其他的配置文件,不使用默認的rsyncd.conf文件
--port=PORT     # 指定其他的rsync服務端口
--blocking-io   # 對遠程shell使用阻塞IO
-stats          # 給出某些文件的傳輸狀態
--progress      # 在傳輸時現實傳輸過程
--log-format=formAT     # 指定日誌文件格式
--password-file=FILE    # 從FILE中得到密碼
--bwlimit=KBPS  # 限制I/O帶寬,KBytes per second
-h      # help 顯示幫助信息


4. Rsync的普通用法

rsync  -av  /test/  /backup                               --本機上的同步,把/test目錄下的內容同步到/backup目錄下(包括隱藏文件)

 rsync  -av  /test/  192.168.1.20:/backup          --把本地的/test目錄內容,同步到遠端191.168.1.10的/backup目錄下

 rsync  -av  192.168.1.20:/backup/  /backup/   --把遠端192.168.1.20的/backup目錄下的內容同步到本地的/backup目錄

(注意:路徑寫法的區別!原目錄後面加不加/也影響你的同步目錄;沒加/,就是將目錄本身同步過去;目錄加/,就是將目錄裏的內容同步過去!)

#  rsync  -av  /home  --exclude=abc  /backup    --將/home目錄下除了abc其他內容都同步到/backup目錄下

#  rsync  -a  --delete  /backup/  /test/                 --如果同步後,源主機中有文件刪除了,這時要想目標主機與源主機的內容保持一致,可以使用--delete參數進行同步

Rsync本身不具備控制功能和日誌記錄功能,需要把Rsync做成服務的形式,並加上一些控制功能或日誌記錄功能。


三、CentOS下的Rsync服務

1. 系統環境

系統平臺: CentOS 7.3

Rsync Server: 192.168.1.88

Rsync Client:  192.168.1.20

關閉防火牆

 systemctl  stop  firewalld              --臨時關閉防火牆 

#  systemctl  disable  firewalld          --永久關閉防火牆

關閉selinux

臨時關閉:

#  setenforce 0

永久關閉:

#  vim  /etc/selinux/config

 SELINUX=disabled              --將enforcing改爲disabled


#  reboot                                 --重啓系統永久生效


2. 搭建Rsync服務

服務器的操作

(1)設置配置文件

mkdir  /data                                            --創建同步目錄

 vim  /etc/rsyncd.conf                              --文件最後添加一下內容

motd file=/etc/rsyncd.welcome   # 定義指定的文件路徑
[test]                          # 參數組名稱
path=/data                      # 定義參數組同步目錄路徑

image.png


vim  /etc/rsyncd.welcome                    --手動建立自己定義的motd文件,並寫上自定義的歡迎信息
*******************************************
****** ^_^ Welcome to use rsync!^_^ ******
*******************************************

image.png


(2)啓動服務

systemctl  restart  rsyncd.service             --重新啓動rsync服務

#  netstat  -ntlp  |  grep  rsync                     --查看監聽rsync服務的端口

 lsof  -i:873                                                --rsync的端口爲873

image.png


客戶端的操作

#  rsync  -v  192.168.1.88::                           --查看rsync服務器同步路徑名(注意服務器ip後面有兩個冒號)

無標題.png

mkdir  /databak                                      --創建存放同步內容的目錄

#  rsync  -a  192.168.1.88::test  /databak

--這樣同步,是不需要密碼的;注意test爲共享路徑名稱,語法上在該名稱前面有兩個“:”

image.png


沒有密碼有好處也有壞處,好處是不需要密碼方便寫腳本做遠程同步。如果要密碼寫腳本就要用到expect自動應答。壞處就是不安全,但你可以使用iptables等來加強安全。

如果你希望有密碼,也不用傳密碼的話,可以用rsyncd本身自帶的secrets file(密碼文件)來做:

(secrets file = /etc/rsyncd.secrets)


如果同步報permission denied這種錯誤,可能是服務端防火牆或selinux沒有關閉。


Rsync和Xinetd比較


rsyncdxinetd
把日誌記錄到/var/log/rsyncd.loglog filelog_type
共享模塊要求隱藏(也就是說客戶端查看不到這個模塊名(test))listlist
同時只能1個客戶端連接進行同步這個module(notes)max connectionsinstances
只能允許192.168.1.207(ip自定義)同步這個modulehosts allowonly_from
只能早上9點到下午5點同步access_timesaccess_times


#  vim  /etc/rsyncd.conf
motd file = /etc/rsyncd.welcome
[test]
path = /data                          
[notes]                               # 參數組名稱 
path = /var/www/html                  # 設置rsync同步文件路徑
list = false                          # 隱藏共享模塊名稱(test)
max connections = 1                   # 設置同一時間內最大的鏈接數
log file = /var/log/rsyncd.log        # 設置指定的日誌文件路徑
hosts allow = 192.168.1.207 192.168.1.20 (192.168.1.0/24)    # 設置限定的ip或網段
access_times = 9:00-17:00             # 允許連接時間段

image.png


#  systemctl  restart  rsyncd.service                 --重新啓動rsync服務


用xinetd託管rsync服務(CentOS 7.3 Xinetd服務的安裝與配置

vim  /etc/xinetd.d/rsync                              --這個文件需要自己創建,下面這個是基礎配置,需要加其他功能可以再添加參數
service rsync
{
        disable         = no                 # yes改爲no  打開託管rsync服務功能
        socket_type     = stream             # socket連接方式,這個是屬於本地方式,對ssh無效
        wait            = no                 # 是否併發
        user            = root               # 以什麼用戶進行啓動
        server          = /usr/bin/rsync     # 被託管服務(rsync)的啓動腳本
        server_args     = --daemon           # 設置服務啓動時需要的參數
        log_on_failure  += USERID            # 設置失敗時,UID添加到系統登記表
}

image.png


#  systemctl  restart  xinetd.service                   --重新啓動xinetd服務

到此,rsync服務就被xinetd託管了。


四、Rsync + Inotify實時同步搭建

Rsync實時同步,是以Inotify工具實現的,Inotify是監聽工具。

Inotify是一種基於內核的文件變化通知機制,用於監控文件系統時間,如文件存取、刪除、移動、修改等。

1. 下載inotify源碼包並編譯安裝

包名稱:inotify-tools-3.14.tar.gz

下載網址:https://github.com/rvoicilas/inotify-tools/wiki

或             https://sourceforge.net/projects/inotify-tools/files/latest/download

網絡下載:

wget  http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz

#  tar  xf  ./inotify-tools-3.14.tar.gz  -C  /usr/src/   --解壓

#  cd  /usr/src/inotify-tools-3.14/                           --cd到解壓的路徑裏

#  ./configure                --配置源碼包

#  make                         --編譯源碼包

#  make  install             --安裝源碼包

image.png


安裝成功後,會有以下兩條命令

#  /usr/local/bin/inotifywait                         --我們使用就是這條命令
 /usr/local/bin/inotifywatch

image.png


2. 查看命令參數

#  /usr/local/bin/inotifywait  -help               --查看命令的幫助文件,有些參數可用

常用的參數爲4個:

-m   --監聽
-r   --遞歸
-q   --打印
-e   --事務

 事務又分爲以下參數:

modify   --修改事務
attrib   --屬性改變事務
move    --移動事務
create   --創建事務
delete   --刪除事務


3. Rsync本地實時同步

準備工作:

1臺服務器,兩個目錄,用於同步,1個爲源(/test),1個爲目標(/testbak)

image.png

#  mkdir  /test                 --創建/test目錄爲源,用於監聽

#  mkdir  /testbak           --創建/testbak目錄爲目標,用於將/test目錄內容同步到/testbak

#  vim  /tmp/rsync.sh     --寫一個監聽腳本

#!/bin/bash
/usr/local/bin/inotifywait -mrq -e modify,attrib,move,create,delete /test | while read file
do
    rsync -a --delete /test/ /testbak/
    echo "$file在`date +'%F %T %A'`同步成功" >> /var/log/rsync.log
done

image.png

啓動腳本,實現rsync實時同步

#  nohup  sh  -x  /tmp/rsync.sh  &                 --使用nohup方式執行腳本,並放到後臺執行

#  jobs  –l                                                        --查看在後臺運行的任務

image.png

注意:

如果要中止後臺執行的任務,執行 kill  -9  %x,-9爲強制殺死,x爲jobs任務號

如果執行 jobs  -l 沒有內容顯示出來,則在 vim  nohup.out 查看是否報錯


測試

打開兩個終端,一個在監聽的目錄裏創建文件,另一個運行監聽日誌

#  mkdir  /test/abc                                       --在監聽的目錄裏創建abc目錄


#  tail  -f  /var/log/rsync.log                        --監聽日誌(只有當/test目錄的內容有改變時,日誌纔會有信息)


#  ll  /testbak                                               --查看abc目錄是否有同步到/testbak目錄下

image.png


4. Rsync遠程實時同步(三種方法)

準備兩臺虛擬機,一臺作爲本機(服務器),另一臺作爲遠程機(客戶端),兩臺虛擬機IP要能互相ping通

image.png

方法一:使用ssh創建密鑰的方法

創建ssh遠程登陸自動密碼,實現無需輸入密碼即可登陸

#  cd                        --切換到用戶家目錄

#  ssh-keygen         --執行該命令後,一直回車,會自動生成兩個密鑰文件

 

#  ll  /root/.ssh/      --兩個密鑰文件目錄

id_rsa                      --本地密鑰

id_rsa.pub               --公共密鑰

image.png


把公共密鑰id_rsa.pub複製給需要遠程登陸的機子(即目標機)並改名爲authorized_keys

#  scp  /root/.ssh/id_rsa.pub  192.168.1.20:/root/.ssh/authorized_keys

#  ssh  192.168.1.20                          --驗證是否還需要輸入密碼,不需要輸入密碼就可以登陸說明密鑰設置成功

#  exit                                                --退出遠程登陸

image.png


#  vim  /tmp/rsync_key.sh                --寫一個監聽腳本
#!/bin/sh
/usr/local/bin/inotifywait -mrq -e modify,attrib,move,create,delete /test | while read file
do
    rsync -a --delete /test/ 192.168.1.20:/testbak/
    echo "$file在`date +'%F %T %A'`同步成功" >> /var/log/rsync.log
done

啓動腳本,實現rsync實時同步

#  nohup  sh  -x  /tmp/rsync_key.sh  &          --使用nohup方式執行腳本,並放到後臺執行

#  jobs  –l                                                        --查看在後臺運行的任務

注意:

如果要中止後臺執行的任務,執行 kill  -9  %x,-9爲強制殺死,x爲jobs任務號

如果執行 jobs  -l 沒有內容顯示出來,則在 vim  nohup.out 查看是否報錯


測試

服務器上創建文件或者目錄,然後在客戶端進行查看 ls  /testbak 目錄是否有同步。並查看服務器 cat  /var/log/rsync.log 是否有同步成功信息。


方法二:使用expect自動應答的方法

用腳本的expect(TCL;tool command language 工具命令語言,是一種腳本語言)自動應答來處理遠程連接時要輸入的密碼問題

修改腳本,然後把先前的腳本進程都 kill 掉,重新執行,重新驗證(如果沒有做方法二步驟,可不用執行kill)

#  yum  -y  install  expect                 --安裝expect

#  mkdir  /test                                  --創建/test目錄


#  vim  /tmp/rsync.sh                       --寫一個監聽腳本
#!/bin/bash
/usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib,move /test | while read file
do
sed -i '/^192.168.1.20/d' /root/.ssh/known_hosts        # 清空192.168.1.20遠程連接記錄
expect << EOF &> /dev/null
spawn rsync -a --delete /test/ 192.168.1.20:/testbak/
expect "(yes/no)?"              # 提示輸入yes或no
send "yes\r"                    # 輸入yes,\r表示回車
expect "password:"              # 提示輸入密碼
send "123456\r"                 # 密碼爲123456(192.168.1.20的登錄密碼)
expect eof                      # 自動應答結束
EOF                             # 輸入內容結束(對照下圖可以更好的理解)
echo "$file 在`date +'%F %T'`被同步完成" >> /var/log/rsync.log
done

image.png

啓動腳本,實現rsync實時同步

#  nohup  sh  -x  /tmp/rsync.sh  &                 --使用nohup方式執行腳本,並放到後臺執行

#  jobs  –l                                                        --查看在後臺運行的任務

注意:

如果要中止後臺執行的任務,執行 kill  -9  %x,-9爲強制殺死,x爲jobs任務號

如果執行 jobs  -l 沒有內容顯示出來,則在 vim  nohup.out 查看是否報錯


測試

服務器上創建文件或者目錄,然後在客戶端進行查看 ls  /testbak 目錄是否有同步。並查看服務器 cat  /var/log/rsync.log 是否有同步成功信息。


方法三:使用secrets file的方法

準備兩臺虛擬機,1臺作爲rsync服務器,另一臺作爲客戶端。

需求:將服務器/localtest目錄內容同步到客戶端上/test目錄裏

服務器:192.168.1.88

客戶機:192.168.1.20

1)客戶端上操作

#  mkdir  /test                                --創建/test目錄用來同步服務器中/localtest目錄中的內容

客戶端上搭建rsync服務


#  vim  /etc/rsyncd.conf                --文件最後添加以下內容
uid=root
gid=root

[notes]
path=/test/
ignore errors
read only=no
auth users=test
secrets file=/etc/rsyncd.secrets
hosts allow=192.168.1.0/24

image.png


vim  /etc/rsyncd.secrets                     --創建客戶機訪問時驗證帳號密碼的文件,並寫上帳號和密碼

test:123456                                            --test爲帳號:後面爲密碼


#  chmod  600  /etc/rsyncd.secrets       --把密碼文件改爲600權限

 

#  systemctl  restart  rsyncd.service       --重啓服務

#  systemctl  enable  rsyncd.service      --設爲開機自啓動

image.png


2)服務器上操作

#  mkdir  /localtest                 --創建/localtest文件夾爲源,用於同步給客戶端的/test


#  vim  /tmp/rsync.sh             --寫一個監聽腳本
#!/bin/sh
/usr/local/bin/inotifywait -mrq -e modify,attrib,move,create,delete /localtest | while read aa
do
    rsync -a --delete --password-file=/etc/rsync.passwd /localtest/ [email protected]::notes/
    echo "$aa在`date +'%F %T %A'`同步成功" >> /var/log/rsync.log
done

image.png

chmod  757  /tmp/rsync.sh                 --安裝tcp_wrappers

#  vim  /etc/rsync.passwd                        --創建密碼文件

123456


#  chmod  600  /etc/rsync.passwd          --把密碼文件改成600權限          


啓動腳本,實現rsync實時同步

#  nohup  sh  -x  /tmp/rsync.sh  &          --使用nohup方式執行腳本,並放到後臺執行

#  jobs  -l                                                 --查看在後臺運行的任務

注意:

如果要中止後臺執行的任務,執行 kill  -9  %x,-9爲強制殺死,x爲jobs任務號

如果執行 jobs  -l 沒有內容顯示出來,則在 vim  nohup.out 查看是否報錯


測試

服務器上操作:

tail  -f  /var/log/rsync.log                 --在監聽的文件夾裏創建test.txt文件夾

#  touch  /localtest/test.txt                   --來到客戶機上查看/test文件是否有同步過去

客戶機上操作:

#  ll  /test


如果你想搭建雙向數據實時同步,反過來做一遍就OK了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章