[Ubuntu] rsync 사용법 - 파일 전송과 백업 서버 설정
서버를 운영하다 보면 파일을 다른 디렉터리에 복사하거나 다른 서버로 옮길 일이 생깁니다. 매번 전체 파일을 다시 복사할 수도 있지만, 파일이 많아질수록 시간과 전송량이 부담됩니다. 이런 작업에 사용하는 명령어가 rsync 입니다.
rsync는 기본적으로 파일의 크기와 수정 시간을 비교해 전송할 파일을 고릅니다. 필요한 경우 변경된 데이터만 전송하는 방식도 사용합니다. 로컬 복사와 서버 간 전송에 모두 쓸 수 있어 백업이나 파일 동기화 작업에 자주 사용됩니다.
먼저 구분할 점이 있습니다. 로컬 복사나 SSH 전송에는 rsync 데몬 설정이 필요하지 않습니다. 대부분의 서버 간 백업은 SSH만으로 구성할 수 있습니다. 글 마지막의 rsyncd.conf는 서버::모듈 형식의 데몬 서비스를 직접 운영할 때만 사용하는 선택 사항입니다.
rsync 설치와 주요 옵션
Ubuntu에서는 apt로 설치할 수 있습니다. 설치 후 버전을 확인합니다.
sudo apt update
sudo apt install rsync
rsync --version기본 문법은 rsync [옵션] [원본] [대상]입니다.
아래 표에서는 파일 속성을 보존하는 -a, 진행 내용을 출력하는 -v, 용량을 보기 쉽게 표시하는 -h를 주로 사용합니다.
옵션 | 설명 |
|---|---|
-a | 권한, 수정 시간, 심볼릭 링크 등 기본 속성 보존 |
-v | 전송되는 내용을 자세하게 출력 |
-h | 파일 크기 등을 읽기 쉬운 단위로 표시 |
-P | 전송 진행률 표시 및 중단된 파일의 부분 데이터 보존 |
-z | 전송 데이터 압축 |
-n, --dry-run | 파일을 변경하지 않고 실행 예정 작업 확인 |
--delete | 원본에 없는 파일을 대상에서 삭제 |
--exclude | 지정한 파일이나 디렉터리 제외 |
-e | SSH 포트 등 원격 셸 실행 옵션 지정 |
-a만으로 모든 파일 속성이 보존되는 것은 아닙니다. 하드 링크, ACL, 확장 속성까지 필요하다면 -H, -A, -X를 별도로 검토해야 합니다. 파일 소유권은 명령을 실행하는 계정의 권한에 따라서도 달라집니다.
-z도 항상 필요한 옵션은 아닙니다. 동영상이나 압축 파일처럼 이미 압축된 데이터가 많다면 전송량 감소 효과가 크지 않을 수 있습니다. - [rsync 공식 매뉴얼]
로컬 디렉터리 복사: 마지막 /의 차이
rsync 명령을 처음 사용할 때 특히 주의할 부분이 원본 경로 끝의 /입니다. 아래 명령은 /data와 /backup 디렉터리가 이미 있다고 가정한 비교 예제입니다. 두 명령을 순서대로 실행하는 것이 아니라 필요한 형태를 선택합니다.
# data 디렉터리 자체를 복사
rsync -avh /data /backup/
# data 디렉터리 안의 파일과 하위 디렉터리를 복사
rsync -avh /data/ /backup/첫 번째는 /backup/data/에 복사합니다. 반면 두 번째는 /data/ 안의 내용이 /backup/ 바로 아래에 들어갑니다. 원본에 report.txt가 있다면 결과는 각각 /backup/data/report.txt, /backup/report.txt입니다.
대상에 data라는 디렉터리를 만들고 내용만 넣고 싶다면 rsync -avh /data/ /backup/data/처럼 대상 경로를 지정할 수도 있습니다. 경로가 한 글자만 달라도 파일이 저장되는 위치가 바뀌므로, 실제 백업에 사용하기 전에 이 차이를 확인해 두는 편이 좋습니다.
SSH로 다른 서버에 전송하기
다른 Linux 서버로 파일을 보내거나 가져올 때는 SSH 방식이 간단합니다. 두 서버에 rsync가 설치되어 있어야 하고, SSH 계정에 해당 경로를 읽고 쓸 권한이 있어야 합니다.
다음 세 명령은 전송 방향과 SSH 포트에 따른 예제입니다. user, 서버 주소, 디렉터리는 실제 환경에 맞게 바꿔 사용합니다.
# 현재 서버 → 원격 서버
rsync -avhP /data/ user@192.168.0.10:/backup/data/
# 원격 서버 → 현재 서버
rsync -avhP user@192.168.0.10:/data/ /backup/data/
# SSH 포트가 2222인 서버로 전송
rsync -avhP -e 'ssh -p 2222' /data/ user@192.168.0.10:/backup/data/user@192.168.0.10:이 대상에 있으면 파일을 보내고, 원본에 있으면 가져옵니다. 주소 뒤에 콜론 하나(:)를 쓰는 위 방식은 SSH를 통해 원격 서버의 rsync 프로그램을 실행합니다. rsyncd.conf를 작성하거나 TCP 873번 포트를 열 필요가 없습니다.
연결이 되지 않으면 먼저 SSH 접속부터 확인합니다.
ssh user@192.168.0.10SSH 접속에는 문제가 없는데 전송만 실패한다면 원격 서버의 rsync 설치 여부와 디렉터리 권한, 대상 경로를 차례로 살펴봅니다.
특정 파일이나 디렉터리 제외하기
백업할 때 로그나 캐시까지 전부 옮길 필요가 없다면 --exclude를 사용합니다. 여러 항목을 제외할 때는 옵션을 반복해서 지정하면 됩니다.
rsync -avhP --exclude='*.log' --exclude='tmp/' /data/ user@192.168.0.10:/backup/data/위 명령은 .log 파일과 tmp 디렉터리를 제외합니다. 하위 디렉터리에도 같은 이름이 있다면 제외 대상이 될 수 있으므로, 특정 경로만 빼려는 경우에는 패턴을 더 구체적으로 작성해야 합니다.
전송 대상이 의도대로 잡히는지 궁금하다면 실제 작업 전에 -n을 추가해 확인할 수 있습니다.
--delete로 동기화할 때 주의할 점
단순 복사와 동기화는 다릅니다. --delete는 원본에 없는 파일을 대상에서도 삭제합니다. 대상 디렉터리에만 보관한 자료가 있더라도 같은 전송 범위에 들어 있다면 삭제될 수 있습니다.
특히 원본이 별도 디스크에 마운트되어 있다면 마운트 상태를 먼저 확인해야 합니다. 디스크가 연결되지 않아 원본 디렉터리가 비어 보이는 상황에서 --delete를 실행하면 대상 파일까지 삭제할 수 있습니다.
먼저 -n으로 변경될 내용을 확인합니다.
rsync -avhn --delete --itemize-changes /data/ /backup/data/출력에서 *deleting으로 표시되는 파일을 비롯해 변경 목록을 살펴봅니다. 예상하지 못한 삭제가 보이면 실제 동기화를 실행하지 말아야 합니다. 결과를 확인한 뒤 필요한 경우에만 -n을 빼고 실행합니다.
rsync -avh --delete --itemize-changes /data/ /backup/data/이 방식은 원본을 기준으로 대상 상태를 맞추는 작업입니다. 잘못 수정하거나 삭제한 내용도 대상에 반영되므로 이전 시점으로 돌아갈 수 있는 백업과는 다릅니다. 과거 파일을 복구해야 한다면 별도의 보관본이나 스냅샷을 준비해야 합니다.
선택 사항: rsync 데몬 서버 구성
여기부터는 SSH 전송과 별개의 설정입니다. 여러 클라이언트가 backup 같은 모듈 이름으로 접속하도록 서버를 운영하려면 rsync 데몬을 사용할 수 있습니다. 접속 주소는 서버::모듈 형태이며 기본 포트는 TCP 873번입니다.
데몬에 직접 접속하는 일반적인 방식은 SSH처럼 전송 내용을 암호화하지 않습니다. 따라서 아래 구성은 접근이 제한된 내부 네트워크의 예제로만 보고, 외부 구간에서 전송할 때는 SSH나 암호화된 터널을 우선 고려합니다.
저장 디렉터리와 전용 계정
백업을 받는 서버에서 사용할 계정과 디렉터리를 만듭니다. 이미 같은 계정이 있다면 그대로 만들지 말고 기존 용도를 먼저 확인합니다.
sudo adduser --system --group --no-create-home rsync
sudo mkdir -p /srv/rsync/backup
sudo chown rsync:rsync /srv/rsync/backup여기서는 저장 디렉터리 자체의 소유권만 변경합니다. 기존 파일이 들어 있는 경로라면 하위 데이터의 소유권을 일괄 변경하지 않도록 주의합니다.
rsyncd.conf에 모듈 등록
/etc/rsyncd.conf를 열어 다음과 같이 설정합니다.
vim /etc/rsyncd.conf
uid = rsync
gid = rsync
use chroot = yes
max connections = 4
log file = /var/log/rsyncd.log
[backup]
path = /srv/rsync/backup
comment = Backup Storage
read only = no
auth users = backup
secrets file = /etc/rsyncd.secrets
hosts allow = 192.168.0.0/24
hosts deny = *[backup]은 클라이언트가 접속할 모듈 이름이고, path는 실제 파일이 저장되는 디렉터리입니다. read only = no는 해당 모듈에 쓰기를 허용한다는 뜻입니다. hosts allow와 방화벽 규칙에는 실제로 접속할 클라이언트 대역만 넣어야 합니다.
uid = rsync는 파일에 접근할 때 사용하는 Linux 계정입니다. 반면 auth users = backup은 rsync 데몬에서 인증할 사용자 이름으로, 두 계정은 서로 다른 역할을 합니다. - [rsyncd.conf 공식 매뉴얼]
인증 파일 만들기
서버의 /etc/rsyncd.secrets에 모듈 인증 정보를 저장합니다. 다음 비밀번호는 형식 설명용이므로 그대로 사용하지 않습니다.
vim /etc/rsyncd.secrets
backup:여기에_비밀번호_입력인증 파일은 다른 계정에서 읽을 수 없도록 권한을 제한합니다.
sudo chown root:root /etc/rsyncd.secrets
sudo chmod 600 /etc/rsyncd.secrets클라이언트는 데몬 모듈에 접속할 때 이 사용자 이름과 비밀번호로 인증합니다. 앞의 SSH 계정이나 로그인 암호를 그대로 사용하는 구조는 아닙니다.
서비스 상태와 접속 확인
Ubuntu 설치 버전에 따라 rsync.service와 소켓 활성화 구성이 다를 수 있습니다. 먼저 제공되는 서비스를 확인합니다.
systemctl list-unit-files 'rsync*'
systemctl cat rsync.service/etc/default/rsync의 RSYNC_ENABLE은 모든 Ubuntu에서 공통으로 필요한 설정이 아닙니다. 현재 시스템의 서비스 정의가 해당 파일을 사용하는지 확인한 뒤 적용 여부를 판단합니다. 서비스 실행에 실패했다면 journalctl -u rsync.service로 로그를 확인합니다.
마지막으로 파일을 보내는 클라이언트 서버에서 아래 명령을 사용합니다.
rsync -avhP /data/ backup@192.168.0.10::backup/앞의 backup@은 데몬 인증 사용자, 뒤의 ::backup은 모듈 이름입니다. SSH 전송의 :와 달리 콜론을 두 개 사용합니다.
일반적인 파일 복사와 SSH 백업이라면 rsync를 설치하고 전송 경로와 권한을 확인하는 것으로 시작하면 됩니다. 데몬은 모듈 기반 서비스를 별도로 운영할 필요가 있을 때만 설정합니다.
실제 명령을 실행할 때는 경로 끝의 /와 --delete 사용 여부를 먼저 확인하는 편이 좋습니다. 두 항목 모두 명령 자체는 짧지만 결과에 큰 차이를 만듭니다.
더 읽어보면 좋은 글
[rsync 공식 매뉴얼] - 전송 경로, 옵션, 제외 규칙과 동기화 동작을 확인할 수 있습니다.
[rsyncd.conf 공식 매뉴얼] - 모듈, 인증 사용자, 접근 제한과 서비스 구성을 설명합니다.