rsync 는 로컬, 또는 리모트의 파일들을 동기화하는 멋진 물건이다.
미루어두었던 cygwin 상에서 rsync 삽질내용을 정리하자.
한동안 cygwin 을 돌리지 않았더니 버전이 2.697 -> 2.721 로 올라가버림. 업데이트에 한세월이 걸리네...
rsync는 rsync --daemon 옵션을 통해 데몬으로 동작시킬 수 있다.
rsync --daemon --configure=rsyncd.conf
rsyncd.conf 에 지정된 PID파일에는 rync 데몬의 PID가 기록된다. 종료시에는 이 값을 참고하면 된다.
매번 이 작업이 싫다면 cygrunsvc 를 이용해 서비스로 등록하면 될 듯.
고맙게도 rsync를 이용한 백업방법을 깔끔하게 정리해둔 곳이 있다. 소스포지에 적절한 구성예제도 있고 말이지...
이걸 함 따라해보자.
먼저 소스포지에서 cygwin-rsyncd-2.6.8_0.zip 을 내려받아 압축을 푼다. 이 파일은 cygwin 에서 rsync 데몬구동에 필요한 요소만 추려낸 것이다. (나중에 sshd 구성요소를 독립시켜 쓰는데도 많은 참고가 될 듯 하다.)
압축이 풀린 파일들 중 다음 파일들을 C:\cygwin\etc\rsyncd-conf 에 옮긴다.
rsyncd.conf
rsyncd.secrets
Rreadme.txt - 별 필요없지만...
rsyncd.secrets 파일을 열고 적절한 사용자명과 패스워드를 설정한다. 여기서는 oranke:1234 마지막 한 줄은 비워야 한다.
# Also: make sure this file ends in a newline. Otherwise the last
# username/password pair will be ignored.
#
UUU:PPP
oranke:1234
rsyncd.conf 파일을 열고 경로명을 제대로 맞춰준다.
# Uncomment this line and change the path if
# you would like to log rsync messages.
#
# log file = c:/cygwin/etc/rsyncd-conf/rsyncd.log
#
# The location of the rsync process ID file
#
# 서비스 구동시 재부팅하면 pid 파일이 남아있게 된다.
# pid 파일이 있으면 데몬이 실행되지 않으므로 이 부분도 주석처리 한다.
# pid file = c:/cygwin/etc/rsyncd-conf/rsyncd.pid
#
# The locations of the rsync lock file
#
lock file = c:/cygwin/etc/rsyncd-conf/rsyncd.lock
auth users 섹션을 찾아 secrets 에 추가한 아이디를 지정해준다.
secrets file 역시 수정된 경로로 맞추어준다.
secrets file = c:/cygwin/etc/rsyncd-conf/rsyncd.secrets
이 곳에 접속할 rsync 클라이언트의 아이피를 제한하려면 hosts allow 섹션의 주석을 털어주고 적절한 아이피를 설정한다.
# hosts allow = 172.16.0.17
기본적으로 이 설정파일은 'C:\Documents and Settings' 폴더를 백업하는 방식이다. 여기서는 테스트를 위해 이 설정을 'C:\SyncWork-Test' 로 변경한다. (여기까지 작업된 파일은 백업하고 수정하는 편이 좋겠군.)
주의 ! 여기서 path 값은 cygpath 로 지정해야 한다.
[SyncWork-Test]
# path = c:/SyncWork-Test
path = /cygdrive/c/SyncWork-Test
comment = Sync work test
strict modes = false
auth users = UUU, oranke
secrets file = c:/cygwin/etc/rsyncd-conf/rsyncd.secrets
# hosts allow = 172.16.0.17
# 서버로 파일전송이 가능하게 하려면 read only = false 로 할 것.
# 현재는 가져가는 용도로 설정하고 있으므로 true 로 되어있음.
read only = true
list = false
rsyncd.secrets 파일의 속성을 '읽기 전용' 으로 변경한다. 우클릭 후 읽기전용 체크로 간단히 해결.
또는 이렇게
chmod 600 rsyncd.secrets
이제 대강 준비는 완료. 남은 것은 rsyncd 를 서비스로 동작시켜야 한다. cygrunsrv 를 쓰면 되는데... 아까 받아둔 zip 에 예제가 있다.
cygrunsrv.exe -I rsyncd -e CYGWIN=nontsec -p c:/cygwin/bin/rsync.exe -a "--config=c:/cygwin/etc/rsyncd-conf/rsyncd.conf --daemon --no-detach"
예전 sshd 처럼 서비스 표시이름이 CYGWIN rsyncd 로 보이게 하려면 -d 또는 --disp 옵션을 추가한다.
cygrunsrv.exe -I rsyncd -d "CYGWIN rsyncd" -e CYGWIN=nontsec -p c:/cygwin/bin/rsync.exe -a "--config=c:/cygwin/etc/rsyncd-conf/rsyncd.conf --daemon --no-detach"
경로명을 cygpath 로 쓰라는 경고가 나오긴 하지만 무시해도 괜찮음. 신경쓰인다면 -p 옵션 뒤의 rsync.exe 경로를 /bin/rsync.exe 로 바꿔줄 것.
시작 -> 실행 에서 services.msc 를 입력 후 "CYGWIN rsyncd" 가 제대로 표시된다면 제대로 따라온 것임.
마지막으로 방화벽에서 ryncd 가 사용할 873번 포트를 열어주자.
Name: rsyncd
Port number: 873
Type: TCP
또는 cygwin-rsyncd-2.6.8_0.zip 내의 배치파일에 쓰인 netsh 명령어를 사용할 수 있다.
netsh firewall set portopening protocol = TCP port = 873 name = rsyncd mode = enable scope = CUSTOM addresses = LocalSubnet
모든 준비가 끝났으면 다음 명령어로 이 rsyncd 서비스를 시작해본다.
cygrunsrv --start rsyncd
또는
net start rsyncd
telnet localhost 873 명령을 내려보면 rsyncd 가 제대로 동작하는지 확인할 수 있다. 또한 c:\cygwin\etc\rsyncd-conf 폴더에는 rsyncd.pid 파일이 생성되며 이 파일의 내용을 열어보면 ps -eaf | grep rsync 로 출력되는 rsyncd 의 PID와 일치한다. 앞에서도 언급했듯이 데몬 종료는 이 프로세스를 Kill로 죽이면 되지만... 지금은 서비스로 구동시키고 있으므로 참고만 하자.
이제 rsyncd 의 파일을 임의 폴더에 동기화시켜보자.
아까 설정해 둔 'C:\SyncWork-Test' 폴더에 적당한 파일들을 넣어둔다.
그리고 임의 폴더로 이동한 뒤 다음과 같은 명령어를 내려보자. (-a 는 아카이브, -v 는 목록표시 옵션이다.)
$ rsync -av oranke@localhost::SyncWork-Test
Password:
receiving incremental file list
drwx------ 0 2010/10/27 16:37:10 .
-rwx------ 863778 2010/10/27 16:12:22 aaa.bmp
-rwx------ 7037 2010/10/27 16:12:26 aaa.png
-rwx------ 2884 2005/11/25 02:54:51 curl_stack.h
-rwx------ 196360 2006/06/22 21:40:25 curl_stack.o
-rwx------ 5112 2006/06/22 21:39:25 main.cc
-rwx------ 443728 2006/06/22 21:40:27 main.o
sent 65 bytes received 203 bytes 107.20 bytes/sec
total size is 1518899 speedup is 5667.53
싱크를 위해 올려둔 파일의 목록이 잘 출력되는 것을 볼 수 있다.
뒷부분에 받을 경로를 지정함으로서 실제로 파일을 전송받을 수 있다. 다음과 같이 명령어를 바꿔보자.
$ rsync -avz --delete oranke@localhost::SyncWork-Test ./
Password:
receiving incremental file list
./
aaa.bmp
aaa.png
curl_stack.h
curl_stack.o
main.cc
main.o
sent 182 bytes received 153356 bytes 43868.00 bytes/sec
total size is 1518899 speedup is 9.89
잘 전송된다. 처음 실행했을 때와 옵션을 조금 바꾸어주었는데, -z 는 전송시 정보를 압축, --delete 는 서버에서 지워진 파일을 여기서도 지우라는 옵션이다. 제대로 잘 지워지는지 C:\SyncWork-Test 폴더에서 임의의 파일을 삭제하고 다시 저 명령을 내려보자.
$ rsync -avz --delete oranke@localhost::SyncWork-Test ./
Password:
receiving incremental file list
deleting main.cc
./
sent 68 bytes received 194 bytes 104.80 bytes/sec
total size is 1513787 speedup is 5777.81
일단 이정도의 기능만으로도 충분히 증분백업 환경 구축이 가능할 듯 싶은데... 나머지는 차차 뒤져보자구.
* rsyncd.conf 의 auth users, secrets files 항목을 주석처리하면 암호입력 없이 접근할 수 있다.
rsync -avz --delete localhost::SyncWork-Test ./
또한 접속시 콜론을 한개만 사용하면, 접속에 rsh 를 사용하게 된다.
rsync -avz --delete localhost:SyncWork-Test
oranke_f@localhost's password:
receiving incremental file list
rsync: link_stat "/home/oranke_f/SyncWork-Test" failed: No such file or directory (2)
sent 8 bytes received 12 bytes 3.08 bytes/sec
total size is 0 speedup is 0.00
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at /home/lapo/packaging/rsync-3.0.7-1/src/rsync-3.0.7/main.c(1508) [Receiver=3.0.7]
에러난 화면이지만 자세히보면 rsync 는 localhost 의 oranke_f 계정의 SyncWork-Test 디렉토리를 찾게 된다. oranke_f 가 지정된 것은 현재 작업중인 세션의 로그온 유저이기 때문이다. 따라서 다음과 같은 방식으로
$ rsync -avz --delete user@localhost:Some-Dir ./
특정 유저의 디렉토리를 동기화 할 수도 있다. (SomeDir 에 ./ 를 넣어봐도 재밌다.)
역으로 이런 처리도 가능.
$ rsync -avz ./ oranke_f@localhost:test
oranke_f@localhost's password:
sending incremental file list
./
1232612189_IMG_0861.jpg
1271342789_QUvpyA8N_EAB7B8EB94B4EAB1B4.jpg
1282266251_fVObgSNQ_bman.png
200308187.jpg
20060912k_2.gif
83221693.jpg
sent 1788868 bytes received 129 bytes 511142.00 bytes/sec
total size is 1787778 speedup is 1.00
localhost 의 oranke_f 홈의 test 디렉토리로 현재 디렉토리의 파일을 전송하는 예이다.
단순히 rsyncd 데몬만 띄운 상태로 rsh 가 결합되니 참 유용해지는군. ssh를 쓰고 키교환을 미리 해두면 말 그대로 끝내주겠는걸~~
(잘 이해가 안되는건... 현재 테스트중인 PC에 rsh 데몬따위는 없는데... ssh가 기본으로 돌아버리는데... 신기함... )
중간에 몇가지 주의해야 할 부분이 있기는 하지만 ssh를 사용하는 참고자료. -e ssh 옵션이 눈에 띈다.
rsyncd 가 사용하는 포트변경은 리눅스의 경우 xinetd 에서 할 수 있다.
cygwin 은 잘 모르겠네...
아무튼 변경된 포트로 접속할 때는 --port 옵션을 사용한다.
찾아봐도 없어서 도움을 구합니다...
-e ssh -p 5000 .. 이런 씩으로 하면 작동이 안돼네요
==> rsync으로 백업하고자 할경우에 ssh보안 프로토콜의 사용자 정의 포트 (예: 5000)로
연결하여 백업하고 자 할경우 아래와 같이 --rsh 옵션을 활용하시기 바랍니다.
#> rsync -av --progress --inplace --rsh='ssh -p5000' somefile user@host:somedir/ [엔터]
rsync 를 이용하여 윈도우즈 백업하기 Mini-HOWTO
시간날 때 cygwin 에서 rsync, sshd 에 필요한 요소만 추려서 설치할 수 있는 방법도 고민해보자.
윈도에서 쓰기 좋게 패키징된 물건
http://sourceforge.net/projects/backuppc/files/cygwin-rsyncd/
http://backuppc.sourceforge.net/