Windows와 Linux/Unix간의 파일 동기화

전정호 (mahajjh@myscan.org)


Copyright (c) 2001 Jeon, Jeongho.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.1
or any later version published by the Free Software Foundation;
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.


나는 홈페이지를 만들때 느린 네트웍 속도 때문에 보통 집에서 작업을 한 후 FTP를 사용하여 웹서버로 옮긴다. 꼭 느린 네트웍이 아니라도 윈도우즈에서만 실행되는 웹저작툴 때문에 윈도우즈에서 작업을 한 후 웹서버로 옮기는 경우도 있을 것이다. 홈페이지가 아니라도 Cygwin에서 C 프로그래밍 작업과 같이 윈도우즈와 유닉스간에 작업한 파일을 동기화하는 경우가 많다.

이 경우 보통 같은 네트웍 안에 있는 경우 SMB나 NFS를, 다른 네트웍에 있는 경우 FTP, rcp, scp, (홈페이지의 경우) WebDav 등을 사용한다. 그러나 SMB나 NFS는 별도의 소프트웨어를 설치해야 하고, 복잡한 설정이 필요하다. FTP는 동기화하려는 파일이 여러개일때 사용하기 어렵고, 매번 작업 파일이 수정될때마다 동기화하기가 불편하다. rcp는 디렉토리 전체를 옮길 수 있지만, 암호와 파일 내용을 네트웍 상에 그냥 보내는 위험이 있다. scp는 전송을 암호화하지만, 수정된 파일만 전송하는 기능이 없다. 물론 CVS를 ssh와 같이 사용하는 방법이 있지만 이 글에서는 다른 방법을 다룬다.

이 글에서는 rsync를 사용한다. rsync는 ssh로 전송을 암호화하고, 수정된 파일의 수정된 부분만 압축해서 전송하므로 네트웍 사용량을 줄인다. 또, rcp, scp와 사용법이 비슷하다.

 

1. 준비

먼저, 클라이언트(Cygwin)와 서버(웹서버) 모두에 rsync가 설치되있어야 한다. Cygwin은 기본적으로 rsync를 설치하므로 서버에 rsync 명령이 있는지 실행하여 확인해봐라.

두번째, 클라이언트와 서버 모두에 ssh가 설치되있고, 서버가 sshd를 실행해야 한다. Cygwin과 대부분의 범용 리눅스 배포본에 기본적으로 설치되있을 것이다. 정상적으로 설치되고 설정되었는지 확인하기위해 Cygwin에서 다음과 같이 검사한다.

$ ssh user_id@my.server.name ls
user_id@my.server.name's password: [계정암호]
...
...
...
$ ssh user_id@my.server.name rsync
user_id@my.server.name's password: [계정암호]
rsync version ...
...
...

아마 처음으로 서버에 연결한다면 서버를 믿을 수 있는지를 물어볼 것이다. yes로 대답하면 된다. 계정암호를 입력한 후 서버의 홈디렉토리 목록이 출력되면 정상이다. 두번째 명령은 rsync가 서버의 실행경로 안에 있는지 확인한다. 도움말이 출력되면 정상이다.


서버에 일반 사용자로 rsync를 설치할때 주의점

만약 서버에 rsync가 설치되있지 않아서 관리자가 아닌 일반 사용자가 rsync를 설치해야 한다면, rsync가 쉘 설정파일을 사용하지 않으므로 프로그램의 경로를 ssh에게 직접 알려줘야 한다. 먼저 다음과 같이 ssh 기본 실행경로를 알아낸다.

$ ssh user_id@my.server.name echo '$PATH'
user_id@my.server.name's password:
/usr/bin:/bin:/usr/sbin:/sbin


만약 rsync가 $HOME/bin에 있다면, ~/.ssh/environment에 다음을 입력한다. 여기서 환경변수($PATH,$HOME) 대신 절대경로를 입력해야 한다.

PATH=/usr/bin:/bin:/usr/sbin:/sbin:/home/mahajjh/bin


 

2. rsync로 동기화

우선 홈페이지(~/public_html)를 윈도우즈로 가져온 후, 수정할때마다 수정한 내용을 서버에 갱신하면 된다.

$ rsync -PCzauve ssh user_id@my.server.name:~/public_html .
user_id@my.server.name's password: [계정암호]
building file list ... done
...
...
...
total size is ...
$ [작업]
$ rsync -PCzauve ssh public_html user_id@my.server.name:~/
user_id@my.server.name's password: [계정암호]
building file list ... done
...
...
...
total size is ...

첫번째 명령은 서버에서 홈페이지 파일들을 가져온다. 그후로는 서버에서 파일을 수정한 경우에 실행한다. 윈도우즈에서만 작업을 한다면 다시 실행할 필요가 없다. 원하는 작업을 한 후 두번째 명령은 수정된 부분을 서버에 갱신한다. 윈도우즈에서 작업을 한 후 이 명령어를 실행하면 된다. 사용한 rsync 옵션은 다음과 같다.

-P (--partial --progress) 이어받기(iso 같이 큰 파일에 유용)와 전송 진행상황 출력
-C (--cvs-exclude) CVS에서 무시하는 파일을 무시. 예, CVS, *~, #*, *.old, *.bak, *.o core
-z (--compress) 전송 내용 압축
-a (--archive) 디렉토리 구조 전체를 파일 속성을 유지한체로 옮김
-u (--update) 나중에 수정된 파일은 유지. (클라이언트와 서버의 시스템 시간 차이가 작다는 가정하에)
-v (--verbose) 전송 상황과 결과 출력
-e (--rsh) 전송방법 선택. 뒤에 아규먼트로 ssh
-n (--dry-run) 실제 파일을 전송하지 않는다. 실제 전송하기 전에 테스트용으로 사용

옵션 뒤에 복사해올 곳과 복사할 곳이 나온다. 여기서 복사해올 곳에 하나 설명할 내용이 있다. 위에서와 같이 경로 뒤에 /가 없으면 디렉토리 자체를 뜻하고, /가 있다면 디렉토리 안의 파일 전체를 뜻한다. 즉, ...:~/public_html ....:~/public_html/ public_html 의 결과는 같다. ... public_html ...:~/... public_html/ ...:~/public_html 도 마찬가지다. 혼동된다면 -n 옵션으로 먼저 테스트해보면 된다.

 

3. 게으른 방법

첫번째로 alias를 지정하여 옵션을 생략한다. ~/.bashrc에,

alias rr='rsync -PCzauve ssh '
alias rt='rsync -PCnauve ssh '
alias rrp='rsync -PCzauve ssh ~/public_html user_id@my.server.name:~/'

일반 전송 명령어를 rr, 일반 테스트 명령어를 rt, 홈페이지 전송 명령어를 rrp로 해봤다.

두번째로 암호를 입력하지 않는 방법이 있다. 매번 암호를 입력하기 귀찮은 것도 사실이지만, 만약 cron 작업으로 rsync를 사용한다면 반드시 필요하다.

...