通過rsync+inotify-tools+ssh實現觸發式遠程即時同步 檔案的同步鏡像在很多地方都需要用到,因此rsync這款免費軟體得到了廣泛的應用,包括在Windows平台上,都已經有了支援rsync的“cwRsyncServer”。 但是,我們一般都是通過結合crontab計劃任務來實現檔案同步的,這樣做的缺點是效率低,不能做到即時同步。 現在,在Linux平台下我們可以利用2.6核心的inotify監控檔案系統機制,通過inotify-tools來實現即時同步了。 具體操作如下: 1.安裝所需軟體 目前各大Linux發行版本都已經具有了rsync與inotify-tools的軟體包,推薦通過RPM,yum,apt-get等方式進行安裝。 RHEL: [root@server1 ~]# rpm -ivh rsync-* [root@server1 ~]# rpm -ivh inotify-tools-* CentOS: [root@server1 ~]# yum install rsync inotify-tools Ubuntu: [root@server1 ~]# apt-get install rsync inotify-tools 採用源碼方式安裝的步驟如下: [root@server1 ~]# wget ftp://ftp.samba.org/pub/rsync/rsync-3.0.8.tar.gz [root@server1 ~]# tar xzvf rsync-3.0.8.tar.gz [root@server1 ~]# cd rsync-3.0.8 [root@server1 ~]# ./configure [root@server1 ~]# make [root@server1 ~]# make install [root@server1 ~]# wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz [root@server1 ~]# tar xzvf inotify-tools-3.14.tar.gz [root@server1 ~]# cd inotify-tools-3.14 [root@server1 ~]# ./configure [root@server1 ~]# make [root@server1 ~]# make install 2.配置ssh key信任 建議通過普通使用者進行操作,理由是通過root操作本身就危險,免密碼登陸的root就更危險了。 在兩台伺服器上建立rsync使用者 [root@server1 ~]# useradd -m rsync [root@server1 ~]# passwd rsync [root@server2 ~]# useradd -m rsync [root@server2 ~]# passwd rsync [root@server1 ~]# su - rsync [rsync@server1 ~]$ ssh-keygen -t rsa 在提示儲存私密金鑰(key)和公開金鑰(public key)的位置時,使用預設值; 在提示是否需要私密金鑰密碼(passphrase)時,直接敲斷行符號,即不使用私密金鑰密碼。 之後,將產生一對密鑰,id_rsa(私密金鑰檔案)和id_rsa.pub(公開金鑰檔案),儲存在/home/rsync/.ssh/目錄下。 將公開金鑰添加到遠程主機的 authorized_keys 檔案中 將檔案上傳到遠程主機(假設遠程主機IP為192.168.10.4) [rsync@server1 ~]$ scp ~/.ssh/id_rsa.pub rsync@192.168.10.4:/home/rsync/ 使用rsync使用者SSH到登陸到遠程主機,並將公開金鑰添加到 authorized_keys 檔案中 [rsync@server2 ~]$ mkdir .ssh [rsync@server2 ~]$ chmod 700 .ssh [rsync@server2 ~]$ mv ~/id_rsa.pub ~/.ssh/authorized_keys 重啟SSH服務 [root@server1 ~]# /etc/init.d/sshd restart [root@server2 ~]# /etc/init.d/sshd restart 3.建立inotify_rsync.sh指令碼 [root@server1 ~]# vim inotify_rsync.sh #!/bin/sh SRC=/home/rsync/test DST=rsync@192.168.10.4:/home/rsync/test /bin/su - rsync /usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib ${SRC} | while read D E F do /usr/bin/rsync -ahqzt --delete $SRC $DST done 相關註解如下: /usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib ${src} -m 是保持一直監聽 -r 是遞迴查看目錄 -q 是列印出事件 -e create,move,delete,modify,attrib 是指 “監聽 建立 移動 刪除 寫入 許可權” 事件 /usr/bin/rsync -ahqzt --delete $SRC $DST -a 存檔模式 -h 儲存硬串連 -q 制止非錯誤資訊 -z 壓縮檔資料在傳輸 -t 維護修改時間 -delete 刪除於多餘檔案 要排除同步某個目錄時,為rsync添加--exculde=PATTERN參數,注意,路徑是相對路徑,具體查看man rsync。 要排除某個目錄的事件監聽的處理時,為inotifywait添加--exclude或--excludei參數,具體查看man inotifywait。 inotifywait 命令產生三個傳回值,分別是“日期,時間,檔案” 這3個傳回值會做為參數傳給read,因此指令碼中的“while read D E F” 寫法細化了傳回值。 賦予指令碼可執行許可權 [root@server1 ~]# chmod +x inotify_rsync.sh 執行指令碼 [root@server1 ~]# /root/inotify_rsync.sh & 設定指令碼開機自啟動 [root@server1 ~]# cat "/root/inotify_rsync.sh &" >> /etc/rc.local 4.測試 首先在server1伺服器的/home/rsync/test目錄下建立檔案或目錄,然後再到server2的/home/rsync/test目錄下查看,如果看到就說明成功了。 [rsync@server1 ~]$ cd test [rsync@server1 test]$ touch a.txt 注意:第一次SSH串連的時候可能需要輸入一次密碼,之後就不需要輸入了。 [rsync@server2 ~]$ cd test [rsync@server2 test]$ ls a.txt 看到了a.txt檔案,說明檔案同步已經成功!