強大的同步工具rsync詳細配置及各種玩法,rsync詳細配置玩法
名詞區分:
sync:同步
async:非同步
rsync:遠程同步
rsync 特點:
1,可以鏡像儲存整個分類樹和檔案系統
2,容易做到保留原有的許可權(permission,mode),owner,group,時間(修改時間,modify time),軟永久連結,檔案acl,檔案attributes等
3,傳輸效率高,使用同步演算法,只比較變化的
4,支援匿名傳輸,方便網站鏡像;也可以做驗證,加強安全
rsync 參數介紹 (常用 -av)
-v verbo
-a 歸檔模式,遞迴的方式傳輸檔案,並保持檔案的屬性
-l 保留軟連結
-R保留相對路徑
-H 保留永久連結
-p ,-o,-g,-A 分別保留許可權,屬主,屬組,acl等,但如果加了-a,這些就都包括了
-D 等於--devices --specials 表示支援b,c,s,p類型的檔案
用法舉例:
rsync -av /home/ /backup/ --本機上的同步,把/home目錄下的內容同步到/backup目錄下(包括隱藏檔案)
rsync -av /home/ 10.1.1.218:/backup/--把本地的/home目錄內容,同步到遠端218的/backup目錄下,需要遠端10.1.1.218的密碼
rsync -av 10.1.1.218:/backup/ /backup/--把遠端218的/backup目錄下的內容同步到本地的/backup目錄,需要遠端10.1.1.21的密碼
rsync -a /test/ '-e ssh -p 2222' 10.1.1.218:/test1/ --如果遠程機10.1.1.218的ssh連接埠不為預設的22,比如改成了2222,那麼需要這樣寫
注意的問題:
1.同步時保留原路徑,也就是把/home同步到/backup會變成/backup/home/*再內容
--原目錄後面加不加/也影響你的同步
下面這三個有區別:
rsync -av /home/ /backup/--/home下的內容直接同步處理到/backup下
rsync -av /home /backup/
rsync -aRv /home/ /backup/ --這兩上是/home被同步成/backup/home/*
# rsync -av /share/20171225 /backup/ --被同步成/backup/20171225/*
# rsync -aRv /share/20171225 /backup/ --被同步成/backup/share/20171225/*
rsync -aHAX --delete /test/ /test1/--比較完整的一個寫法 (加上--delete 參數,源檔案刪除了,同步目標檔案也會跟著刪除)
可以把rsync做成服務(daemon)的形式,並加上一些控制功能,日誌記錄功能,匿名或驗證登入功能等等。
首先
yum -y install rsync
要求一:僅做成服務除了首頁檔案不添加其餘參數
第一步
vim /etc/rsyncd.conf--修改設定檔man rsyncd.conf參考說明
motd file=/etc/rsyncd.welcome--歡迎檔案,路徑自訂
[notes] --共用給用戶端看到的名字,名字自訂
path=/share/20171225/--實際共用的伺服器路徑,名字必須是你要共用的實際路徑
vim /etc/rsyncd.welcome--手動建立自己定義的motd檔案,並寫上自訂的歡迎資訊,wq儲存即可。
第二步
systemctl restart rsyncd
systemctl enable rsyncd
lsof -i:873 --重啟服務,並檢查連接埠是否為監聽狀態
第三步: 用戶端查看
rsync -a 192.168.2.9:: --直接這樣可以查看192.168.2.9這個伺服器共用了哪些
"hello today! @_@"--這就是你rsyncd.welcome裡寫的歡迎內容
notes --這就是共用的名字
或者直接將分享的檔案同步過來(注意服務端IP後面接兩個冒號,再接的是你自訂的標籤名,無需再添加路徑)
rsync -a 192.168.2.9::notes /notes/
要求二:添加特殊控制參數
1.把日誌記錄到/var/log/rsyncd.log
2.共用模組要求隱藏(也就是說用戶端查看不到這個模組名)
3.並且同時只能1個用戶端串連進行同步這個module
4.只能允許192.168.2.x(ip你自訂)同步這個vim /etc/rsyncd.conf
vim /etc/rsyncd.conf --依舊是修改設定檔,加上控制參數
motd file=/etc/rsyncd.welcome
syslog facility=local0 --日誌載體改為local0
[notes]
path=/share/20171215/
log file=/var/log/rsyncd.log--此日誌時間用的是格林威治時間
#syslog facility=local0 --時間沒問題,但此參數要寫在global參數裡並結合rsyslog才能產生日誌(應該算是一個小bug,但以前rhel6也有此情況)
list=false --隱藏列表
max connections=1 --控制最大串連數
hosts allow=192.168.2.X --控制訪問IP
重啟服務
systemctl restart rsyncd
要求三:實現即時同步(源檔案發生變化就觸發同步)
inotify+rsync
筆記目錄下/program/inotify_soft/inotify-tools-3.13.tar.gz --需要安裝的軟體
# tar xf inotify-tools-3.13.tar.gz -C /usr/src/
# cd /usr/src/inotify-tools-3.13/
# ./configure
# make
# make install
--安裝完後,就會產生下面兩個命令
/usr/local/bin/inotifywait
/usr/local/bin/inotifywatch
1)實現單向本地目錄即時同步
測試本機/src目錄裡一有(增,刪,改,屬性改變),就會同步到/dst目錄
--使用下面的指令碼來做
#vim /tmp/1.sh#!/bin/bash/usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib,move /src |while read events --第一行表示發生增刪改就觸發dorsync -a --delete /src/ /dst/echo "`date +'%F %T'`出現事件$events" >> /var/log/rsync.log 2>&1 --指向日誌路徑done
# nohup sh /tmp/1.sh &--使用nohup掛起到後台執行,終端關閉,這個進程也不會被關閉
--如果你希望實現開機自動啟動,可以把此命令加到/etc/rc.local裡,或者寫成shell服務指令碼,讓其支援chkconfig開機自動啟動
再然後對/src進行各種操作,驗證可以即時同步到/dst
--課後可以上網查下sersync工具
2)實現雙向本地目錄的即時同步
也有相關的軟體(比如unison)可以專門來做雙向的即時同步
但我們就可以用inotify反向再做一次再寫一個指令碼也一樣可以簡單去實現
==============================================================================
需求四:遠程即時同步
方法一,使用ssh等效性(ssh密鑰登入)讓遠程機器串連不要求輸入密碼,就很容易使用遠程監控或同步了
實現把10.1.1.1上的/src目錄即時同步到10.1.1.2上的/dst目錄
10.1.1.1 /src目錄10.1.1.2 /dst目錄
在10.1.1.1上產生一對密鑰 --Linux上產生密匙的常用方法,互動式
# ssh-keygen --會讓你輸入密碼檔案儲存路徑
# ssh-copy-id -i 10.1.1.2
# ssh-add /root/.ssh/id_rsa
然後實現遠程即時同步,只需要在原來的指令碼基礎上把遠程目錄前加上遠程IP就可以了(因為做了ssh等效性,不要求輸入密碼)
#!/bin/bash/usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib,move /src |while read eventsdorsync -a --delete /src/ 10.1.1.2:/dst/echo "`date +'%F %T'`出現事件events" >> /var/log/rsync.log 2>&1done
方法二:不做上面方法一的ssh密鑰,使用expect指令碼來解決密碼問題
#!/bin/bash/usr/local/bin/inotifywait -mrq -e modify,delete,create,move /src |while read eventsdosed -i '/^10.1.1.2 /d' /root/.ssh/known_hostsexpect <<EOF &> /dev/nullspawn rsync -a --delete /src/ 10.1.1.2:/dst/expect "no)?"send "yes\r"expect "password:"sleep 2send "123456\r"expect eofEOFecho "`date +'%F %T'`出現事件events" &>> /var/log/rsync.logdone
測試:要先把上面執行的指令碼進程都kill掉,再重新執行這個指令碼來驗證
方法三,inotify+rsync+nfs
這個方法的思路是:把遠端目錄通過nfs服務掛載到本地,然後當做本地目錄一樣來使用,這樣就避免了rsync同步遠程時要輸密碼的問題
在rhel6.5測試為:使用innotify監控遠程nfs掛載的目錄再同步到本地目錄,無法成功;(在遠程機器操作,不會同步到本地。但在掛到本地的目錄操作,也會同步到本地。原因:就是inotify只能監控本機上的目錄,不能監控另外一台機器上的目錄)
但是反過來,使用innotify監控本地目錄,再同步到遠程nfs掛載的目錄,可以成功
實現把10.1.1.1上的/src目錄即時同步到10.1.1.2上的/dst目錄
10.1.1.1 /src目錄10.1.1.2 /dst目錄
步驟1:
在10.1.1.2上
# vim /etc/exports --nfs控制掛載參數的設定檔
/dst *(rw,no_root_squash)
# systemctl restart nfs
步驟2:
在10.1.1.1上
# mkdir /dst/
# mount -t nfs 10.1.1.2:/dst /dst--掛載過來,那麼/dst目錄就是10.1.1.2上的遠程/dst目錄了
步驟3:
執行上面講的兩個本地目錄同步一樣的指令碼,測試就可以了
#vim /tmp/1.sh#!/bin/bash/usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib,move /src |while read eventsdorsync -a --delete /src/ /dst/echo "`date +'%F %T'`出現事件$events" >> /var/log/rsync.log 2>&1done
#nohup sh /tmp/1.sh &
步驟4:
測試(過程省略)但注意在測試之前把前面例子啟動並執行指令碼進程通過ps找出來,並kill掉
--擴充,如果把nfs換成samba服務,通過mount -t cifs指令把遠程samba共用目錄掛載到本地,是否可行?
方法四,使用rsync的secrets file的方法然後寫指令碼
例:
本地同步端 ----->遠程被同步端
10.1.1.110.1.1.2
我要實現把本地同步端10.1.1.1上的/src/目錄裡的內容即時同步到遠程被同步端10.1.1.2的/dst/目錄
準備:
關閉iptables和selinux
主機名稱綁定
時間同步
實現過程
第一大步:在遠程被同步端10.1.1.2上操作
# mkdir /dst/--建立測試的被同步目錄
# yum install rsync
# vim /etc/rsyncd.conf
uid=root
gid=root--這裡指定使用root身份同步到10.1.1.2,否則預設使用nobody使用者(這樣你需要把/dst/目錄改成757的許可權,才有許可權寫)
[testsource]
path=/dst/
ignore errors
read only=no--服務等級給寫入權限
auth users=test--驗證的使用者取名為test(此使用者與系統使用者無關)
secrets file=/etc/rsyncd.secrets--驗證使用者test的使用者名稱和密碼的存放檔案,此檔案需要同步端和被同步端都要有(這樣我們就可以用
這種方式來進行驗證,而不需要遠端ssh密碼驗證了)
hosts allow=10.1.1.1--進一步加強安全,只允許10.1.1.1同步
# vim /etc/rsyncd.secrets --建立這個密碼檔案,使用者名稱要與上面的auth users指定的一致,密碼隨意(我這裡以321來測試)
test:321
# chmod 600 /etc/rsyncd.secrets--為了安全性,把許可權改成600,只讓root讀寫(很多其它軟體的密碼檔案也會要求你改成600許可權)
# systemctl restart rsyncd--重啟服務
# systemctl enable rsyncd
# netstat -ntlup |grep :873--驗證873連接埠是否啟動
tcp 0 0 :::873 :::* LISTEN 50438/xinetd
第二大步:在本地同步端10.1.1.1上操作
先安裝inotify軟體,步驟參照上面過程,這裡省略
# mkdir /src/--建立測試的同步目錄
# vim /etc/rsyncd.secrets--也要建立這個密碼檔案,裡面唯寫密碼就可以了。使用者我們在後面的指令碼裡的命令裡指定
321
# chmod 600 /etc/rsyncd.secrets --也改成600的許可權
# vim /tmp/rsync.sh--指令碼及其內容(這裡強調一下,這裡是測試方便,所以才放到/tmp下,生產環境可以放到/bin這種目錄下做成一個命令)
#!/bin/bash/usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib,move /src |while read eventsdorsync -a --delete --password-file=/etc/rsyncd.secrets /src/ test@10.1.1.2::testsourcedone
# chmod 755 /tmp/1.sh --給執行許可權,方便執行
# nohup sh /tmp/1.sh & --後面掛起執行
# vim /etc/rc.local--加到rc.local裡讓其開頭自動啟動
nohup sh /tmp/1.sh &
第三大步:
測試過程省略