[첫화면으로]Unison

마지막으로 [b]

http://www.cis.upenn.edu/~bcpierce/unison/

두 컴퓨터 간에 지정한 디렉토리를 항상 동일한 상태로 만들어 주는 (한쪽에서 추가, 삭제, 변경된 파일을 다른 쪽에도 적용) 화일동기화를 위한 프로그램.

1. 개요
2. case 1 : 윈도우-리눅스-윈도우 3PC간 동기화
2.1. 동기화할 시스템 구성
2.2. 프로필 작성
2.3. unison 실행
2.4. SSH 사용
2.5. 사용 소감
3. case 2 : 윈도우 사이의 동기화 - socket 프로토콜 사용
3.1. 프로필 작성
3.2. 실제 사용하고 있는 프로필 파일 예
3.3. 동기화 작업 절차
4. case 3 : 윈도우 사이의 동기화 - ssh 프로토콜 사용
4.1. 서버 쪽 윈도우에 SSH Daemon 띄우기
4.2. 클라이언트 쪽 SSH 준비
5. 추가 업데이트 & 더 이상 유효하지 않은 내용
5.1. 여러 개의 서버 프로세스를 한꺼번에 띄우자

1. 개요

2. case 1 : 윈도우-리눅스-윈도우 3PC간 동기화

처음 unison을 사용하기 시작할 때의 구성이다.

2.1. 동기화할 시스템 구성

주인장은 다음과 같이 사용한다.

A:집PC(윈도우) ----------------- B:집PC(리눅스) ------------ C:연구실PC(윈도우)
unison 클라이언트                    SSH 서버               unison 클라이언트
D:\Work (내문서)               /mnt/data/Shared/Work        D:\Work (내문서)
C:\Doc...\Favorites (즐겨찾기) /mnt/data/Shared/Favorites   C:\Doc...\Favorites (즐겨찾기)

집의 컴퓨터를 끄기 전에 A-B 를 동기화하고, 학교에 도착하면 B-C 를 동기화. 학교에서 나올 때는 역순으로 한다. 한 번으로 끝날 것을 두번씩 해야 하므로 불편한 감이 있긴 한데, 리눅스에는 SSH서버와 unison전부가 아주 훌륭하게 동작하고 있어서 윈도우 쪽에 불편하게 설치할 필요가 없다. 윈도우에서 unison 서버를 쓰려면 CygWin 위에서 unison 서버를 돌려야 하고, SSH 서버를 돌리려고 해도 상용이라... (Free이며 독립된 어플로 돌아가는 윈도우용 SSH서버가 있으면 알려 주세요) 또 한 가지, A와 C뿐 아니라 B에도 복제본이 생기므로 "내문서" 같이 나름대로 중요한 폴더를 보관하기에 든든하다.

2.2. 프로필 작성

unison 기본 사용법은 unison -doc tutorial 하면 자세히 예문이 나오니 이걸 읽어보면 되고... unison 은 프로필 기능을 지원하므로 프로필 파일을 한 번만 만들어 주면 그 다음부터는 일일이 쳐 줄 필요가 없다.

예를 들어 내 즐겨찾기를 동기화하기 위해서 C:\Documents and Settings\내 계정\.unison\Favorites.prf 이라는 파일을 만들고 내용을 다음과 같이 적어 준다.
times = true                                                       --> 갱신할 때 파일의 시각도 맞춰 줌
root = C:\Documents and Settings\Administrator\Favorites           --> 내 쪽(A)에서 동기화할 최상위 디렉토리
root = ssh://raymundo@192.168.1.101//mnt/data/Shared/Favorites/    --> 상대방 쪽(B)에서 동기화할 최상위 디렉토리.
ignore = Name Desktop.ini                                          --> Desktop.ini 란 이름의 파일은 무시 (이런 설정은 튜토리얼 참조)

2.3. unison 실행

이제 명령 프롬프트창을 열어서 명령을 내리면 끝.
C:\Documents and Settings\Administrator> unison Favorites   ("unison 프로필이름" 당연히 unison.exe 는 PATH 가 지정된 곳에 있어야 한다)
Contacting server...           <-- 서버에 접속하고
Looking for changes
  휴대폰
  휴대폰/서비스업체            <-- 이런 식으로 각 하위 폴더를 검색한 후
  ...
  Waiting for changes from server
Reconciling changes

local          raymundus
deleted  ---->            test/Untitled Document.url  [f] f    <-- A에서 지워진 "test/Untitled Document.url" 을 B에서도 지울 것인지 확인

Proceed with propagating updates? [] y                         <-- 결정한 대로 실행
Propagating updates


UNISON started propagating changes at 00:31:59 on 29 Jul 2004
[BGN] Deleting test/Untitled Document.url
  from //raymundus//mnt/data/Shared/Favorites
[END] Deleting test/Untitled Document.url
UNISON finished propagating changes at 00:31:59 on 29 Jul 2004


Saving synchronizer state
Synchronization complete          <-- 동기화 성공을 알리는 메시지

2.4. SSH 사용

근데 사실 이게 전부가 아니라... 위에 프로필에 보면 원격지 B에 접근하는 프로토콜이 ssh:// 라고 되어 있다. 따라서 A쪽에는 SSH클라이언트가 있어야 하는데... 참으로 희한하게도 상용 SSH패키지에 있는 커맨드라인 실행파일인 ssh2.exe 나, PuTTY 에 포함되어 있는 ssh.exe 와, GNU버전의 OpenSSH 패키지에 있는 ssh 의 인터페이스가 제각각이라서 앞의 두 개는 unison 과 궁합이 맞지 않는다 -_-; 그래서 후자를 써야 하는데, 잘 기억은 안 나지만 이것도 윈도우용 바이너리를 구하기가 힘들었던 것 같다. 결국은 CygWin 을 설치해야 했다.

CygWin 을 설치할 때 OpenSSH 패키지도 같이 설치하면, ssh.exe 가 생긴다. CygWin 라이브러리가 설치되어 있으므로 이 놈도 실행이 된다. ssh.exe 의 경로도 PATH 에 넣어준다.

이걸로 끝..이냐 하면 그도 아니라서, -_-; 이제는 저렇게 unison 명령어를 내릴 때마다 원격 컴퓨터 B에 로그인하기 위한 암호를 넣어야 한다. 따라서 SSH페이지에 있는 암호를 넣지 않고 로그인하기 방법을 사용한다. 클라이언트 쪽에서 공개키를 만들고, 그 키를 서버쪽에 ~/.ssh/authrized_keys 에 적어 준다. 클라이언트 쪽에도 B에 접속하기 위해서는 SSH1 프로토콜을 사용하라고 알려줘야 하는데, 이 옵션이 들어갈 자리는 C:\Doc...\Administrator 아래가 아니라, CygWin 에서 Administrator 의 홈디렉토리, 즉 CygWin 을 실행한 상태에서는 /home/Administrator, 윈도우 탐색기에서는 (CygWin설치디렉토리)\home\Administrator 에 해당하는 폴더 아래에 .ssh 폴더 아래에 Config 라는 파일을 만들어서 그 내용을 다음과 같이 적어 준다.
Host 192.168.1.101
	Protocol 1,2

2.5. 사용 소감

음... 원래는 "이렇게 간단하게 할 수 있다"는 얘기를 하고 싶었는데, 막상 쓰고 나니 정말 복잡해 보인다. 하지만 그럴 만한 가치가 충분히 있다고 생각함. 한 번 이렇게 설치 및 설정을 하고 나니 그 다음부터는 오직 "unison Favorites" "unison Work" 두 명령만 실행하면 즐겨찾기와 내 문서 폴더를 동기화할 수 있고, 세 대의 PC 중 두 대의 PC의 하드디스크가 맛이 가더라도 중요한 내 문서 데이타는 여전히 안전하게 남아 있으며 (물론 가장 최근 동기화한 후에 변경한 내용은 날아가겠지만) 무엇보다도 동기화를 한 덕에 집과 학교를 오가며 작업할 때 파일을 가져왔다 수정하고 다시 돌려놓고 할 때 혼란의 여지가 없어진 것이 정말 편하다. 어느 쪽 컴퓨터에서건 그저 하던 대로 내 문서 폴더 아래에 있는 데이타를 열고 작업하고 저장하면 그걸로 끝.

비슷한 기능을 하는 것으로 rsync 란 게 있는데 이것은 양쪽에서 동시에 수정되었을 때의 충돌 처리를 전혀 해 주지 못하고 무조건 덮어써 버린다. 백업용으로만 좋지 동기화용으로는 꽝. 그 외에 윈도우끼리 동기화할 수 있는 상용 프로그램들도 있는데 (화일동기화페이지 참조) 이놈이고 저놈이고 딱 맘에 드는 게 없어서 결국 처음 설정이 불편하더라도 unison 을 쓰는 지금이 가장 만족스럽다.

3. case 2 : 윈도우 사이의 동기화 - socket 프로토콜 사용

2006년 4월 8일 이후.

아무래도 윈도우-리눅스-윈도우 사이에 동기화를 하는 것은 매번 두번씩 동기화를 해야 하기 때문에 불편하여, 집의 윈도우PC와 학교의 윈도우PC 사이에 직접 동기화를 하기로 하였다.

연구실PC(C)에서 unison을 서버 모드로 실행하고, 집PC(A)에서 클라이언트로 실행하기로 한다. SSH 프로토콜을 사용하는 것이 보안상 좋겠는데, 그러려면 C 쪽에서 sshd 데몬이 있어야 하고, 그러자면 다시 cygwin을 설치해야 한다. 상당히 불편한 일이라, 그냥 socket 프로토콜을 쓰기로 했다.

3.1. 프로필 작성

먼저 unison 서버를 띄울 포트 번호를 정해준다. 여기서는 적당히 10000으로 지정했다.

만일 A의 D:\Work 와 C의 D:\Work 폴더를 동기화하고 싶다면, A쪽에서는 프로필을 다음과 같이 작성한다.
times = true
root = D:\Work
root = socket://연구실PC주소.kr:10000/D:\Work
위 프로필에서는 양쪽 컴퓨터의 D:\Work 폴더를 각각 루트 디렉토리로 지정했다. 이 경우 굳이 양쪽 폴더의 이름이 동일할 필요는 없다.

또는 다음과 같이 프로필을 작성할 수도 있다.
times = true
root = D:\
root = socket://연구실PC주소.kr:10000/D:\

path = Work
즉, root에는 최상위 드라이브명만 명시하고, path 에다 하위 폴더들을 적어 준다. 이 경우 한 드라이브 밑에 있는 여러 폴더를 동시에 동기화할 수도 있다. 예를 들어 D: 아래 있는 D:\Work 와 D:\Temp 를 동기화하고 싶다면 path = Temp 를 추가해준다:
times = true
root = D:\
root = socket://연구실PC주소.kr:10000/D:\

path = Work
Path = Temp

3.2. 실제 사용하고 있는 프로필 파일 예

주인장이 실제로 사용하는 Unison 프로필의 예이다.

집PC의 C_Favorites.prf
# 즐겨찾기와 Favicon 폴더를 동기화
terse = true
times = true
root = C:\
root = socket://helmet.snu.ac.kr:10000/C:\

path = Documents and Settings/raymundo/Favorites
path = Documents and Settings/raymundo/Application Data/aignes/AM-DeadLink/IE-FavIcons

ignore = Name Desktop.ini

집PC의 D_Work.prf
# 내 문서 폴더끼리 동기화
terse = true
times = true
fastcheck = true
root = D:\
root = socket://helmet.snu.ac.kr:10000/D:\

path = Work

# 이하는 동기화하지 않을 폴더나 파일들
# 용량이 큰 사진 폴더라거나, 사진 thumbnail 파일 등
ignore = Name Desktop.ini
ignore = Path {Work/Default.rdp}
ignore = Path {Work/My Photos}
ignore = Name {Thumbs.db}
ignore = Path {Work/My Pictures/Palm Photos}
ignore = Path {Work/Anycall PC Manager}

3.3. 동기화 작업 절차

이제 실제 동기화를 하기 위해서는

4. case 3 : 윈도우 사이의 동기화 - ssh 프로토콜 사용

case 2 에서 언급했듯이 윈도우에서 SSH 서버를 띄우고 등등의 작업이 영 불편해서 그냥 socket 프로토콜을 사용하고 있었다. 그런데 얼마 전부터 학교에서 빌어먹을 이상한 방화벽을 운영하는 바람에1 동기화 도중에 특정 파일을 전송할 때 갑자기 학교와 집 사이의 모든 연결이 차단되는 증상이 생길 때가 있다. 파일 내의 바이트 시퀀스가 방화벽에서 차단하는 패턴에 우연하게 맞아떨어지나본데, 이런 경우는 FTP나 HTTP로 전송하는 것도 안 되니 별 수 없이 파일 자체를 zip등으로 압축하거나 해서 변형을 해줘야 한다.

이왕 이리 된 거 아예 동기화를 ssh 프로토콜을 사용하게 해 볼까 싶어서 시도해 보았다. 다행히 성공했다. 문제가 되었던 파일도 잘 전송이 되었다.

4.1. 서버 쪽 윈도우에 SSH Daemon 띄우기

학교에 있는 컴퓨터 쪽에서는 SSH 서버가 실행되어야 하는데, [freeSSHd]라는 게 꽤 설치나 사용법도 깔끔하게 띄울 수는 있었는데, 정작 unison하고 궁합이 안 맞는지 동기화 시도를 했을 때 반응을 안 했다. (서버쪽에서도 자동으로 unison을 띄우는 것 까지는 확인했는데 그 후에 진행이 안 됨)

결국 서버와 클라이언트 양쪽 다 Cygwin을 사용하기로 함.

서버와 클라이언트 각각 다음과 같이 해 준다.

다음 서버에서는 다음과 같이 설정한다.
# ssh-keygen  -t dsa -f /etc/ssh_host_dsa_key -N ""
# ssh-keygen  -t rsa -f /etc/ssh_host_rsa_key -N ""

4.2. 클라이언트 쪽 SSH 준비

클라이언트 쪽에서도 마찬가지로 Cygwin+Openssh 를 설치해 준 후, case 1과 마찬가지로 프로필 파일에 ssh 를 사용하도록 적어주면 된다.
# 두 컴퓨터의 D:\Work 를 동기화하는 예
root = D:\
root = ssh://raymundo@연구실PC주소.kr/D:\     <-- ssh 를 쓰도록 바뀌었음

path = Work

5. 추가 업데이트 & 더 이상 유효하지 않은 내용

2009. 3. 26. 현재 unison 공식 홈을 통해 받을 수 있는 윈도우용 unison 바이너리의 안정 버전은 2.27.57이다. 테스트해 보니, 기존에 이 페이지에 있던 내용 중 2.17.* 에서 문제가 되었던 부분이 해결되었다. 본문을 그에 따라 수정하고 기존에 작성했던 내용은 보존 차원에서 아래에 남김.

2009.04.26 내문서 폴더가 4GB정도 되다보니 업데이트 체크가 너무 느려서... 자주 변경하게 되는 폴더의 경우만 따로 프로파일을 만들어서 따로 싱크하고 그랬었다. (일부분만 싱크하고 다시 전체를 싱크하더라도 업데이트 체크에 전혀 문제가 없다는 게 Unison의 장점) 그런데 도큐먼트를 우연히 보니 MS윈도우에서 싱크가 오래 걸리는 문제에 관한 언급이 있더라;;; 프로파일에다가 fastcheck=true로 설정하고 테스트해보니, 전에는 업데이트 체크하는데에만 4분이 걸렸는데 이제는 5초만에 된다. 흐미...
-- Raymundo 2009-4-26 10:25 pm

이름:  
Homepage:
내용:
 


컴퓨터분류
각주:
1. Diary/학교의웹방화벽, Diary/학교의웹방화벽2, Diary/학교의웹방화벽3
2. 실제로 주인장은 C, D, E 세 곳을 동기화하기 때문에 세 개

마지막 편집일: 2014-5-7 6:52 am (변경사항 [d])
7446 hits | Permalink | 변경내역 보기 [h] | 페이지 소스 보기