Linux下利用Unison實現文件雙向同步

一、Unison簡介
Unison是Windows、Linux以及其他Unix平臺下都可以使用的文件同步工具,它能使兩個文件夾(本地或網絡上的)保持內容的一致。Unison擁有與其它一些同步工具或文件系統的相同的特性,但也有自身的特點:
1.跨平臺使用;
2.對內核和用戶權限沒有特別要求;
3.Unison是雙向的,它能自動處理兩分拷貝中更新沒有衝突的部分,有衝突的部分將會顯示出來讓用戶選擇更新策略;
4.只要是能連通的兩臺主機,就可以運行unison,可以直接使用socket連接或安全的ssh連接方式,對帶寬的要求不高,使用類似rsync的壓縮傳輸協議。

環境如下:
vm1:192.168.1.237
vm2:192.168.1.238

二、安裝Unison

通過以下方式在兩臺服務器上安裝
[root@vm1 ~]# yum -y install ocaml
[root@vm1 ~]# yum -y install unison

[root@vm2 ~]# yum -y install ocaml
[root@vm2 ~]# yum -y install unison

三、配置ssh key信任
建議通過普通用戶進行操作,理由是通過root操作本身就危險,免密碼登陸的root就更危險了。

在兩臺服務器上創建admin用戶
[root@vm1 ~]# useradd -m admin
[root@vm1 ~]# passwd 12345

[root@vm2 ~]# useradd -m admin
[root@vm2 ~]# passwd 123456

在vm1上創建key並配置vm2的信任
[root@vm1 ~]# su – admin
[admin@vm1 ~]$ ssh-keygen -t rsa
在提示保存私鑰(key)和公鑰(public key)的位置時,使用默認值;
在提示是否需要私鑰密碼(passphrase)時,直接敲回車,即不使用私鑰密碼。
之後,將生成一對密鑰,id_rsa(私鑰文件)和id_rsa.pub(公鑰文件),保存在/home/admin/.ssh/目錄下。
[admin@vm1 ~]$ cd /home/admin/.ssh/
[admin@vm1 .ssh]$ ll
total 8
-rw------- 1 admin admin 1675 Jan  7 21:51 id_rsa
-rw-r--r-- 1 admin admin  392 Jan  7 21:51 id_rsa.pub

將公鑰添加到vm2的 authorized_keys 文件中
將文件上傳到vm2
[admin@vm1 .ssh]$ scp id_rsa.pub [email protected]:/home/admin/

使用admin用戶SSH到登陸到遠程主機,並將公鑰添加到 authorized_keys 文件中
[admin@vm2 ~]# cd /home/admin/
[admin@vm2 admin]# ll
total 4
-rw-r--r-- 1 admin admin 392 Jan  7 21:54 id_rsa.pub
[admin@vm2 admin]$ mkdir .ssh
[admin@vm2 admin]$ chmod 700 .ssh
[admin@vm2 admin]$ mv id_rsa.pub .ssh/authorized_keys
[admin@vm2 admin]$ chmod 600 .ssh/authorized_keys

同理,執行以下步驟在vm2上創建key並配置vm1的信任

[admin@vm2 ~]$ ssh-keygen -t rsa
[admin@vm2 ~]$ cd /home/admin/.ssh/
[admin@vm2 .ssh]$ ll
total 12
-rw------- 1 admin admin  392 Jan  7 22:01 authorized_keys
-rw------- 1 admin admin 1671 Jan  7 22:04 id_rsa
-rw-r--r-- 1 admin admin  392 Jan  7 22:04 id_rsa.pub

將文件上傳到vm1
[admin@vm2 .ssh]$ scp id_rsa.pub [email protected]:/home/admin/

使用admin用戶SSH到登陸到vm1,並將公鑰添加到 authorized_keys 文件中
[admin@vm1 ~]# cd /home/admin/
[admin@vm1 admin]$ mv id_rsa.pub .ssh/authorized_keys


重啓SSH服務
兩臺服務器用su切換爲root用戶執行
[root@vm1 ~]# /etc/init.d/sshd restart
[root@vm2 ~]# /etc/init.d/sshd restart

四、Unison的配置與使用
在兩臺服務器上創建test目錄,用於測試
[root@vm1 ~]# su - admin
[admin@vm1 ~]$ cd /home/admin/
[admin@vm1 ~]$ mkdir test
[admin@vm1 ~]$ ll
total 4
drwxrwxr-x 2 admin admin 4096 Jan  7 22:12 test

[root@vm2 ~]# su - admin
[admin@vm2 ~]$ cd /home/admin/
[admin@vm2 ~]$ mkdir test
[admin@vm2 ~]$ ll
total 4
drwxrwxr-x 2 admin admin 4096 Jan  7 22:13 test


修改兩臺服務器的unison配置文件,輸入以下內容
[admin@vm1 ~]$ vim /home/admin/.unison/default.prf
 
#Unison preferences file
root = /home/admin/test
root = ssh://[email protected]//home/admin/test/
#force =
#ignore =
batch = true
#repeat = 1
#retry = 3
owner = true
group = true
perms = -1
fastcheck = false
rsync = false
sshargs = -C
xferbycopying = true
log = true
logfile = /home/admin/.unison/unison.log


[unison@vm2 ~]$ vim /home/admin/.unison/default.prf
#Unison preferences file
root = /home/admin/test
root = ssh://[email protected]//home/admin/test/
#force =
#ignore =
batch = true
#repeat = 1
#retry = 3
owner = true
group = true
perms = -1
fastcheck = false
rsync = false
sshargs = -C
xferbycopying = true
log = true
logfile = /home/unison/.unison/unison.log


相關注解如下:
force表示會以本地所指定文件夾爲標準,將該目錄同步到遠端。這裏需要注意,如果指定了force參數,那麼Unison就變成了單項同步了,也就是說會以force指定的文件夾爲準進行同步,類似與rsync。
Unison雙向同步基本原理是:假如有A B兩個文件夾,A文件夾把自己的改動同步到B,B文件夾也把自己的改動同步到A,最後A B兩文件夾的內容相同,是AB文件夾的合集。
Unison雙向同步的一個缺點是,對於一個文件在兩個同步文件夾中都被修改時,unison是不會去同步的,因爲unison無法判斷以那個爲準。
ignore = Path表示忽略指定目錄,即同步時不同步它。
batch = true,表示全自動模式,接受缺省動作,並執行。
-fastcheck true 表示同步時僅通過文件的創建時間來比較,如果選項爲false,Unison則將比較兩地文件的內容。
log = true 表示在終端輸出運行信息。
logfile 指定輸出的log文件。

另外,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 可以多次出現。

PS:Windows下的unison配置文件默認位於C:\Documents and Settings\currentuser\.unison目錄,默認的配置文件名是default.prf。

五、測試
首先分別在vm1與vm2的/home/admin/test目錄下創建文件或目錄,然後在vm1上執行unison,接着如果在vm1與vm2上都能看到各自創建的文件,就說明同步成功。

分別在vm1與vm2上切換admin用戶,創建文件
[admin@vm1 ~]$ cd test
[admin@vm1 test]$ touch 1.txt touch 3.txt
[admin@vm2 ~]$ cd test
[admin@vm2 test]$ touch 2.txt touch 4.txt

在vm1上執行unison
[admin@vm1 ~]$ unison

在vm1與vm2上查看文件是否同步
[admin@vm1 ~]$ cd test
[admin@vm1 test]$ ls
1.txt 2.txt 3.txt 4.txt
[admin@vm2 ~]$ cd test
[admin@vm2 test]$ ls
1.txt 2.txt 3.txt 4.txt

均看到了“1.txt 2.txt 3.txt 4.txt”所有文件,說明文件同步已經成功!

 

六、定期或實時執行同步
如果想要定期執行,則通過crontab計劃任務來實現,例如通過以下方式設置每5分鐘執行一次
[root@vm1 ~]# su - admin
[admin@vm1 ~]$ crontab -e
1    */5 * * * * /usr/bin/unison

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