unison简介
Unison是一款跨windows/linux/MAC OS平台的文件同步工具,不仅支持本地对本地同步,也支持通过SSH、RSH和Socket等网络协议与远程主机进行同步。最主要的是,Unison支持双向同步操作,即任何一端数据发生改变,都会更新到对端;但是,unison无法实现实时双向同步。
与rsync区别:rsync同步是单向的,客户端同步服务器端,而客户端进行文件的删除、修改等操作无法同步到服务端。
unison特性
1.支持跨平台同步
2.双向同步,自动更新两份副本中没有冲突的部分,有冲突的部分由用户选择更新策略
3.支持增量同步,每次同步完成后会记录文件状态,下次同步时,以上次的状态为起点开始同步
环境如下:两台虚拟机
vm1:192.168.1.145
vm2:192.168.1.146
一、安装 两台 都安装 ocaml unison
yum install -y ocaml unison
二、配置ssh key信任
原理:
A机生成公钥id_rsa.pub和私钥id_rsa ,公钥id_rsa.pub放到服务器B上重命名为 authorized_keys 用于 ssh登录B服务器
不用root用户,新建用户(建议通过普通用户进行操作,理由是通过root操作本身就危险,免密码登陆的root就更危险了。)
useradd -m unisonadm
passwd unisonadm 输入两次 Xqh@#123456 两台都添加
在vm1上创建key并配置vm2的信任
在vm1上创建key并配置vm2的信任
[root@vm1 ~]# su – unisonadm
[unisonadm@vm1 ~]$ ssh-keygen -t rsa
在提示保存私钥(key)和公钥(public key)的位置时,使用默认值;
在提示是否需要私钥密码(passphrase)时,直接敲回车,即不使用私钥密码。
之后,将生成一对密钥,id_rsa(私钥文件)和id_rsa.pub(公钥文件),保存在/home/unisonadm/.ssh/目录下。
[unisonadm@vm1 .ssh]$ cd /home/unisonadm/.ssh
[unisonadm@vm1 .ssh]$ ll
同样在另一台机上也执行一遍生成同样的
将145的 id_rsa.pub 传到146的:/home/unisonadm/.ssh目录下命名为 authorized_keys(如果146没有对应的目录,先按上面方法在146上执行一遍 创建公钥和私钥 )
[unisonadm@vm1 .ssh]$ scp id_rsa.pub unisonadm@192.168.1.146:/home/unisonadm/.ssh/authorized_keys
输入unisonadm 密码 Xqh@#123456
同样在146上执行
[unisonadm@vm2 .ssh]$ scp id_rsa.pub unisonadm@192.168.1.145:/home/unisonadm/.ssh/authorized_keys
(后来现可以直接用 ssh-copy-id 92.168.1.146 就过去了)
四、Unison的配置与使用 用配置文件同步
默认的配置文件夹位于用户的/.unison,即当前用户的home目录下 /home/unisonadm/.unison/
如果没有创建
[unisonadm@vm1 ~]$ cd /home/unisonadm
[unisonadm@vm1 ~]$ mkdir .unison
[unisonadm@vm1 ~]$ cd .unison
[unisonadm@vm1 ~]$ touch default.prf
[unisonadm@vm1 ~]$ vim default.prf
这是145的配置
#Unison preferences file root = /home/unisonadm/test root = ssh://unisonadm@192.168.1.146//home/unisonadm/test/ ignore = Path runtime/* #不同步的文件 ignore = Path application/config.php ignore = Path application/database.php ignore = Path LICENSE.txt batch = true owner = true group = true perms = -1 fastcheck = false rsync = false sshargs = -C xferbycopying = true log = true logfile = /home/unisonadm/.unison/unison.log
同样146也是
[unisonadm@vm2 ~]$ cd /home/unisonadm
[unisonadm@vm2 ~]$ mkdir .unison
[unisonadm@vm2 ~]$ cd .unison
[unisonadm@vm2 ~]$ vim default.prf
#Unison preferences file root = /home/unisonadm/test root = ssh://unisonadm@192.168.1.145//home/unisonadm/test/ ignore = Path runtime/* #不同步的文件 ignore = Path application/config.php ignore = Path application/database.php ignore = Path LICENSE.txt batch = true owner = true group = true perms = -1 fastcheck = false rsync = false sshargs = -C xferbycopying = true log = true logfile = /home/unisonadm/.unison/unison.log
测试(注意权限的问题,root用户创建的文件,不给权限普通用户是没读写权限的,没有权限是没法同步的)
首先分别在vm1与vm2的/home/unisonadm/test/目录下创建文件或目录,然后在vm1上执行unison,接着如果在vm1与vm2上都能看到各自创建的文件,就说明同步成功。
[unisonadm@vm1 ~]$ cd test
[unisonadm@vm1 test]$ touch a.txt
[unisonadm@vm2 ~]$ cd test
[unisonadm@vm2 test]$ touch b.txt
在vm1上执行unison
[unisonadm@vm1 ~]$ unison
在145与146上查看文件是否同步
定期或实时执行同步
如果想要定期执行,则通过crontab计划任务来实现,例如通过以下方式设置每5分钟执行一次
[root@vm1 ~]# su - unisonadm
[unisonadm@vm1 ~]$ crontab -e
*/5 * * * * /usr/bin/unison