삽질하는플머

rsync 가지고 놀기

탐구생활/CYGWIN
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 에 추가한 아이디를 지정해준다. 

auth users = UUU, oranke


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 옵션을 사용한다. 

rsync --port=NNN ....


찾아봐도 없어서 도움을 구합니다...
-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/


ssh 연결시 암호 입력 건너뛰자.

탐구생활/CYGWIN
ssh의 멋진 점은, 내가 원하는 명령을 서버에 전달하고 그 결과값을 받아볼 수 있다는 것이다.
예를 들어 다음과 같은 명령어를 통해

ssh root@192.168.0.151 ps -eaf

현재 서버에서 192.168.0.151 서버에서 구동중인 프로세스 리스트를 살펴볼 수도 있다.
screen과 병행한다면 원격지에서 한 번의 명령으로 많은 서버를 구동 / 정지시킬 수도 있다는 의미!

다만 이 경우 대상 서버의 암호를 입력 해야 한다. 이 부분은 자동화의 적! 따라서 암호없이
ssh 연결을 하는 방법을 알아보자.

다음 사이트에 좋은 정보가 있다. 
http://www.csua.berkeley.edu/~ranga/notes/ssh_nopass.html

간단히 정리 해 보면...

1. 먼저 클라이언트에서 다음 작업을 진행한다.


$ mkdir -p $HOME/.ssh
$ chmod 0700 $HOME/.ssh
$ ssh-keygen -t dsa -f $HOME/.ssh/id_dsa -P ''


한 번이라도 ssh를 사용했더면 $HOME/.ssh 디렉토리가 이미 존재하므로 윗 두 줄은 생략해도 좋다.
이제 .ssh 디렉토리에는 개인키 id_dsa 와 공개키 id_dsa.pub 두 개의 파일이 생겼다.

2. 위에서 생성된 공개키 id_dsa.pub 파일을 서버로 옮겨준다.

3. 서버에서 다음 작업을 진행한다.


$ cat id_dsa.pub >> $HOME/.ssh/authorized_keys2
$ chmod 0600 $HOME/.ssh/authorized_keys2


OpenSSH의 버전에 따라 다음 작업이 추가로 필요할 수도 있다.


$ cat id_dsa.pub >> $HOME/.ssh/authorized_keys
$ chmod 0600 $HOME/.ssh/authorized_keys


또는 심볼릭 링크를 걸어도 좋다.


$ cd $HOME/.ssh && ln -s authorized_keys2 authorized_keys


4. 클라이언트에서 다음과 같이 연결을 테스트 해 본다.


$ ssh -i $HOME/.ssh/id_dsa server



다음 화면은 Cygwin 이 깔린 로컬 컴퓨터에서 ssh로 우분투가 깔린 컴퓨터에 접속해 ls -al 를 날리고 그 결과를
받아오는 화면이다.






발급된 개인키를 사용해 PuTTY로 로컬호스트에 패스워드 없이 접속해보자. 
PuTTY Key generator 를 실행시킨다. 




Load 버튼을 눌러 위에서 만들어둔 개인키 id_dsa 를 불러들인다. 성공적으로 불리웠다는 메시지가 나오면 이번에는 'Save private key' 버튼을 눌러 *.ppk 형식으로 저장한다. 이 때 패스워드를 입력하지 않으면 경고가 뜨는데 지금 목적은 패스워드 없이 접속하는 것이므로 무시하자. 

PuTTY Config 에서 새로운 세션을 만들고 SSH - Auth 항목의 'Private key file for authentication' 에 방금 생성한 PPK 파일을 지정해준다. 

로컬호스트가 PuTTY에서 지정된 개인키를 인식할 수 있도록 해주어야 한다. 

$ cd ~/.ssh
$ cat id_dsa.pub >> authorized_keys2
$ ln -s authorized_keys2 authorized_keys


이제 접속해보면 암호를 묻지 않고 바로 들어갈 수 있게 된다. 




이 다음에 살펴볼 PuTTY_Cyg 를 사용하면 간단하지만, 그래도 로컬이 아닌 다른 접속에 유용한 내용이므로 정리 해 둔다. 





윈도 2003 서버에서 CygWin의 SSHD 동작시키기

탐구생활/CYGWIN
대부분 XP에서의 설치와 비슷하다.
그러나 설치 후 ssh -v localhost 로 접속을 테스트 해 보면 키교환이 안되고 멈추는 현상이 나타난다.

이 문제 때문에 공개용 OpenSSH부터 상용 WinSSHD까지 별별 삽질을 다 해 봤는데...
결국은 미국에서 돌아온 멋쟁이 정팀장님이 문제를 해결 해 버렸다.

설치 후 /etc/hosts.allow 파일을 열고

ALL : PARANOID : deny

이 부분을 주석처리 한 후 sshd를 재구동시킨다.

만세! 만세! 만만세!!!

OpenSSH설치. sshd 구동.

탐구생활/CYGWIN

Cygwin 자체는 내 컴퓨터에서 돌아가는 로컬환경이지만,
아무래도 콘솔창이라는 한계 때문에 복사/붙이기에 에로사항이 피어나고
컬럼 수 또한 제한을 받게 된다.

또한 서버 관리를 콘솔 앞에 앉아서 하는 경우는 거의 없다.
리눅스 깔 때도 OpenSSH 서버도 함께 설치하고 네트웍 설정만 마무리 한 다음
자리로 돌아와 PuTTY를 띄우게 된다.

따라서 비록 로컬환경이지만 sshd 를 구동시켜 PuTTY로 접속할 수 있다면
여러가지로 편리 할 것이다.

구글에서 cygwin, sshd 로 검색하자 다음 떡밥이 걸려든다.
http://pigtail.net/LRP/printsrv/cygwin-sshd.html 

1. setup.exe 를 실행시켜 openssh, tcp_wrappers, diffutils, zlib 를 설치한다.
 자동으로 따라붙는 패키지들도 함께 설치되도록 한다.

사용자 삽입 이미지


2. 제어판 -> 시스템 -> 고급 -> 환경변수 를 선택, CYGWIN 변수에 ntsec tty 값을 추가한다.

사용자 삽입 이미지


3. 환경변수 "Path" 뒷부분에 ";c:\cygwin\bin" 를 붙여준다.


4. 최근에 릴리즈 된 Cygwin 의 경우 권한 관련 문제가 발생할 수 있으므로 다음 세 줄의 명령어를 입력 해 준다.

  chmod +r  /etc/passwd
  chmod +r  /etc/group
  chmod  777  /var


5. ssh-host-config  -y 명령을 실행, 모든 질문에 yes 로 답변하도록 한다.
  중간에 스크립트가 실행되면서 "environment variable CYGWIN=" 이라고 묻는다면
  "ntsec tty" 라고 답변한다. (시연을 위해 다시 따라해보니... 이번에는 안물어보는군... 흠...)


6. 여기까지 해서 시작 -> 실행 에서 "services.msc" 를 입력, CYGWIN sshd 가 보인다면 제대로 된 것이다.
  이 서비스를 시작하거나 다음 명령을 입력한다.

  cygrunsrv --start sshd
    또는
  net start sshd


7. 윈도의 각 유저에 암호를 걸어준다.


8. 이제 PuTTY로 접속 해 보자.

사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지

  이제 넓직한 화면에서 Cygwin을 사용할 수 있다... ^^;;


프롬프트 변경. ls 의 색깔 변경.

탐구생활/CYGWIN

Cygwin 이 멋진 건 대부분의 리눅스 프로그램들이 동작한다는 것이고
어지간한 윈도 프로그램또한 이 환경에서 돌아간다는 점이다.
아무튼 삽을 들고 하나씩 파해쳐보자.

오래 전 도스시절 제일 만만한 명령어가 "dir" 이었다.
Cygwin 도 마찬가지. 만만한 "ls" 를 입력 해 보자.

사용자 삽입 이미지

흐음... 뭔가 어색하고 안예쁘다.
먼저 저 닝닝한 프롬프트부터 바꿔보자.

만만한 편집기 nano 를 이미 설치 했으니 다음과 같이 입력하고

  nano ~/.bashrc

제일 끝 부분에 다음 줄을 추가한다.

  PS1="[\u@\h \W]\\$ "

저장 후 Cygwin을 다시 띄워보면 다음과 같이 이쁘게 변경된 프롬프트를 만날 수 있다.

사용자 삽입 이미지

하는 김에 ls 시에 표시되는 디렉토리 색깔도 좀 바꿔보자. 마찬가지로 ~/.bashrc 내에 다음 줄을 추가한다.

  alias ls="ls --color=auto"

사용자 삽입 이미지

그런데, 한글 디렉토리가 표시되지 않는다. 한글 입력도 안된다.
조금 전 ls 의 alias를 다음과 같이 바꿔주고

  alias ls="ls --color=auto --show-control-chars"

~/.inputrc 파일에 다음 줄을 추가 해 준다.

  set convert-meta Off
  set output-meta On

이제 Cygwin 을 다시 띄워보면 한글 입출력이 제대로 되는 것을 볼 수 있다.

사용자 삽입 이미지