리눅스 rsync 백업과 파일 동기화 방법 (원격 서버 백업, 자동화)
백업을 같은 서버 안에만 두면 디스크가 고장 났을 때 원본과 백업을 함께 잃는다. 그래서 백업은 다른 서버나 다른 디스크에 한 벌 더 두는 것이 기본이다. 이때 가장 많이 쓰는 도구가 rsync다. 이 글에서는 rsync 백업 방법과 서버 간 파일 동기화, 그리고 crontab으로 자동화하는 과정까지 정리한다. 백업 파일을 만드는 방법은 tar 압축 사용법에 먼저 정리해 두었다.

rsync가 scp보다 좋은 이유
- 바뀐 부분만 전송: 이미 있는 파일은 건너뛰고 달라진 파일만 보낸다. 두 번째부터는 훨씬 빠르다.
- 이어서 받기: 전송이 끊겨도 다시 실행하면 남은 부분부터 이어 간다.
- 권한과 시간 보존: -a 옵션 하나로 소유자, 권한, 수정 시간, 심볼릭 링크를 그대로 옮긴다.
- 미리 보기: –dry-run으로 실제로 무엇이 바뀔지 먼저 확인할 수 있다.
rsync는 보내는 쪽과 받는 쪽 서버 모두에 설치되어 있어야 한다. 없다면 apt install rsync 또는 dnf install rsync로 설치한다.
rsync 백업 기본 명령어
rsync [옵션] 원본 대상| 옵션 | 뜻 |
|---|---|
-a | 아카이브 모드(권한, 소유자, 시간, 링크 보존 + 하위 디렉터리 포함) |
-v | 전송하는 파일 이름 출력 |
-z | 전송할 때 압축(네트워크 전송 시 유용) |
-P | 진행률 표시 + 끊긴 전송 이어 받기 |
-n, --dry-run | 실제로 복사하지 않고 결과만 미리 보기 |
--delete | 원본에서 지운 파일을 대상에서도 지우기 |
--exclude | 특정 파일이나 경로 제외 |
끝 슬래시(/) 하나로 결과가 달라진다
rsync에서 가장 헷갈리는 부분이다. 원본 경로 끝에 /가 있으면 “디렉터리 안의 내용”을, 없으면 “디렉터리 자체”를 복사한다.
# /backup/html/ 아래에 html 안의 파일들이 들어간다
rsync -av /var/www/html/ /backup/html/
# /backup/ 아래에 html 디렉터리가 통째로 들어간다
rsync -av /var/www/html /backup/rsync 백업 예제
# 같은 서버의 다른 디스크로 백업
rsync -av /var/www/html/ /mnt/backup/html/
# 원격 서버로 보내기 (SSH 사용)
rsync -avzP /var/www/html/ admin@192.168.0.20:/backup/html/
# 원격 서버에서 가져오기
rsync -avzP admin@192.168.0.20:/backup/html/ /restore/html/
# SSH 포트가 22가 아닐 때
rsync -avz -e "ssh -p 2222" /var/www/html/ admin@192.168.0.20:/backup/html/
# 캐시와 로그 제외
rsync -av --exclude='cache/' --exclude='*.log' /var/www/html/ /mnt/backup/html/SSH 포트를 바꿔 쓰고 있다면 SSH 포트 변경 방법을, 원격 접속이 안 된다면 SSH 접속 안될 때 확인할 것을 참고하자.
–delete 옵션은 반드시 미리 보기부터
–delete는 원본과 대상을 똑같이 맞추기 위해 대상 쪽에만 있는 파일을 지운다. 원본과 대상 경로를 바꿔 적거나 슬래시를 잘못 쓰면 백업이 통째로 지워질 수 있다. 처음 쓸 때는 꼭 -n으로 결과를 확인한 뒤 실행하자.
# 1) 미리 보기: deleting 으로 표시되는 파일을 확인
rsync -avn --delete /var/www/html/ /mnt/backup/html/
# 2) 확인 후 실제 실행
rsync -av --delete /var/www/html/ /mnt/backup/html/지운 파일도 보관하고 싶다면
–backup과 –backup-dir을 함께 쓰면, 지워지거나 덮어쓰일 파일을 날짜별 폴더로 옮겨 둔다. 실수로 지운 파일을 되살릴 여지가 생긴다.
rsync -av --delete --backup --backup-dir=/mnt/backup/deleted_$(date +%Y%m%d) /var/www/html/ /mnt/backup/html/rsync 백업 자동화하기
crontab에서 원격 서버로 rsync를 돌리려면 비밀번호 입력 없이 접속할 수 있어야 한다. ssh-keygen으로 키를 만들고 ssh-copy-id로 원격 서버에 공개키를 등록해 두자.
ssh-keygen -t ed25519
ssh-copy-id admin@192.168.0.20
# 비밀번호 없이 접속되는지 확인
ssh admin@192.168.0.20 "hostname"그다음 쉘 스크립트 기초에서 만든 백업 스크립트 뒤에 rsync 한 줄을 붙이거나, crontab에 바로 등록한다.
# 매일 새벽 4시, 로컬 백업을 원격 서버로 복사 (crontab -e)
0 4 * * * rsync -az /backup/www/ admin@192.168.0.20:/backup/www/ >> /backup/rsync.log 2>&1crontab 형식과 로그 확인 방법은 리눅스 crontab 사용법에 정리했다. 옵션 전체는 rsync 공식 매뉴얼에서 볼 수 있다.
마무리
rsync 백업의 핵심은 세 가지다. 슬래시 하나까지 경로를 정확히 쓰고, –delete는 반드시 미리 보기로 확인하고, 백업은 다른 서버나 다른 디스크에 둔다. tar로 묶고, 쉘 스크립트로 자동화하고, rsync로 다른 곳에 한 벌 더 두면 기본적인 서버 백업 체계가 완성된다. 백업이 정말 쓸 수 있는지 가끔은 직접 복원해 보는 것도 잊지 말자.
첫 댓글을 남겨보세요