::: SYSTEM :::/└ ::: LINUX :::

rsync 사용법

호딩이 2007. 1. 10. 17:29

레드햇 리눅스 6 서버 - 파워북 출판사, 번역판중 rdist 관련 자료

man page - rsync(1), rsyncd.conf(5)


0. 들어가며
서버 클러스터링으로 여러대의 서버를 운영하는 경우 각 호스트간의 자료를
공유해야합니다. 공유기법에는 NFS도 있지만 NFS의 경우는 네트웍 트래픽을 무척이나
높이므로 그 대신 rdist나 rsync를 이용할 수 있습니다. 이 글에서는 rsync를
이용하여 각 호스트간의 자료를 동기화하는 방법을 설명합니다.


1. rsync란 무엇인가?
rsync는 rcp와 비슷한 동작을 하는 프로그램으로 rcp보다 더 다양한 옵션이 있고, 더
효율적으로 데이터를 전송합니다. (출발지와 목적지 사이에 다른 부분만을 전송)
파일크기의 변화나 시간의 변화등을 이용 동기화를 합니다.
주요 특징은 다음과 같습니다.

ㅇ 링크, device, 소유자, 그릅, 허가권 복사 지원
ㅇ GNU tar와 비슷한 exclude, exclude-from 옵션 지원
ㅇ rsh 또는 ssh 등 사용가능
ㅇ root 권한이 필요없음
ㅇ anonymous 또는 인증 rsync 서버 지원(미러링에 유용함)

2. rsync 설정
ㅇ 일반적인 배포판의 경우 프로그램이 들어있음. 다음과 같이 확인후 없으면
프로그램 설치
# rpm -qa | grep rsync
rsync-2.3.1-2

ㅇ rsync 2.3.1 이전 버전의 경우 "보안버그"가 있으므로 이전 버전이
설치되어있다면 반드시 "2.3.1 이상 버전으로 업데이트"해야함

ㅇ 동기화에 사용하는 프로토콜 : rsh, ssh를 사용할 수 있음. 이를 사용하지
않더라도 원격 rsync 서버에 TCP 포트 873을 이용 접속할 수 있음. 873 포트를 이용할
경우 inetd.conf 에 추가로 설정을 해야합니다.

rsync stream tcp nowait root /usr/bin/rsync rsyncd --daemon

--daemon은 대몬모드로 시작한다는 이야기이며 /etc/rsyncd.conf파일을 필요로
합니다.

또한 /etc/services 에 다음 내용이 있는지 확인하고 없으면 추가합니다.

rsync 873/tcp # rsync



추가하고 나서는 inetd 대몬을 다시 띄워야겠지요?
# kill -HUP inetd_pid

만약 ssh나 rsh를 사용하는 경우에는 inetd.conf를 수정할 필요가 없습니다.



3. 설정파일 : /etc/rsyncd.conf
예제를 보겠습니다. 다음 예제의 호스트를 www1이라고 하겠습니다.

# cat /etc/rsyncd.conf

[web]
path = /home/www/htdocs
comment = web
uid = nobody
gid = nobody
use chroot = yes
read only = yes
hosts allow = www2.taejun.pe.kr
max connections = 3
timeout 600

[web] 서비스명
path 서비스할 디렉토리
comment 설명
uid 파일전송하는 사용자의 id. 기본값은 nobody
gid 파일전송하는 사용자의 그룹 id. 기본값은 nobody
use chroot 위의 path를 root 디렉토리로 사용. 보안상 필요함.
read only 읽기전용
hosts allow 호스트별 접속허용. 기본값은 all host이므로 보안을 유지하려면 반드시
설정함
max connections 동시접속자수
timeout 클라이언트에서 접근시 타임아웃시간. anonymous 로 운영하는 경우 설정을
해야 클라이언트가 죽었을 때 서버에서 접속을 해체할 수 있음.

* put(클라이언트에서 서버로 올리는 경우)을 사용하기위해서는 read only = no 로
설정을 해야됩니다.

이 외에도 여러 가지 옵션이 있지만 실제로은 위의 옵션정도가 자주 사용됩니다. 현재
rsync 자체적으로 암호화는 지원하지 않으며 사용자 인증만 지원합니다. 추후에는
SSL을 지원할 예정이며, 만약 암호화를 사용하려면 ssh를 사용하면 됩니다.


4. rsync 사용하기
(접근 클라이언트를 www2.taejun.pe.kr이라고 가정함)

rsync -avz --delete www1.taejun.pe.kr::web /home/taejun/~public_html

-a는 아카이브 모드. 심볼릭 링크, 속성, 퍼미션, 소유권 등 보존
-v 상세하게 보여움
-z 전송시 압축을 함.

--delete www1.taejun.pe.kr에서 web에 해당하는 내용(/home/www/htdocs)을
ww2.taejun.pe.kr 의 /home/taejun/~public_html 로 가져오면서 www1(서버)에는 없는
내용은 www2에서 삭제함. 만약 www2 차원에서 생성한 파일을 보관하려면 옵션 없앰.


rsync -avz foo:src/bar /data/tmp
다음 내용은 foo라는 호스트에서 src/bar 안의 내용을 지역호스트의 /data/tmp
디렉토리로 옮기는 것입니다.

여기서 알아두어야 할 것이 있습니다.
만약 위에서 src/bar/ 라고 하면 어떻게 달라질까요? bar 는 그 디렉토리 자체까지
포함해서 가져옵니다. 그렇지만 bar/ 라고 뒤에 디렉토리 표시를 하면 그
디렉토리안에 있는 내용만 가지고 옵니다. 상당히 결과가 달라질 수 있겠지요.

또한 : 과 ::의 차이는 무엇일까요? : 은 rsh나 ssh를 사용하는 것이며 :: 은 rsync
자체에서 지원하는 기능을 이용 자료를 가져오는 것으로 873 TCP 포트를 사용합니다.
상당히 헷갈리지요? : 에서 기본은 rsh를 이용하지만 -e ssh 옵션을 이용하여 ssh를
사용할 수 있습니다. ssh를 사용하려면 비밀번호를 입력해야하는데 이것도 파일형태로
만들어서 옵션에서 지정해주면 됩니다. 이에 대해서는 따로 설명하지는 않으며 man
page를 참고하세요.

-avz 등의 옵션이 있는데 이중 중요한 옵션만 설명을 하겠습니다.

-v verbose (자세하게 보여줌)
-a archive mode

-u update only(새로운 파일을 덮어쓰지 않음)
--delete 서버쪽에 없고 클라이언트쪽에만 있는 파일을 지움
-z compress (전송시 압축을 함)
--daemon 대몬 모드로 운영함 (이건 inetd.conf에 지정할 때 필요함)



-a 는 -rlptg 와 동일합니다.
-r recursive (하위 디렉토리까지 포함)
-l 심볼릭 링크 재생성
-p 퍼미션 업데이트
-t 변경시간 전송 (이것이 없으면 전송한 시간으로 바뀜)
-g 그룹이름 변경

일반적으로 rsync는 길이와 time-stamp를 이용 파일을 비교합니다.

이제 쉘 스크립트를 만들고 cron에 등록을 하여 주기적으로 데이터를 동기화하면
됩니다.



5. 마치며
기본적으로 암호화를 지원하지 않는 것이 아쉽고 약간은 불편합니다. ssh를 쓰는 것도
한가지 대안이지만 비밀번호를 넣어야하고 일일이 넣기 귀찮으면 파일형태로 지정할
수 있는데 이런 방법도 보안문제가 생길 여지가 있겠지요.

위에서 말을 한 대로 예전 패키지에는 보안 버그가 있으니 반드시 최근 패키지로
업데이트를 하는 것! 잊지 마세요.


-------------------------------

rsync설정 기초편입니다.

rsync는 두 호스트사이의 데이터의 동기화를 위해서 사용되는 방법입니다.
서버측과 클라이어트측의 동기화에 많이 사용이 되며 기본적으로는 파일크기의
변화나 시간의 변화로 파일의 변경을 알고 데이타 동가화를 합니다.
즉 변경이 없는 파일은 복사를 하지 안습니다. 그리고 복사하는 도중에 압축
모드를 사용하나봅니다. 무지빨라요 단 io작업이 무지막지해서 로드가 많이
걸립니다.

R2의 경우 rsync는 들어있는데 보안문제로 inetd.conf에는 설정이 없습니다.
따라서 추가적으로 설정을 해부어야 합니다.

rsync stream tcp nowait root /usr/bin/rsync rsyncd --daemon

위와 같은 줄을 추가해주시고
/etc/rc.d/init.d/inet restart
하시면 되고요
다음에
/etc/rsyncd.conf라는 rsync 서버호스트 설정 파일을 편집합니다.
내용 예제는
[web]
path = /home/httpd/htdocs
comment = web
uid = root
gid = root
use chroot = yes
read only = yes
hosts allow = 211.40.179.62 211.40.179.60
max connections = 2
설명
[web] 서비스명 (?)
path 서비스할 디렉토리
comment 설명
uid 접근자에대한 권한 보통은 nobody임
gid 상동 단 그룹
use chroot 서비하는 디렉토리를 루트디렉토리로 사용하는거 보안상
read only 읽기전용 ( rsync 는 get발고 put도 있음 )
hosts allow 호스트별 접속허용
max connections 동시접속
* put을 사용하기위해서는 read only = no 로 설정을 해야됩니다.

클라이언트측 설정

GET
/usr/bin/rsync -av --delete www1.csnet.co.kr::web /home/httpd/htdocs
이러면 다운로드하고 서버에없어진거는 지우고....

PUT
/usr/bin/rsync -av --delete /home/httpd/htdocs www1.csnet.co.kr::web
이러면 업로드됩니다.
아직 다운에서는 uid gid 모두다 유지가 되는데 업로드는 uid는 유지가
되는데 gid는 root로 바뀌는 현상이 있습니다. 잘모르겠습니다.
참 설정에서 read only=no 가 설정되어야 합니다.

서버측 공유명(맨페이지에서는 모듈이라고 하는거 같네요)을 보려면
rsync www1.csnet.co.kr::
만하면 공유명이 나옵니다.

rsync -a www1.csnet.co.kr::web
은 웹이라는 공유폴더의 파일리스트가 표기됩니다.

rsync -av www1.csnet.co.kr::web 으로하면 파일리스트가 현재디렉토리에
list라는 파일로 저장이 됩니다.

-a 아카이브모드
-v 자세한 내용을 보여줌
--delete 서버에서 사라진 파일이 있으면 클라이언트측에서도 지움
기본설정에서는 지우지는 안는다.
www1.csnet.co.kr rsync서버이름
web 서비스명
/home/httpd/htdocs 로컬측 디렉토리

대충 이런식으로 사용을 하면 됩니다.

참고: 다음은 보안 설정을 추가하는 방법입니다
rsync -av --delete -e ssh ~/public_html/ webserver:/home/rwa2/public_html/