OS/Linux

RSYNC

엔지니어1 2024. 3. 21. 13:53

rsync 설정 및 사용하는 방법

rsync는 파일 전송 및 동기화 툴 입니다. 네트워크를 통한 데이터 전송 시 변경된 부분만을 전송이 가능하고

이를 활용하여 백업자료를 동기화 시키는데 자주 사용합니다.

rsync는 로컬과 원격 양측 모두 사용 가능하며, 다양한 옵션을 제공하여 전송을 세밀하게 제어할 수 있습니다.

이번 게시글에는 해당 도구를 사용하여 ssh를 통한 사용법과, rsync의 873포트를 사용한 통신을 해보겠습니다.

 

준비된 OS는 centos 7, ubuntu 22.04, rocky 8을 사용하겠습니다.

테스트를 목적으로 하기 때문에 모두 root 계정을 사용하였고,

linux 내부(iptables, hosts.allow, hosts.deny) 이외의 모든 방화벽은 설정 되어있지 않습니다.

 

1) ssh를 통한 전송

기본적으로 rocky 8, centos 7, unbuntu 22.04에 직접 확인한 바로 rsync가 전부 설치되어 있었습니다.

하지만 같은 os라도 환경은 다를 수 있기때문에 설치 방법도 알아보겠습니다.

 

2) 설치

rocky 8, centos 7

$ sudo ymu install -y rsync

 

ubuntu

$ sudo apt install -y rsync

 

3) 기본 사용법

rsync의 기본 사용법은 아주 간단합니다.

rsync [옵션] 소스 목적지

입니다.

rsync는 로컬에서 로컬로도 사용 가능하고

소스와 목적지에 동기화 할 파일이나 디렉토리의 위치를 지정해주면 됩니다,

 

4) 주요 옵션

옵션 설명
-v 자세한 출력 모드를 활성화 합니다.
-a 아카이브 모드를 사용하여, 대부분의 파일 속성을 보존하며 동기화 합니다.
(권한, 심볼릭 링크, 파일 시간 등)
-z 데이터 전송 시 압축을 사용합니다.
-r 디렉터리를 재귀적으로 동기화 합니다.
--delete 목적지에서 소스에 없는 파일을 삭제합니다.
(동기화 작업에 유용)
-o 소유권을 보존합니다.
-g 그룹 소유권을 보존합니다.
-P 권한을 보존합니다.
-e 원격 쉘을 사용하여 데이터를 전송합니다.
--progress 전송하는 파일의 진행 상태를 표시합니다.
--exclude 특정 파일이나 디렉터리를 전송에서 제외합니다.

 

5)사용 실습

로컬에서 파일 동기화 하기

$ rsync -av /path/source /path/destination

/path/source 디렉터리의 내용을 /path/destination으로 동기화합니다.

 

원격 서버로 파일 전송하기

$ rsync -av /path/source [user]@[remote_host]:/path/destination

원격 호스트(remote_host:ip)의 user에 디렉터리를 동기화합니다.

 

원격 서버에서 로컬로 파일 가져오기

$ rsync -av [user]@[remote_host]:/path/source /path/destination

원격 서버의 source 디렉터리를 destination으로 동기화합니다.

 

특정 파일이나 디렉터리 제외하기

$ rsync -av --exclude '[pattern_to_exclude]' /path/source [user]@[remote_host]:/path/destination

[pattern_to_exclude]에 해당하는 파일이나 디렉터리를 제외헙니다.

 

6) 873 포트로 통신

앞에 했던 방법은 ssh(22 port)를 사용하여 동기화하는 방식이었습니다.

$ netstat

을 활용하여 보시면 873포트가 보이지 않을겁니다.

873포트를 사용하기 위해서는 rsync를 데몬으로 실행시켜 사용해야 합니다.

 

6-1) rocky 8, centos 7, ububtu 22.04에 데몬 설치

데몬을 실행시키기 이전에 먼저 데몬의 환경설정 부터 해야합니다.

$ sudo vi /etc/rsyncd.conf

# 내용 삽입
[name] # rsync 서버 이름
comment = comment # rsync 서버 설명
path = /home/backup
uid = root
gid = root
use chroot = yes
read only = yes
hosts allow = <ip 또는 CIDR>
max connection = 10
timeout = 300

이제 데몬을 실행합니다.

데몬을 실행시키기 위해 xinetd를 사용하며, 설치방법은

$ sudo yum install -y xinetd

입니다.

 

6-2) config

이제 xinetd의 설정 파일을 생성합니다.

$ sudo vi /etc/xinetd.d/rsync

# 내용 삽입
service rsync
{
        disable = no
        flags           = IPv6
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/bin/rsync
        server_args     = --daemon
        log_on_failure  += USERID
}

 

6-3) 실행

설정을 하고 이제 데몬을 실행합니다.

$ sudo systemctl restart xinetd

데몬 실행이 정상적으로 작동하는지 확인합니다.

$ netstat -nltp

873포트 LISTEN 중

 

만약 iptables를 사용하신다면 873포트를 열어줍니다.

$ iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 873 -j ACCEPT # 입력
$ iptables -nL # 확인

master서버의 rsync 서비스와 comment 확인합니다.

$ rsync <ip>:: # 콜론 (':') 2개가 맞습니다!

 

 

6-4) 테스트

테스트를 진행합니다.

$ rsync -avzr --delete <yours ip>::rocky8 ./test

 

config에 path설정을 test디렉터리를 하였기 때문에 소스 경로를 지정해주지 않아도 됩니다.

 

**

systemctl을 쓰지않고 xinetd를 사용하는 이유

systemctl로 데몬을 관리하면 사용하지 않고 있어도 자동으로 실행되기 때문입니다.

그렇기 때문에 메모리를 차지하여 서버에 부하를 주지만

xinetd를 사용하면 슈퍼 데몬에 의해 관리되어 시스템에 대기하다 클라이언트에서 요청이 들어오면 서비스를 실행하여 제공합니다.

그래서 보통 telnet과 ftp같은 사용 빈도가 낮은 서비스들이 사용합니다.

 

이상 rsync에 대해 알아봤습니다! 감사합니다.