install unison

rsync가 단방향 sync툴이라면 unison은 다른 공간에서 각각 삽입/수정/삭제 되는 것에 대해 sync가 가능한 툴이다.

쉽게 말하면 a → b rsync 일때(a의 내용을 b에 똑같이 넣을때) b의 파일을 가감해도 a에 반영되지 않는다. 그러나 unison은 a → b unison 을 하면 b의 파일을 가감하면 a에도 반영된다.

unison logo

case : unix

wget http://caml.inria.fr/pub/distrib/ocaml-3.12/ocaml-3.12.1.tar.gz
tar xvfz ocaml-3.12.1.tar.gz
cd ocaml-3.12.1
./configure
make world opt
sudo make install

yum install ctags-etags
wget http://www.seas.upenn.edu/~bcpierce/unison/download/releases/stable/unison-2.45.4.tar.gz
tar xvfz unison-2.45.4.tar.gz
cd unison-2.45.4
make UISTYLE=text
sudo cp ./unison /usr/bin

case : centos

centos 에서는 unison 배포본이 없다. 게다가 compile를 위해선 ocaml 이라는 언어를 사용해야 하는데, 물론 centos 배포본에도 없다.(슬슬 귀찮아지기 시작한다.) 그래서 그냥 unison rpm 설치를 하기로 했다.

rpm찾기는 여기서 : http://www.rpmfind.net/linux/rpm2html/search.php?query=unison

wget ftp://195.220.108.108/linux/dag/redhat/el5/en/i386/dag/RPMS/unison-2.32.52-1.el5.rf.i386.rpm
rpm -Uvh unison-2.32.52-1.el5.rf.i386.rpm

case : ubuntu

ubuntu 패키지는 최신은 아니다. 안정버젼은 2.32.52-1이므로 필요하면 구해다 깔아봄도 괜찮다.

apt-get install unison

양쪽 서버에 똑같이 깔아준다.(버젼이 맞아야 한다.)

unison사용에서 from to가 따로없다.

unison /var/www/test ssh://xxx.xxx.xxx.xxx//var/www/test -batch -fastcheck=true

보통은 메뉴얼처럼 보통은 profile을 $HOME/.unison/ 디렉토리에 만들어 사용하는게 좋다. 실제로 몇가지 테스트를 해봤는데, batch모드에서 같은 이름의 파일이 다른 지점에 각각 생성되면 conflict가 나서 propagate가 진행되지 않는다.

이럴때에는 conflict파일을 처리하는 정책을 세워줘야 하는데 prefer옵션을 사용한다. force옵션은 conflict상황이 아닌 상태에서도 정책이 적용되니 주의가 필요하다. prefer에 ROOT를 기재하면 그 root에 기반해서 파일을 sync한다. root대신 newer, older를 사용하면 times옵션을 같이 사용해야 하며, 수정시간에 맞게 sync해준다.(단 이때 퍼미션에 주의한다.)

vi /home/xxxx/.unison/profile1
# Unison preferences file
root=/home/xxxx
root=ssh://xxx.xxx.xxx.xxx//home/xxxx
path=test
batch=true
fastcheck=auto
prefer=/home/xxxx

cron으로 돌리기 위해선 그냥 생짜 명령어는 안되고 스크립트를 만들어서 $HOME변수를 지정해줘야 한다. cron으로 돌아갈때는 home을 / 로 생각하기  때문에 permission denied 오류가 나온다. 또한 두 서버간 파일들의 pemmission은 rw 가 되어야 한다. 그러므로 스크립트 함수를 만들어서 충분한 테스트를 해보는게 좋다.

#!/bin/sh
HOME=/var/www/backup/log
unison profile1