집의 컴퓨터를 끄기 전에 A-B 를 동기화하고, 학교에 도착하면 B-C 를 동기화. 학교에서 나올 때는 역순으로 한다. 한 번으로 끝날 것을 두번씩 해야 하므로 불편한 감이 있긴 한데, 리눅스에는 SSH서버와 unison전부가 아주 훌륭하게 동작하고 있어서 윈도우 쪽에 불편하게 설치할 필요가 없다. 윈도우에서 unison 서버를 쓰려면 CygWin 위에서 unison 서버를 돌려야 하고, SSH 서버를 돌리려고 해도 상용이라... (Free이며 독립된 어플로 돌아가는 윈도우용 SSH서버가 있으면 알려 주세요) 또 한 가지, A와 C뿐 아니라 B에도 복제본이 생기므로 "내문서" 같이 나름대로 중요한 폴더를 보관하기에 든든하다.
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 란 이름의 파일은 무시 (이런 설정은 튜토리얼 참조)
설정파일을 저장하는 경로는 UNISON 환경 변수로 지정해 줄 수도 있고, 지정해 주지 않으면 자기계정폴더\.unison에 저장된다.
위 설정에서 192.168.1.101 은 집에서 두 컴을 물리기 위해 사용하는 사설IP인 거고..
학교컴C에서는 집으로 연결하기 위해서 따로 DynDNS 같은 서비스를 이용해서 집에 받은 동적 도메인을 적어준다.
위 프로필에서는 "Desktop.ini"라는 이름의 파일은 동기화하지 않고 무시하게 하고 있는데, 이렇게 무시할 파일들의 이름이나 경로를 직접 프로필에 적어 줄 수도 있지만, 그냥 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 <-- 동기화 성공을 알리는 메시지
근데 사실 이게 전부가 아니라... 위에 프로필에 보면 원격지 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 라는 파일을 만들어서 그 내용을 다음과 같이 적어 준다.
음... 원래는 "이렇게 간단하게 할 수 있다"는 얘기를 하고 싶었는데, 막상 쓰고 나니 정말 복잡해 보인다. 하지만 그럴 만한 가치가 충분히 있다고 생각함. 한 번 이렇게 설치 및 설정을 하고 나니 그 다음부터는 오직 "unison Favorites" "unison Work" 두 명령만 실행하면 즐겨찾기와 내 문서 폴더를 동기화할 수 있고, 세 대의 PC 중 두 대의 PC의 하드디스크가 맛이 가더라도 중요한 내 문서 데이타는 여전히 안전하게 남아 있으며 (물론 가장 최근 동기화한 후에 변경한 내용은 날아가겠지만) 무엇보다도 동기화를 한 덕에 집과 학교를 오가며 작업할 때 파일을 가져왔다 수정하고 다시 돌려놓고 할 때 혼란의 여지가 없어진 것이 정말 편하다. 어느 쪽 컴퓨터에서건 그저 하던 대로 내 문서 폴더 아래에 있는 데이타를 열고 작업하고 저장하면 그걸로 끝.
비슷한 기능을 하는 것으로 rsync 란 게 있는데 이것은 양쪽에서 동시에 수정되었을 때의 충돌 처리를 전혀 해 주지 못하고 무조건 덮어써 버린다. 백업용으로만 좋지 동기화용으로는 꽝. 그 외에 윈도우끼리 동기화할 수 있는 상용 프로그램들도 있는데 (화일동기화페이지 참조) 이놈이고 저놈이고 딱 맘에 드는 게 없어서 결국 처음 설정이 불편하더라도 unison 을 쓰는 지금이 가장 만족스럽다.
2006년 4월 8일 이후.
아무래도 윈도우-리눅스-윈도우 사이에 동기화를 하는 것은 매번 두번씩 동기화를 해야 하기 때문에 불편하여, 집의 윈도우PC와 학교의 윈도우PC 사이에 직접 동기화를 하기로 하였다.
연구실PC(C)에서 unison을 서버 모드로 실행하고, 집PC(A)에서 클라이언트로 실행하기로 한다. SSH 프로토콜을 사용하는 것이 보안상 좋겠는데, 그러려면 C 쪽에서 sshd 데몬이 있어야 하고, 그러자면 다시 cygwin을 설치해야 한다. 상당히 불편한 일이라, 그냥 socket 프로토콜을 쓰기로 했다.
먼저 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
case 2 에서 언급했듯이 윈도우에서 SSH 서버를 띄우고 등등의 작업이 영 불편해서 그냥 socket 프로토콜을 사용하고 있었다. 그런데 얼마 전부터 학교에서 빌어먹을 이상한 방화벽을 운영하는 바람에1 동기화 도중에 특정 파일을 전송할 때 갑자기 학교와 집 사이의 모든 연결이 차단되는 증상이 생길 때가 있다. 파일 내의 바이트 시퀀스가 방화벽에서 차단하는 패턴에 우연하게 맞아떨어지나본데, 이런 경우는 FTP나 HTTP로 전송하는 것도 안 되니 별 수 없이 파일 자체를 zip등으로 압축하거나 해서 변형을 해줘야 한다.
이왕 이리 된 거 아예 동기화를 ssh 프로토콜을 사용하게 해 볼까 싶어서 시도해 보았다. 다행히 성공했다. 문제가 되었던 파일도 잘 전송이 되었다.
학교에 있는 컴퓨터 쪽에서는 SSH 서버가 실행되어야 하는데, [freeSSHd]라는 게 꽤 설치나 사용법도 깔끔하게 띄울 수는 있었는데, 정작 unison하고 궁합이 안 맞는지 동기화 시도를 했을 때 반응을 안 했다. (서버쪽에서도 자동으로 unison을 띄우는 것 까지는 확인했는데 그 후에 진행이 안 됨)
결국 서버와 클라이언트 양쪽 다 Cygwin을 사용하기로 함.
서버와 클라이언트 각각 다음과 같이 해 준다.
Cygwin을 설치할 때 패키지들을 전부 Skip으로 하고 Cygwin 코어 패키지와 OpenSSH 패키지만 선택을 하고 설치를 했다. (실제로는 의존성 때문에 몇 개 패키지가 더 설치된 듯)
HOME환경변수를 추가해준다. 이 변수는 .ssh 디렉토리가 생성될 디렉토리이다.
PATH에 cygwin 이 설치된 디렉토리 아래 bin 디렉토리의 경로를 추가해준다.
다음 서버에서는 다음과 같이 설정한다.
Cygwin을 실행한 후
/etc/defaults/etc/sshd_config 파일을 /etc/ 아래에 복사하고
sshd_config 파일을 열어서 UsePrivilegeSeparation no 설정을 해 준다. (기본값은 yes인데 이러면 에러가 남)
2009. 3. 26. 현재 unison 공식 홈을 통해 받을 수 있는 윈도우용 unison 바이너리의 안정 버전은 2.27.57이다. 테스트해 보니, 기존에 이 페이지에 있던 내용 중 2.17.* 에서 문제가 되었던 부분이 해결되었다. 본문을 그에 따라 수정하고 기존에 작성했던 내용은 보존 차원에서 아래에 남김.
그런데, 위에서 보다시피 리모트 Root에는 "D:"드라이브를 명시하지 않았다. 실제로 명시할 수가 없다.
# 잘못된 예 - 이렇게는 되지 않는다.
root = socket://연구실PC주소.kr:10002//D # 이것은 unison 서버가 실행된 드라이브의 \D 폴더를 의미해버림
root = socket://연구실PC주소.kr:10002//D/Work # 마찬가지로 서버가 실행된 드라이브의 \D\Work 폴더를 의미
root = socket://연구실PC주소.kr:10002/D # 슬래쉬를 하나만 쓰면, unison 서버를 실행할 때의 작업디렉토리 아래의 D폴더를 의미함
root = socket://연구실PC주소.kr:10002/D:\Work # 이렇게 백슬래쉬로 표기할 경우 인식을 하긴 하는데... 첫 동기화 때 서버가 죽어버린다
결국 C컴퓨터에서 unison 서버를 실행할 때, "시작 위치"가 어느 드라이브냐에 따라서 Root가 결정된다. -_-;;; 즉, D:\Work를 동기화하기 위해서는 unison 서버를 D:에서 실행해야 하고, C:\Favorite를 동기화하기 위해서는 C:에서 서버를 실행해야 한다는 얘기다. (unison.exe 바이너리 자체는 어느 드라이브에 있어도 상관없다. 다만 실행할 때 명령프롬프트 창에서라면 "C:" "D:" 등으로 해당 드라이브로 이동한 다음에 그 바이너리를 실행해야 한다는 얘기)
집 쪽에서는 "unison C"와 "unison D"를 하나의 배치파일 안에 넣으면 차례대로 동기화를 할 테니 상관이 없는데, 연구실 쪽에서 서버를 각각 따로 띄워야 하니, 명령 프롬프트 창을 두 개 열어서2, 각각 서로 다른 포트를 사용하도록 unison 서버를 띄우고, 동기화가 끝난 후에는 각각의 창에서 Ctrl+C를 눌러서 종료를 시켜주어야 한다. 이거 매우 불편하다. 게다가 여러 서버 프로세스가 동시에 실행 중이어야 하기 때문에 배치 파일에 차례대로 적어주는 것으로는 안 된다.
일단 썼던 방법은,
각각의 unison 서버를 실행하는 "바로가기"를 만든다. 이름을 "unison서버-C" "unison서버-D" 등으로 짓는다.
실행할 때는 이 바로가기를 각각 더블클릭해서 띄우고, 종료할 때는 각 창에서 Ctrl+C를 눌러 종료
이러면 실행은 그나마 좀 편하게 되지만 종료는 여전히 창마다 각각 해줘야 한다. 여전히 불편하다.
결국 KPUG 만능문답란에서 도움을 받아[1] 해결할 수 있었다. "배치 파일 안에서 바로가기를 실행하도록" 하는 것이 요점.
unison_server.bat 이라는 배치파일을 만들고, 그 안에
unison서버-C.lnk
unison서버-D.lnk
위와 같이 앞에서 만든 바로가기들의 이름을 적어준다.
그리고 나서 이 배치 파일을 실행시키면, 신통하게도 창 하나에 서버 두 개를 연달아 띄운다. 첫번째 서버가 종료되지 않아도 두번째 줄의 바로가기가 바로 실행이 되는 것. 매우 신기하다.
이제 동기화를 마치고, 종료를 할 때는, 저 창 하나에서 Ctrl+C를 한 번만 누르면 두 개의 서버 프로세스가 한꺼번에 죽는다. 이것도 참 신기하다. -_-;
결론적으로,
연구실PC에 원격 데스크탑으로 접속하여, unison_server.bat을 실행시킨다. 이것 역시 바로가기를 만들어 두면 클릭 한 번으로 서버들이 전부 실행된다.
집PC에서 배치파일을 실행하여 각 드라이브를 차례대로 동기화한다.
연구실PC에서 명령프롬프트창에 Ctrl+C를 눌러서 서버들을 종료시킨다.
2009.04.26 내문서 폴더가 4GB정도 되다보니 업데이트 체크가 너무 느려서... 자주 변경하게 되는 폴더의 경우만 따로 프로파일을 만들어서 따로 싱크하고 그랬었다. (일부분만 싱크하고 다시 전체를 싱크하더라도 업데이트 체크에 전혀 문제가 없다는 게 Unison의 장점) 그런데 도큐먼트를 우연히 보니 MS윈도우에서 싱크가 오래 걸리는 문제에 관한 언급이 있더라;;;
내용: #action trackback 파일 동기화를 위한 프로그램이다. === 참고 URL === * [http://www.cis.upenn.edu/~bcpierce/unison/] * [http://gypark.pe.kr/cgi-bin/wiki/wiki.pl?Unison] === 사용 설명 === 처음 실행하면 사용자의 홈 디렉토리에 .unison 디렉토리...