名詞區分:
sync:同步
async:異步
rsync:遠程同步linux
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/inotifywatchshell
1)實現單向本地目錄實時同步
測試本機/src目錄裏一有(增,刪,改,屬性改變),就會同步到/dst目錄
--使用下面的腳原本作
vim
#vim /tmp/1.sh #!/bin/bash /usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib,move /src |while read events --第一行表示發生增刪改就觸發 do rsync -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 events do rsync -a --delete /src/ 10.1.1.2:/dst/ echo "`date +'%F %T'`出現事件events" >> /var/log/rsync.log 2>&1 done
方法二:不作上面方法一的ssh密鑰,使用expect腳原本解決密碼問題
bash
#!/bin/bash /usr/local/bin/inotifywait -mrq -e modify,delete,create,move /src |while read events do sed -i '/^10.1.1.2 /d' /root/.ssh/known_hosts expect <<EOF &> /dev/null spawn rsync -a --delete /src/ 10.1.1.2:/dst/ expect "no)?" send "yes\r" expect "password:" sleep 2 send "123456\r" expect eof EOF echo "`date +'%F %T'`出現事件events" &>> /var/log/rsync.log done
測試:要先把上面執行的腳本進程都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 events do rsync -a --delete /src/ /dst/ echo "`date +'%F %T'`出現事件$events" >> /var/log/rsync.log 2>&1 done
#nohup sh /tmp/1.sh &
步驟4:
測試(過程省略)但注意在測試以前把前面例子運行的腳本進程經過ps找出來,並kill掉
--擴展,若是把nfs換成samba服務,經過mount -t cifs指令把遠程samba共享目錄掛載到本地,是否可行?
方法四,使用rsync的secrets file的方法而後寫腳本
例:
本地同步端 ----->遠程被同步端
10.1.1.1 10.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這種目錄下作成一個命令)
ssh
#!/bin/bash /usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib,move /src |while read events do rsync -a --delete --password-file=/etc/rsyncd.secrets /src/ test@10.1.1.2::testsource done
# chmod 755 /tmp/1.sh --給執行權限,方便執行
# nohup sh /tmp/1.sh & --後面掛起執行
# vim /etc/rc.local --加到rc.local裏讓其開頭自動啓動
nohup sh /tmp/1.sh &
第三大步:
測試過程省略異步