使用unison實現文件雙向同步

Unison是一款跨windows/linux/MAC OS平臺的文件同步工具,不僅支持本地對本地同步,也支持通過SSH、RSH和Socket等網絡協議進行同步。更棒的是,Unison支持雙向同步操作,你既可以從A同步到B,也可以從B同步到A,這些都不需要額外的設定。遺憾的是,unison無法實現實時雙向同步。下面介紹unison的安裝及使用方法。
在安裝unison之前,需要安裝ocaml編譯器。

ocaml安裝

  1. cd /tmp

  2. wget http://caml.inria.fr/pub/distrib/ocaml-3.12/ocaml-3.12.1.tar.gz

  3. tar xzf ocaml-3.12.1.tar.gz

  4. cd ocaml-3.12.1

  5. ./configure

  6. make world opt

  7. make install

unison安裝

  1. cd /tmp

  2. wget http://www.seas.upenn.edu/~bcpierce/unison//download/releases/stable/unison-2.40.63.tar.gz

  3. tar xzf unison-2.40.63.tar.gz

  4. cd unison-2.40.63

  5. make UISTYLE=text

  6. mkdir /root/bin

  7. make install

  8. cp /root/bin/unison /usr/bin/

unison的使用

如需要實現遠程雙向文件同步,兩臺機子都需要安裝unison。
unison的連接傳輸方式有兩種:一是ssh,二是socket。我們這裏先用比較安全的ssh。所以爲了不需要密碼連接,首先爲它們配置密鑰。

配置雙機ssh信任

例假設本地機爲:10.178.1.132(linux)
遠程機:10.178.1.110(solaris)
1. 在兩臺機器上創建 RSA密鑰
以下操作要在本地機和遠程機上都執行一遍
(1)以 root 用戶登錄
(2)在 root 用戶的 主目錄內創建.ssh 目錄並設置正確的權限 

  1. [root@gsgatzhapp1 ~]# mkdir ~/.ssh 

  2.    [root@gsgatzhapp1 ~]# chmod 700 ~/.ssh

(3)使用 ssh-keygen 命令生成第 2 版本的 SSH 協議的 RSA 密鑰 

  1. [root@gsgatzhapp1 ~]# ssh-keygen -t rsa

在提示保存私鑰(key)和公鑰(public key)的位置時,使用默認值。 如果需要私鑰密碼(passphrase),則輸入一個私鑰密碼(如果使用私鑰密碼,使用 ssh 執行遠程命令時需要輸入私鑰密碼,因此,本案例中未使用私鑰密碼),因此,直接回車即可。
2. 添加密鑰到授權密鑰文件(authorized key file)中
(1)以 root 用戶登錄
(2)在本地機上執行 

  1. [root@gsgatzhapp1 ~] # cd ~/.ssh 

  2.      [[email protected]]#ssh 10.178.1.132 cat /root/.ssh/id_rsa.pub >> authorized_keys 

  3.      [[email protected]]#ssh 10.178.1.110 cat /root/.ssh/id_rsa.pub >> authorized_keys 

  4.      [[email protected]]#scp authorized_keys 10.178.1.110:/root/.ssh/ 

  5.      [oracle@gsgatzhapp1 .ssh]# chmod 600  /root/.ssh/authorized_keys

(3)在遠程機10.178.1.110 上: 

  1. bash-2.05# chmod 600  /root/.ssh/authorized_keys

(4)測試
完成後,在 gsgatzhapp1 上執行: 

  1. [root@gsgatzhapp1 ~]# ssh 10.178.1.132  date 

  2.      [root@gsgatzhapp1 ~]#ssh 10.178.1.110 date

如果不需要輸入密碼就出現系統日期,說明 SSH 配置成功。

unison使用方法

unison的命令格式爲:unsion 目錄1 目錄2 選項
例1:unison /home/dir1 /home/dir2
表示同步本地兩個目錄dir1和dir2。
例2:unison /home/dir1 ssh://192.168.1.2//root/dir
表示本地的目錄/home/dir1通過ssh同步遠程機器192.168.1.2的目錄/root/dir。
例3:unison /home/dir1 ssh://192.168.1.2//root/dir -batch
表示本地的目錄/home/dir1通過ssh同步遠程機器192.168.1.2的目錄/root/dir,並不需要回答任何問題直接同步,batch參數表示不需要回答問題。
下面是一些參數的解釋,更多的參數可以用命令unison -help查看。

unison參數說明

Unison有很多參數,這裏只介紹經常使用的幾個,詳細的請參看unison手冊:
• -testserver
測試連通性,連接到服務器即退出。示例:
$ unison / ssh://opensou1@bluehost/ -servercmd=~/bin/unison -testserver
如果服務器端 unison 可執行文件不在默認目錄下,甚至沒有 unison 命令(需要你編譯一個上傳到服務器),則需要使用 -servercmd 參數告訴要執行的服務器 unison 命令位置。
使用 -testserver 參數,則成功鏈接即退出,也不會去執行目錄的比較等後續操作。
• -servercmd xxx
告訴 unison, 服務器端的 unison 命令是什麼。參見上面的示例。
• -auto
接受缺省的動作,然後等待用戶確認是否執行。
• -batch
batch mode, 全自動模式,接受缺省動作,並執行。
• -ignore xxx
增加 xxx 到忽略列表中
• -ignorecase [true|false|default]
是否忽略文件名大小寫
• -follow xxx
是否支持對符號連接指向內容的同步
• owner = true (保持同步過來的文件屬主)
• group = true (保持同步過來的文件組信息)
• perms = -1 (保持同步過來的文件讀寫權限)
• repeat = 1 (間隔1秒後,開始新的一次同步檢查)
• retry = 3 (失敗重試)
• sshargs = -C (使用ssh的壓縮傳輸方式)
• xferbycopying = true
• -immutable xxx
不變目錄,掃描時可以忽略
• -silent
安靜模式
• -times
同步修改時間
• -path xxx 參數
只同步 -path 參數指定的子目錄以及文件,而非整個目錄。-path 可以多次出現,例如
unison /home/username ssh://remotehost//home/username 
-path shared 
-path pub 
-path .netscape/bookmarks.html

配置文件的使用

unison可以調用配置文件的方式使用,如unison rsync就是調用~/.unison/rsync.prf文件。
下面是我的一個web應用中兩個文件夾同步的配置信息:
root = /sina/webdata
root = ssh://[email protected]//sina/webdata
#force =/sina/webdata
ignore = Path as/*
#prefer = ssh://[email protected]//sina/webdata
batch = true
#repeat = 1
#retry = 3
owner = true
group = true
perms = -1
fastcheck=false
rsync =false
#debug=verbose
sshargs = -C
xferbycopying = true
log = true
logfile = /root/.unison/sina_122.1547.log
說明如下:
兩個root表示需要同步的文件夾
force表示以本地的/var/www/bbsnew文件夾爲標準,將該目錄同步到遠端。注意,如果指定了force參數,那麼unison就變成了單項同步了,也就是說會以force指定的文件夾爲準進行同步.
Unison本身是可以雙向同步的,但是要做到雙向同步,就不要設置force參數,如果設置了force參數,就成了單項同步了,此時unison類似與sync.
Unison雙向同步基本原理是:假如有A B兩個文件夾,A文件夾把自己的改動同步到B,B文件夾也把自己的改動同步到A,最後A B兩文件夾的內容相同,是 A B文件夾的合集.
Unison雙向同步的一個缺點是,對於一個文件在兩個同步文件夾中都被修改時,unison是不會去同步的,因爲unison無法判斷以那個爲準.
ignore = Path表示忽略/sina/webdata下面的WEB-INF/tmp目錄,即同步時不同步它。
batch = true,表示全自動模式,接受缺省動作,並執行
-fastcheck true表示同步時使用文件的創建時間來比較兩地文件,如果這個選項爲false,unison則將比較兩地文件的內容.建議設置爲true
log = true表示在終端輸出運行信息。
logfile則指定了同時將輸出寫入log文件。

定時同步的實現

unison很難做到實時同步,不過可以做到定時同步,配合cronjob就可以實現,如:
crontab -e
0 3 * * * unison rsync
參考文章:http://www.cis.upenn.edu/~bcpierce/unison/download/releases/stable/unison-manual.html
http://ixdba.blog.51cto.com/2895551/584334

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章