2014年3月29日 星期六

利用inotify + rsync 實現Linux文件即時同步

一、檔案控管機制-Inotify
inotify可以幫助你即時的觀測檔案的改變,並回送通知給你,inotify把檔案狀態的變化分為以下

IN_ACCESS,即檔案被存取 
IN_MODIFY
,文件被 write 
IN_ATTRIB
,檔案屬性被修改,如 chmodchowntouch  
IN_CLOSE_WRITE
,可寫文件被 close 
IN_CLOSE_NOWRITE
,不可寫文件被 close 
IN_OPEN
,文件被 open 
IN_MOVED_FROM
,文件被移走, mv 
IN_MOVED_TO
,文件被移來,如 mvcp 
IN_CREATE
,創建新文件 
IN_DELETE
,檔被刪除,如 rm 
IN_DELETE_SELF
,自刪除,即一個可執行檔在執行時刪除自己 
IN_MOVE_SELF
,自移動,即一個可執行檔在執行時移動自己 
IN_UNMOUNT
,宿主檔案系統被 umount 
IN_CLOSE
,文件被關閉,等同於(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE) 
IN_MOVE
,文件被移動,等同於(IN_MOVED_FROM | IN_MOVED_TO) 

首先查看系統是否支持inotify,看看是否有 /proc/sys/fs/inotify/目錄,以確定內核是否支援inotify
#ls /proc/sys/fs/inotify/

二、安裝rsync inotify-tools
#yum install rsync
#wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
#tar zxvf inotify-tools-3.14.tar.gz
#./configure --prefix=/xxx/xxx
#make
#make install

如果執行inotifywait時,提示缺少libinotifytools.so.0,請將libinotifytools.so.0複製到/lib下即可


三、撰寫即時同步script及測試
測試環境為即時監控172.16.2.8/home/jacky目錄並同步至172.16.2.49:/home

先讓ssh登入免密碼,在172.16.2.8
#ssh-copy-id  -i ~/.ssh/id_rsa.pub root@172.16.2.49

然後將以下紅色代碼存成script
###############################################################
#!/bin/bash
src=/home/jacky
ip=172.16.2.49
des=/home/

/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format  '%T %w%f' \
 -e modify,delete,create,attrib ${src} \
| while read  file
        do
                rsync -avz --delete --progress ${src} root@${ip}:${des} &&
                echo "${file} was rsynced"
                echo "---------------------------------------------------------------------------"
        done
#################################################################

script運行後,來源172.16.2.8:/home/jacky內檔案有任何變動即會同步172.16.2.49:/home/

/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format  '%T %w%f' \
 -e modify,delete,create,attrib ${src} \

該段指令返回值類似於:
10/09/12 19:15 /home/jacky/xxx
三個返回值會做為參數傳給read,觸發rsync指令


rsync 參數說明
-a, --archive 歸檔模式,表示以遞迴方式傳輸檔,並保持所有檔案屬性
-v, --verbose 詳細模式輸出 
-z, --compress 對備份的檔在傳輸時進行壓縮處理 
--delete 刪除那些DSTSRC沒有的檔
--progress 在傳輸時顯示傳輸過程 

inotifywait 相關參數可用man查看


沒有留言:

張貼留言