4層負載均衡和7層負載均衡的區別。
A、rsync的安裝;
軟件包安裝
# yum install rsync 注:Fedora、Redhat 等在線安裝方法;
B、配置文件
rsync的主要有以下三個配置文件rsyncd.conf(主配置文件)、rsyncd.secrets(密碼文件)、rsyncd.motd(rysnc服務器信息)
服務器配置文件(/etc/rsyncd.conf),該文件默認不存在,請創建它。
具體步驟如下:
#touch /etc/rsyncd.conf #創建rsyncd.conf,這是rsync服務器的配置文件。
#touch /etc/rsyncd.secrets #創建rsyncd.secrets ,這是用戶密碼文件。
#chmod 600 /etc/rsyncd.secrets #將rsyncd.secrets這個密碼文件的文件屬性設為root擁有, 且權限要設為600, 否則無法備份成功!
#touch /etc/rsyncd.motd
下一就是我們修改rsyncd.conf和rsyncd.secrets和rsyncd.motd文件的時候了。
設定/etc/rsyncd.conf
rsyncd.conf是rsync服務器主要配置文件。我們先來個簡單的示例,后面在詳細說明各項作用。
比如我們要備份服務器上的/home和/opt,在/home中我想把easylife和samba目錄排除在外;
# Distributed under the terms of the GNU General Public License v2
# Minimal configuration file for rsync daemon
# See rsync(1) and rsyncd.conf(5) man pages for help
# This line is required by the /etc/init.d/rsyncd script
pid file = /var/run/rsyncd.pid
port = 873
address = 192.168.1.171 //本機地址
#uid = nobody
#gid = nobody
uid = root
gid = root
use chroot = yes
read only = yes
#limit access to private LANs
hosts allow=192.168.1.0/255.255.255.0 10.0.1.0/255.255.255.0 //允許的主機列表
hosts deny=* //拒絕的主機列表
max connections = 5
motd file = /etc/rsyncd.motd
#This will give you a separate log file
#log file = /var/log/rsync.log
#This will log every file transferred - up to 85,000+ per user, per sync
#transfer logging = yes
log format = %t %a %m %f %b
syslog facility = local3
timeout = 300
[rhel4home]
path = /home //本地存放目錄
list=yes
ignore errors
auth users = root //認證的用戶
secrets file = /etc/rsyncd.secrets
comment = This is RHEL 4 data
exclude = easylife/ samba/ //過濾的目錄
[rhel4opt]
path = /opt
list=no
ignore errors
comment = This is RHEL 4 opt
auth users = easylife
secrets file = /etc/rsyncd/rsyncd.secrets
注:關于auth users是必須在服務器上存在的真實的系統用戶,如果你想用多個用戶以,號隔開,比如auth users = easylife,root
設定密碼文件
密碼文件格式很簡單,rsyncd.secrets的內容格式為:
用戶名:密碼
我們在例子中rsyncd.secrets的內容如下類似的;在文檔中說,有些系統不支持長密碼,自己嘗試著設置一下吧。
easylife:keer
root:mike
chown root.root rsyncd.secrets #修改屬主
chmod 600 rsyncd.secrets #修改權限
注:1、將rsyncd.secrets這個密碼文件的文件屬性設為root擁有, 且權限要設為600, 否則無法備份成功! 出于安全目的,文件的屬性必需是只有屬主可讀。
2、這里的密碼值得注意,為了安全你不能把系統用戶的密碼寫在這里。比如你的系統用戶easylife密碼是000000,為了安全你可以讓rsync中的easylife為keer。這和samba的用戶認證的密碼原理是差不多的。
設定rsyncd.motd 文件;
它是定義rysnc服務器信息的,也就是用戶登錄信息。比如讓用戶知道這個服務器是誰提供的等;類似ftp服務器登錄時,我們所看到的 linuxsir.org ftp ……。 當然這在全局定義變量時,并不是必須的,你可以用#號注掉,或刪除;我在這里寫了一個 rsyncd.motd的內容為:
++++++++++++++++++++++++++++++++++++++++++++++
Welcome to use the mike.org.cn rsync services!
2002------2009
++++++++++++++++++++++++++++++++++++++++++++++
三、rsyncd.conf服務器的配置詳解
A、全局定義
在rsync 服務器中,全局定義有幾個比較關健的,根據我們前面所給的配置文件 rsyncd.conf 文件;
pid file = /var/run/rsyncd.pid 注:告訴進程寫到 /var/run/rsyncd.pid 文件中;
port = 873 注:指定運行端口,默認是873,您可以自己指定;
address = 192.168.1.171 注:指定服務器IP地址
uid = nobody
gid = nobdoy
注:服務器端傳輸文件時,要發哪個用戶和用戶組來執行,默認是nobody。 如果用nobody 用戶和用戶組,可能遇到權限問題,有些文件從服務器上拉不下來。所以我就偷懶,為了方便,用了root 。不過您可以在定義要同步的目錄時定義的模塊中指定用戶來解決權限的問題。
use chroot = yes
注:用chroot,在傳輸文件之前,服務器守護程序在將chroot 到文件系統中的目錄中,這樣做的好處是可能保護系統被安裝漏洞侵襲的可能。缺點是需要超級用戶權限。另外對符號鏈接文件,將會排除在外。也就是說,你在 rsync服務器上,如果有符號鏈接,你在備份服務器上運行客戶端的同步數據時,只會把符號鏈接名同步下來,并不會同步符號鏈接的內容;這個需要自己來嘗 試
read only = yes
配置后報這個錯
ERROR: module is read only
rsync error: syntax or usage error (code 1) at main.c(866) [receiver=3.0.6]
將read only = yes該為read only = no
注:read only 是只讀選擇,也就是說,不讓客戶端上傳文件到服務器上。還有一個 write only選項,自己嘗試是做什么用的吧;
#limit access to private LANs
hosts allow=192.168.1.0/255.255.255.0 10.0.1.0/255.255.255.0
注:在您可以指定單個IP,也可以指定整個網段,能提高安全性。格式是ip 與ip 之間、ip和網段之間、網段和網段之間要用空格隔開;
max connections = 5
注:客戶端最多連接數
motd file = /etc/rsyncd/rsyncd.motd
注:motd file 是定義服務器信息的,要自己寫 rsyncd.motd 文件內容。當用戶登錄時會看到這個信息。比如我寫的是:
++++++++++++++++++++++++++++++++++++++++++++++
Welcome to use the mike.org.cn rsync services!
2002------2009
++++++++++++++++++++++++++++++++++++++++++++++
log file = /var/log/rsync.log
注:rsync 服務器的日志;
transfer logging = yes
注:這是傳輸文件的日志
log format = %t %a %m %f %b
syslog facility = local3
timeout = 300
B、模塊定義
模塊定義什么呢?主要是定義服務器哪個目錄要被同步。每個模塊都要以[name]形式。這個名字就是在rsync 客戶端看到的名字,其實有點象Samba服務器提供的共享名。而服務器真正同步的數據是通過path 指定的。我們可以根據自己的需要,來指定多個模塊。每個模塊要指定認證用戶,密碼文件、但排除并不是必須的
下面是前面配置文件模塊的例子:
[rhel4home] #模塊它為我們提供了一個鏈接的名字,在本模塊中鏈接到了/home目錄;要用[name] 形式
path = /home #指定文件目錄所在位置,這是必須指定的
auth users = root #認證用戶是root ,是必須在服務器上存在的用戶
list=yes #list 意思是把rsync 服務器上提供同步數據的目錄在服務器上模塊是否顯示列出來。默認是yes 。如果你不想列出來,就no ;如果是no是比較安全的,至少別人不知道你的服務器上提供了哪些目錄。你自己知道就行了;
ignore errors #忽略IO錯誤
secrets file = /etc/rsyncd.secrets #密碼存在哪個文件
comment = linuxsir home data #注釋可以自己定義
exclude = beinan/ samba/
注:exclude是排除的意思,也就是說,要把/home目錄下的easylife和samba排除在外; easylife/和samba/目錄之間有空格分開
[rhel4opt]
path = /opt
list=no
comment = optdir
auth users = beinan
secrets file = /etc/rsyncd/rsyncd.secrets
ignore errors
四、啟動rsync服務器及防火墻的設置
啟動rsync服務器相當簡單,有以下幾種方法
A、--daemon參數方式,是讓rsync以服務器模式運行
#/usr/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf #--config用于指定rsyncd.conf的位置,如果在/etc下可以不寫
B、xinetd方式
修改services加入如下內容
# nano -w /etc/services
rsync 873/tcp # rsync
rsync 873/udp # rsync
這一步一般可以不做,通常都有這兩行(我的RHEL4和GENTOO默認都有)。修改的目的是讓系統知道873端口對應的服務名為rsync。如沒有的話就自行加入。
設定 /etc/xinetd.d/rsync, 簡單例子如下:
# default: off
# description: The rsync server is a good addition to am ftp server, as it
# allows crc checksumming etc.
service rsync
{
disable = no
socket_type = stream
wait = no
user = root
server = /usr/bin/rsync
server_args = --daemon
log_on_failure += USERID
}
上述, 主要是要打開rsync這個daemon, 一旦有rsync client要連接時, xinetd會把它轉介給 rsyncd(port 873)。然后service xinetd restart, 使上述設定生效.
rsync服務器和防火墻
Linux 防火墻是用iptables,所以我們至少在服務器端要讓你所定義的rsync 服務器端口通過,客戶端上也應該讓通過。
#iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 873 -j ACCEPT
#iptables -L 查看一下防火墻是不是打開了 873端口
如果你不太懂防火墻的配置,可以先service iptables stop 將防火墻關掉。當然在生產環境這是很危險的,做實驗才可以這么做喲!
五、通過rsync客戶端來同步數據
A、語法詳解
在配置完rsync服務器后,就可以從客戶端發出rsync命令來實現各種同步的操作。rsync有很多功能選項,下面就對介紹一下常用的選項:
######################################################################################################################################
rsync的命令格式可以為:
1. rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST
2. rsync [OPTION]... [USER@]HOST:SRC DEST
3. rsync [OPTION]... SRC [SRC]... DEST
4. rsync [OPTION]... [USER@]HOST::SRC [DEST]
5. rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST
6. rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
rsync有六種不同的工作模式:
1. 拷貝本地文件;當SRC和DES路徑信息都不包含有單個冒號":"分隔符時就啟動這種工作模式。
2.使用一個遠程shell程序(如rsh、ssh)來實現將本地機器的內容拷貝到遠程機器。當DST路徑地址包含單個冒號":"分隔符時啟動該模式。
3.使用一個遠程shell程序(如rsh、ssh)來實現將遠程機器的內容拷貝到本地機器。當SRC地址路徑包含單個冒號":"分隔符時啟動該模式。
4. 從遠程rsync服務器中拷貝文件到本地機。當SRC路徑信息包含"::"分隔符時啟動該模式。
5. 從本地機器拷貝文件到遠程rsync服務器中。當DST路徑信息包含"::"分隔符時啟動該模式。
6. 列遠程機的文件列表。這類似于rsync傳輸,不過只要在命令中省略掉本地機信息即可。
-a 以archive模式操作、復制目錄、符號連接 相當于-rlptgoD
rsync中的參數
-r 是遞歸
-l 是鏈接文件,意思是拷貝鏈接文件;-p 表示保持文件原有權限;-t 保持文件原有時間;-g 保持文件原有用戶組;-o 保持文件原有屬主;-D 相當于塊設備文件;
-z 傳輸時壓縮;
-P 傳輸進度;
-v 傳輸時的進度等信息,和-P有點關系,自己試試。可以看文檔;
-e ssh的參數建立起加密的連接。
-u只進行更新,防止本地新文件被重寫,注意兩者機器的時鐘的同時
--progress是指顯示出詳細的進度情況
--delete是指如果服務器端刪除了這一文件,那么客戶端也相應把文件刪除,保持真正的一致
--bwlimit=Bytes 限制傳輸的帶寬,單位kB/s(KByte/s) --bwlimit=1024 就是1M
--password-file=/password/path/file來指定密碼文件,這樣就可以在腳本中使用而無需交互式地輸入驗證密碼了,這里需要注意的是這份密碼文件權限屬性要設得只有屬主可讀。
########################################################################################################################################
幾種同步方法:
Rsync –anH 本地目錄 遠程IP:具體目錄(回車之后提示輸入root密碼,相當于拷貝)
例如:
Rsync –avH /usr/local/src 192.168.0.2:/bak/test/ -》把src整個目錄拷到test內
Rsync –avH /usr/local/src/ 192.168.0.2:/bak/test/ ->把src目錄內的所有文件拷貝到test內
Rsync –anH 遠程IP:具體目錄 本地目錄—>遠程同步到本地,需要root密碼
Rsync –anH rsync用戶@IP::模塊 本地目錄 -->從服務器模塊同步到本地目錄
啟動
/usr/bin/rsync --daemon --config=/etc/rsyncd.conf
拷貝遠程服務器文件到本地目錄
rsync -avzP root@192.168.9.44::home /home/sw_bak/ --password-file=/etc/rsyncd.pass
rsync 參數 用戶@IP::定義的[]名 本地路徑 指定密碼文件
服務端密碼文件格式為: username:password
客戶端密碼文件格式為:password
########################################################################################################################################
B、一些實例
B1、列出rsync 服務器上的所提供的同步內容;
首先:我們看看rsync服務器上提供了哪些可用的數據源
# rsync --list-only root@192.168.145.5::
++++++++++++++++++++++++++++++++++++++++++++++
Welcome to use the mike.org.cn rsync services!
2002------2009
++++++++++++++++++++++++++++++++++++++++++++++
rhel4home This is RHEL 4 data
注:前面是rsync所提供的數據源,也就是我們在rsyncd.conf中所寫的[rhel4home]模塊。而“This is RHEL 4 data”是由[rhel4home]模塊中的 comment = This is RHEL 4 data 提供的;為什么沒有把rhel4opt數據源列出來呢?因為我們在[rhel4opt]中已經把list=no了。
$ rsync --list-only root@192.168.145.5::rhel4home
++++++++++++++++++++++++++++++++++++++++++++++
Welcome to use the mike.org.cn rsync services!
2002------2009
++++++++++++++++++++++++++++++++++++++++++++++
Password:
drwxr-xr-x 4096 2009/03/15 21:33:13 .
-rw-r--r-- 1018 2009/03/02 02:33:41 ks.cfg
-rwxr-xr-x 21288 2009/03/15 21:33:13 wgetpaste
drwxrwxr-x 4096 2008/10/28 21:04:05 cvsroot
drwx------ 4096 2008/11/30 16:30:58 easylife
drwsr-sr-x 4096 2008/09/20 22:18:05 giddir
drwx------ 4096 2008/09/29 14:18:46 quser1
drwx------ 4096 2008/09/27 14:38:12 quser2
drwx------ 4096 2008/11/14 06:10:19 test
drwx------ 4096 2008/09/22 16:50:37 vbird1
drwx------ 4096 2008/09/19 15:28:45 vbird2
后面的root@ip中,root是指定密碼文件中的用戶名,之后的::rhel4home這是rhel4home模塊名
B2、rsync客戶端同步數據;
#rsync -avzP root@192.168.145.5::rhel4home rhel4home
Password: 這里要輸入root的密碼,是服務器端rsyncd.secrets提供的。在前面的例子中我們用的是mike,輸入的密碼并不回顯,輸好就回車。
注: 這個命令的意思就是說,用root用戶登錄到服務器上,把rhel4home數據,同步到本地當前目錄rhel4home上。當然本地的目錄是可以你自己定義的。如果當你在客戶端上當前操作的目錄下沒有rhel4home這個目錄時,系統會自動為你創建一個;當存在rhel4home這個目錄中,你要注意 它的寫權限。
#rsync -avzP --delete linuxsir@linuxsir.org::rhel4home rhel4home
這回我們引入一個--delete 選項,表示客戶端上的數據要與服務器端完全一致,如果 linuxsirhome目錄中有服務器上不存在的文件,則刪除。最終目的是讓linuxsirhome目錄上的數據完全與服務器上保持一致;用的時候要 小心點,最好不要把已經有重要數所據的目錄,當做本地更新目錄,否則會把你的數據全部刪除;
設定 rsync client
設定密碼文件
#rsync -avzP --delete --password-file=rsyncd.secrets root@192.168.145.5::rhel4home rhel4home
這次我們加了一個選項 --password-file=rsyncd.secrets,這是當我們以root用戶登錄rsync服務器同步數據時,密碼將讀取rsyncd.secrets這個文件。這個文件內容只是root用戶的密碼。我們要如下做;
# touch rsyncd.secrets
# chmod 600 rsyncd.secrets
# echo "mike"> rsyncd.secrets
# rsync -avzP --delete --password-file=rsyncd.secrets root@192.168.145.5::rhel4home rhel4home
注:這里需要注意的是這份密碼文件權限屬性要設得只有屬主可讀。
這樣就不需要密碼了;其實這是比較重要的,因為服務器通過crond 計劃任務還是有必要的;
B3、讓rsync客戶端自動與服務器同步數據
服務器是重量級應用,所以數據的網絡備份還是極為重要的。我們可以在生產型服務器上配置好rsync 服務器。我們可以把一臺裝有rysnc機器當做是備份服務器。讓這臺備份服務器,每天在早上4點開始同步服務器上的數據;并且每個備份都是完整備份。有時 硬盤壞掉,或者服務器數據被刪除,完整備份還是相當重要的。這種備份相當于每天為服務器的數據做一個鏡像,當生產型服務器發生事故時,我們可以輕松恢復數 據,能把數據損失降到最低;是不是這么回事??
step1:創建同步腳本和密碼文件
#mkdir /etc/cron.daily.rsync
#cd /etc/cron.daily.rsync
#touch rhel4home.sh rhel4opt.sh
#chmod 755 /etc/cron.daily.rsync/*.sh
#mkdir /etc/rsyncd/
#touch /etc/rsyncd/rsyncrhel4root.secrets
#touch /etc/rsyncd/rsyncrhel4easylife.secrets
#chmod 600 /etc/rsyncd/rsync.*
注: 我們在 /etc/cron.daily.rsync/中創建了兩個文件rhel4home.sh和rhel4opt.sh ,并且是權限是755的。創建了兩個密碼文件root用戶用的是rsyncrhel4root.secrets ,easylife用戶用的是 rsyncrhel4easylife.secrets,權限是600;
我們編輯rhel4home.sh,內容是如下的:
#!/bin/sh
#backup 192.168.145.5:/home
/usr/bin/rsync -avzP --password-file=/etc/rsyncd/rsyncrhel4root.secrets root@192.168.145.5::rhel4home /home/rhel4homebak/$(date +'%m-%d-%y')
我們編輯 rhel4opt.sh ,內容是:
#!/bin/sh
#backup 192.168.145.5:/opt
/usr/bin/rsync -avzP --password-file=/etc/rsyncd/rsyncrhel4easylife.secrets easylife@192.168.145.5::rhel4opt /home/rhel4hoptbak/$(date +'%m-%d-%y')
注:你可以把rhel4home.sh和rhel4opt.sh的內容合并到一個文件中,比如都寫到rhel4bak.sh中;
接著我們修改 /etc/rsyncd/rsyncrhel4root.secrets和rsyncrhel4easylife.secrets的內容;
# echo "mike" > /etc/rsyncd/rsyncrhel4root.secrets
# echo "keer"> /etc/rsyncd/rsyncrhel4easylife.secrets
然后我們再/home目錄下創建rhel4homebak 和rhel4optbak兩個目錄,意思是服務器端的rhel4home數據同步到備份服務器上的/home/rhel4homebak 下,rhel4opt數據同步到 /home/rhel4optbak/目錄下。并按年月日歸檔創建目錄;每天備份都存檔;
#mkdir /home/rhel4homebak
#mkdir /home/rhel4optbak
step2:修改crond服務器的配置文件 加入到計劃任務
#crontab -e
加入下面的內容:
# Run daily cron jobs at 4:10 every day backup rhel4 data:
10 4 * * * /usr/bin/run-parts /etc/cron.daily.rsync 1> /dev/null
注:第一行是注釋,是說明內容,這樣能自己記住。
第二行表示在每天早上4點10分的時候,運行 /etc/cron.daily.rsync 下的可執行腳本任務;
配置好后,要重啟crond 服務器;
# killall crond 注:殺死crond 服務器的進程;
# ps aux |grep crond 注:查看一下是否被殺死;
# /usr/sbin/crond 注:啟動 crond 服務器;
# ps aux |grep crond 注:查看一下是否啟動了?
root 3815 0.0 0.0 1860 664 ? S 14:44 0:00 /usr/sbin/crond
root 3819 0.0 0.0 2188 808 pts/1 S+ 14:45 0:00 grep crond
六、FAQ
Q:如何通過ssh進行rsync,而且無須輸入密碼?
A:可以通過以下幾個步驟
1. 通過ssh-keygen在server A上建立SSH keys,不要指定密碼,你會在~/.ssh下看到identity和identity.pub文件
2. 在server B上的home目錄建立子目錄.ssh
3. 將A的identity.pub拷貝到server B上
4. 將identity.pub加到~[user b]/.ssh/authorized_keys
5. 于是server A上的A用戶,可通過下面命令以用戶B ssh到server B上了。e.g. ssh -l userB serverB。這樣就使server A上的用戶A就可以ssh以用戶B的身份無需密碼登陸到server B上了。
Q:如何通過在不危害安全的情況下通過防火墻使用rsync?
A:解答如下:
這通常有兩種情況,一種是服務器在防火墻內,一種是服務器在防火墻外。無論哪種情況,通常還是使用ssh,這時最好新建一個備份用戶,并且配置sshd 僅允許這個用戶通過RSA認證方式進入。如果服務器在防火墻內,則最好限定客戶端的IP地址,拒絕其它所有連接。如果客戶機在防火墻內,則可以簡單允許防 火墻打開TCP端口22的ssh外發連接就ok了。
Q:我能將更改過或者刪除的文件也備份上來嗎?
A:當然可 以。你可以使用如:rsync -other -options -backupdir = ./backup-2000-2-13 ...這樣的命令來實現。這樣如果源文件:/path/to/some/file.c改變了,那么舊的文件就會被移到./backup- 2000-2-13/path/to/some/file.c,這里這個目錄需要自己手工建立起來
Q:我需要在防火墻上開放哪些端口以適應rsync?
A:視情況而定。rsync可以直接通過873端口的tcp連接傳文件,也可以通過22端口的ssh來進行文件傳遞,但你也可以通過下列命令改變它的端口:
rsync --port 8730 otherhost::
或者
rsync -e 'ssh -p 2002' otherhost:
Q:我如何通過rsync只復制目錄結構,忽略掉文件呢?
A:rsync -av --include '/' --exclude '' source-dir dest-dir
Q:為什么我總會出現"Read-only file system"的錯誤呢?
A:看看是否忘了設"read only = no"了
Q:為什么我會出現'@ERROR: invalid gid'的錯誤呢?
A:rsync使用時默認是用uid=nobody;gid=nobody來運行的,如果你的系統不存在nobody組的話,就會出現這樣的錯誤,可以試試gid = ogroup或者其它
Q:綁定端口873失敗是怎么回事?
A:如果你不是以root權限運行這一守護進程的話,因為1024端口以下是特權端口,會出現這樣的錯誤。你可以用--port參數來改變。
Q:為什么我認證失敗?
A:從你的命令行看來:你用的是
> bash$ rsync -a 144.16.251.213::test test
> Password:
> @ERROR: auth failed on module test
>
> I dont understand this. Can somebody explain as to how to acomplish this.
> All suggestions are welcome.
應該是沒有以你的用戶名登陸導致的問題,試試rsync -a max@144.16.251.213::test test
Q: 出現以下這個訊息, 是怎么一回事?
@ERROR: auth failed on module xxxxx
rsync: connection unexpectedly closed (90 bytes read so far)
rsync error: error in rsync protocol data stream (code 12) at io.c(150)
A: 這是因為密碼設錯了, 無法登入成功, 請再檢查一下 rsyncd.secrets 中的密碼設定, 二端是否一致?
Q: 出現以下這個訊息, 是怎么一回事?
password file must not be other-accessible
continuing without password file
Password:
A: 這表示 rsyncd.secrets 的檔案權限屬性不對, 應設為 600。請下 chmod 600 rsyncd.secrets
Q: 出現以下這個訊息, 是怎么一回事?
@ERROR: chroot failed
rsync: connection unexpectedly closed (75 bytes read so far)
rsync error: error in rsync protocol data stream (code 12) at io.c(150)
A: 這通常是您的 rsyncd.conf 中的 path 路徑所設的那個目錄并不存在所致.請先用 mkdir開設好備份目錄.
客戶端錯誤信息:
@ERROR: auth failed on module home118 //1服務端密碼文件格式 2文件權限是否為600
=======================================================================================================================================================================
配置inotify
一、檢查系統是否支持inotify
1.Linux內核從2.6.13開始,引入了inotify機制
[root@iZ25w1kdi5zZ ~]# uname -a
Linux iZ25w1kdi5zZ 2.6.32-431.23.3.el6.x86_64 #1 SMP Thu Jul 31 17:20:51 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
2.[root@iZ25w1kdi5zZ ~]# ls -lsart /proc/sys/fs/inotify
total 0
0 dr-xr-xr-x 0 root root 0 Sep 19 09:38 ..
0 -rw-r--r-- 1 root root 0 Jan 1 13:51 max_user_watches
0 -rw-r--r-- 1 root root 0 Jan 1 13:51 max_user_instances
0 -rw-r--r-- 1 root root 0 Jan 1 13:51 max_queued_events
0 dr-xr-xr-x 0 root root 0 Jan 1 13:51 .
如果出現上面三個文件說明系統支持inotify。
二、解壓安裝
//安裝依賴包(./configure編譯inotify環境時可能會報錯,需要安裝依賴環境)
yum -y install gcc gcc-c++
[root@iZ25w1kdi5zZ src]# wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
[root@iZ25w1kdi5zZ src]# tar -zvxf inotify-tools-3.14.tar.gz
[root@iZ25w1kdi5zZ src]# cd inotify-tools-3.14
[root@iZ25w1kdi5zZ inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify
[root@iZ25w1kdi5zZ inotify-tools-3.14]# make
[root@iZ25w1kdi5zZ inotify-tools-3.14]# make install
三、查看inotify默認參數
[root@iZ25w1kdi5zZ bin]# sysctl -a | grep max_queued_events
fs.inotify.max_queued_events = 16384
[root@iZ25w1kdi5zZ bin]# sysctl -a | grep max_user_watches
fs.inotify.max_user_watches = 8192
fs.epoll.max_user_watches = 1673768
[root@iZ25w1kdi5zZ bin]# sysctl -a | grep max_user_instances
fs.inotify.max_user_instances = 128
四、修改inotify參數
1、命令修改
[root@iZ25w1kdi5zZ bin]# sysctl -w fs.inotify.max_user_instances=130
fs.inotify.max_user_instances = 130
2、文件修改
[root@iZ25w1kdi5zZ]# vi /etc/sysctl.conf
添加如下代碼
fs.inotify.max_user_instances=130
3、參數說明
max_user_instances:每個用戶創建inotify實例最大值
max_queued_events:inotify隊列最大長度,如果值太小,會出現錯誤,導致監控文件不準確
max_user_watches:要知道同步的文件包含的目錄數,可以用:[root@iZ25w1kdi5zZhome]# find /home/rain -type d|wc -l 統計,必須保證參數值大于統計結果(/home/rain為同步文件目錄)。
五、創建實時監控腳本
[root@iZ25w1kdi5zZ ~]# mkdir -p /etc/inotify
[root@iZ25w1kdi5zZ ~]# cd /etc/inotify
[root@iZ25w1kdi5zZ scripts]# vi inotify_start.sh
/usr/local/inotify/bin/inotifywait -mrq -e modify,create,move,delete \
--fromfile '/etc/inotify/ffile' \
--timefmt '%y-%m-%d %H:%M' --format '%T %f %e' \
--outfile '/etc/inotify/rsync.log'
=======================================================================================================================================================================
inotify-tools提供兩種工具,一是inotifywait,它是用來監控文件或目錄的變化,二是inotifywatch,它是用來統計文件系統訪問的次數。現在介紹一下它的使用方法。
inotifywait常用參數:
--fromfile 文件里定義監控目錄
--timefmt 時間格式 %y年 %m月 %d日 %H小時 %M分鐘
--format 輸出格式 %T時間 %w路徑 %f文件名 %e狀態
--outfile 記錄監控目錄下的文件改變狀態
-m 始終保持監聽狀態,默認觸發事件即退出。
-r 遞歸查詢目錄
-q 打印出監控事件
-e 定義監控的事件,可用參數:
open 打開文件
access 訪問文件
modify 修改文件
delete 刪除文件
create 新建文件
attrb 屬性變更
[root@iZ25w1kdi5zZ scripts]# vi ffile --這個目錄要手動創建(或使用本地已有的目錄)
/home/rain_inotify/
@/home/rain_inotify/cache #@注釋行
給腳本賦加執行權限
[root@iZ25w1kdi5zZ scripts]#chmod a+x ./inotify_start.sh
啟動:
[root@iZ25w1kdi5zZ scripts]# ./inotify_start.sh
=====================================================================
語法詳解 參數說明
inotifywait
語法:
inotifywait [-hcmrq] [-e ] [-t ] [--format ] [--timefmt ] [ ... ]
參數:
-h,--help
輸出幫助信息
@
排除不需要監視的文件,可以是相對路徑,也可以是絕對路徑。
--fromfile
從文件讀取需要監視的文件或排除的文件,一個文件一行,排除的文件以@開頭。
-m, --monitor
接收到一個事情而不退出,無限期地執行。默認的行為是接收到一個事情后立即退出。
-d, --daemon
跟--monitor一樣,除了是在后臺運行,需要指定--outfile把事情輸出到一個文件。也意味著使用了--syslog。
-o, --outfile
輸出事情到一個文件而不是標準輸出。
-s, --syslog
輸出錯誤信息到系統日志
-r, --recursive
監視一個目錄下的所有子目錄。
-q, --quiet
指定一次,不會輸出詳細信息,指定二次,除了致命錯誤,不會輸出任何信息。
--exclude
正則匹配需要排除的文件,大小寫敏感。
--excludei
正則匹配需要排除的文件,忽略大小寫。
-t , --timeout
設置超時時間,如果為0,則無限期地執行下去。
-e , --event
指定監視的事件。
-c, --csv
輸出csv格式。
--timefmt
指定時間格式,用于--format選項中的%T格式。
--format
指定輸出格式。
%w 表示發生事件的目錄
%f 表示發生事件的文件
%e 表示發生的事件
%Xe 事件以“X"分隔
%T 使用由--timefmt定義的時間格式
inotifywatch
語法:
inotifywatch [-hvzrqf] [-e ] [-t ] [-a ] [-d ] [ ... ]
參數:
-h, --help
輸出幫助信息
-v, --verbose
輸出詳細信息
@
排除不需要監視的文件,可以是相對路徑,也可以是絕對路徑。
--fromfile
從文件讀取需要監視的文件或排除的文件,一個文件一行,排除的文件以@開頭。
-z, --zero
輸出表格的行和列,即使元素為空
--exclude
正則匹配需要排除的文件,大小寫敏感。
--excludei
正則匹配需要排除的文件,忽略大小寫。
-r, --recursive
監視一個目錄下的所有子目錄。
-t , --timeout
設置超時時間
-e , --event
只監聽指定的事件。
-a , --ascending
以指定事件升序排列。
-d , --descending
以指定事件降序排列。
可監聽事件
access 文件讀取
modify 文件更改。
attrib 文件屬性更改,如權限,時間戳等。
close_write 以可寫模式打開的文件被關閉,不代表此文件一定已經寫入數據。
close_nowrite 以只讀模式打開的文件被關閉。
close 文件被關閉,不管它是如何打開的。
open 文件打開。
moved_to 一個文件或目錄移動到監聽的目錄,即使是在同一目錄內移動,此事件也觸發。
moved_from 一個文件或目錄移出監聽的目錄,即使是在同一目錄內移動,此事件也觸發。
move 包括moved_to和 moved_from
move_self 文件或目錄被移除,之后不再監聽此文件或目錄。
create 文件或目錄創建
delete 文件或目錄刪除
delete_self 文件或目錄移除,之后不再監聽此文件或目錄
unmount 文件系統取消掛載,之后不再監聽此文件系統。
=======================================================================================================================================================================
腳本1
#!/bin/bash
#para
host01=192.168.9.118 #inotify-slave的ip地址
src=/home/sw_bak #本地監控的目錄
dst=home #inotify-slave的rsync服務的模塊名
user=root #inotify-slave的rsync服務的虛擬用戶
rsync_passfile=/etc/rsyncd.secrets #本地調用rsync服務的密碼文件
inotify_home=/usr/local/inotify #inotify的安裝目錄
#judge
if [ ! -e "$src" ] \
|| [ ! -e "${rsync_passfile}" ] \
|| [ ! -e "${inotify_home}/bin/inotifywait" ] \
|| [ ! -e "/usr/bin/rsync" ];
then
echo "Check File and Folder"
exit 9
fi
${inotify_home}/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e close_write,delete,create,attrib $src \
| while read file
do
#rsync -avzP --delete --timeout=100 --password-file=${rsync_passfile} $src $user@$host01::$dst >/dev/null 2>&1
cd $src && rsync -aruz -R ./ --timeout=100 $user@$host01::$dst --password-file=${rsync_passfile} >/dev/null 2>&1
done
exit 0
腳本2
#!/bin/bash
src=/home/ # 需要同步的源路徑
des=home # 目標服務器上 rsync --daemon 發布的名稱,rsync --daemon這里就不做介紹了,網上搜一下,比較簡單。
rsync_passwd_file=/etc/rsyncd.secrets # rsync驗證的密碼文件
ip1=192.168.9.44 # 目標服務器1
ip2=192.168.9.118 # 目標服務器2
user=root # rsync --daemon定義的驗證用戶名
cd ${src} # 此方法中,由于rsync同步的特性,這里必須要先cd到源目錄,inotify再監聽 ./ 才能rsync同步后目錄結構一致,有興趣的同學可以進行各種嘗試觀看其效果
/usr/local/bin/inotifywait -mrq --format '%Xe %w%f' -e modify,create,delete,attrib,close_write,move ./ | while read file # 把監控到有發生更改的"文件路徑列表"循環
do
INO_EVENT=$(echo $file | awk '{print $1}') # 把inotify輸出切割 把事件類型部分賦值給INO_EVENT
INO_FILE=$(echo $file | awk '{print $2}') # 把inotify輸出切割 把文件路徑部分賦值給INO_FILE
echo "-------------------------------$(date)------------------------------------"
echo $file
#增加、修改、寫入完成、移動進事件
#增、改放在同一個判斷,因為他們都肯定是針對文件的操作,即使是新建目錄,要同步的也只是一個空目錄,不會影響速度。
if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]] # 判斷事件類型
then
echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO'
rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} && # INO_FILE變量代表路徑哦 -c校驗文件內容
rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des}
#仔細看 上面的rsync同步命令 源是用了$(dirname ${INO_FILE})變量 即每次只針對性的同步發生改變的文件的目錄(只同步目標文件的方法在生產環境的某些極端環境下會漏文件 現在可以在不漏文件下也有不錯的速度 做到平衡) 然后用-R參數把源的目錄結構遞歸到目標后面 保證目錄結構一致性
fi
#刪除、移動出事件
if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
then
echo 'DELETE or MOVED_FROM'
rsync -avzR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} &&
rsync -avzR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des}
#看rsync命令 如果直接同步已刪除的路徑${INO_FILE}會報no such or directory錯誤 所以這里同步的源是被刪文件或目錄的上一級路徑,并加上--delete來刪除目標上有而源中沒有的文件,這里不能做到指定文件刪除,如果刪除的路徑越靠近根,則同步的目錄月多,同步刪除的操作就越花時間。這里有更好方法的同學,歡迎交流。
fi
#修改屬性事件 指 touch chgrp chmod chown等操作
if [[ $INO_EVENT =~ 'ATTRIB' ]]
then
echo 'ATTRIB'
if [ ! -d "$INO_FILE" ] # 如果修改屬性的是目錄 則不同步,因為同步目錄會發生遞歸掃描,等此目錄下的文件發生同步時,rsync會順帶更新此目錄。
then
rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} &&
rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des}
fi
fi
done
iptables -A INPUT -i eth0 -p tcp -s 192.168.101.0/24 --dport 873 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 873 -m state --state ESTABLISHED -j ACCEPT
完!