rsync는 'remote sync'의 약자로, UNIX/Linux 환경에서 백업 작업을 수행하는 데 사용되는 대표적인 유틸리티입니다.
rsync는 파일과 디렉터리를 한 위치에서 다른 위치로 효율적으로 동기화하는 도구입니다. 백업 위치는 로컬 서버일 수도 있고, 원격 서버일 수도 있습니다.
rsync의 주요 특징
- 빠른 속도: 처음 실행할 때는 소스와 대상 디렉터리 간의 전체 내용을 복제하지만, 이후에는 변경된 블록이나 바이트만 전송하므로 전송 속도가 매우 빠릅니다.
- 보안성: 전송 중 ssh 프로토콜을 사용해 데이터를 암호화할 수 있습니다.
- 낮은 대역폭 사용량: rsync는 송신 측과 수신 측에서 데이터 블록을 블록 단위로 압축하고 해제합니다. 따라서 다른 파일 전송 프로토콜에 비해 항상 더 적은 대역폭을 사용합니다.
- 권한 불필요: rsync를 설치하고 실행하는 데 특별한 권한이 필요하지 않습니다.
기본 문법
$ rsync options source destination
소스와 대상은 로컬 또는 원격 모두 가능합니다. 원격인 경우에는 로그인 이름, 원격 서버 이름, 경로를 지정해야 합니다.
예제 1. 로컬 서버에서 두 디렉터리 동기화하기
로컬 컴퓨터에서 두 디렉터리를 동기화하려면 다음과 같이 rsync -zvr 명령을 사용합니다.
$ rsync -zvr /var/opt/installation/inventory/ /root/temp building file list ... done sva.xml svB.xml . sent 26385 bytes received 1098 bytes 54966.00 bytes/sec total size is 44867 speedup is 1.63 $
위 예제에서 사용된 옵션은 다음과 같습니다.
-z: 압축 활성화-v: 상세 정보 출력(verbose)-r: 재귀적 복사(recursive)
이제 소스에서 대상으로 복사된 파일 중 하나의 타임스탬프를 확인해 보겠습니다. 아래에서 볼 수 있듯이, 기본 상태의 rsync는 동기화 시 타임스탬프를 보존하지 않습니다.
$ ls -l /var/opt/installation/inventory/sva.xml /root/temp/sva.xml -r--r--r-- 1 bin bin 949 Jun 18 2009 /var/opt/installation/inventory/sva.xml -r--r--r-- 1 root bin 949 Sep 2 2009 /root/temp/sva.xml
예제 2. rsync -a 옵션으로 타임스탬프 보존하기
rsync의 -a 옵션은 아카이브(archive) 모드를 의미하며, 다음 기능들을 수행합니다.
- 재귀적 모드로 복사
- 심볼릭 링크 보존
- 파일 권한 보존
- 타임스탬프 보존
- 소유자와 그룹 정보 보존
예제 1과 동일한 명령에 -a 옵션만 추가하여 실행해 보겠습니다.
$ rsync -azv /var/opt/installation/inventory/ /root/temp/ building file list ... done ./ sva.xml svB.xml . sent 26499 bytes received 1104 bytes 55206.00 bytes/sec total size is 44867 speedup is 1.63 $
아래와 같이 rsync가 동기화 과정에서 타임스탬프를 그대로 유지한 것을 확인할 수 있습니다.
$ ls -l /var/opt/installation/inventory/sva.xml /root/temp/sva.xml -r--r--r-- 1 root bin 949 Jun 18 2009 /var/opt/installation/inventory/sva.xml -r--r--r-- 1 root bin 949 Jun 18 2009 /root/temp/sva.xml
예제 3. 단일 파일만 동기화하기
하나의 파일만 복사하려면 아래와 같이 rsync 명령에 파일 이름을 지정하면 됩니다.
$ rsync -v /var/lib/rpm/Pubkeys /root/temp/ Pubkeys sent 42 bytes received 12380 bytes 3549.14 bytes/sec total size is 12288 speedup is 0.99
예제 4. 로컬에서 원격으로 파일 동기화하기
rsync를 사용하면 로컬 시스템과 원격 시스템 사이에서 파일/디렉터리를 동기화할 수 있습니다.
$ rsync -avz /root/temp/ thegeekstuff@192.168.200.10:/home/thegeekstuff/temp/ Password: building file list ... done ./ rpm/ rpm/Basenames rpm/Conflictname sent 15810261 bytes received 412 bytes 2432411.23 bytes/sec total size is 45305958 speedup is 2.87
원격 서버와 동기화할 때는 원격 서버의 사용자 이름과 IP 주소를 지정해야 하며, 원격 서버의 대상 디렉터리도 함께 지정해야 합니다. 형식은 username@machinename:path입니다.
위 출력에서 볼 수 있듯이, 로컬에서 원격 서버로 rsync를 실행하면 비밀번호를 묻습니다.
그러나 경우에 따라 비밀번호 입력 없이 백업하고 싶을 때가 있습니다. 예를 들어 rsync를 사용해 로컬에서 원격 서버로 파일을 복사하는 백업 셸 스크립트를 운영한다면, 비밀번호 입력 없이 rsync를 실행할 수 있어야 합니다.
이를 위해서는 SSH 키 기반의 비밀번호 없는 로그인(passwordless login)을 미리 설정해 두면 됩니다.
예제 5. 원격에서 로컬로 파일 동기화하기
원격에서 로컬로 파일을 동기화하려면 아래와 같이 소스에 원격 경로를, 대상에 로컬 경로를 지정합니다.
$ rsync -avz thegeekstuff@192.168.200.10:/var/lib/rpm /root/temp Password: receiving file list ... done rpm/ rpm/Basenames . sent 406 bytes received 15810230 bytes 2432405.54 bytes/sec total size is 45305958 speedup is 2.87
예제 6. 동기화에 사용할 원격 셸 지정하기
rsync는 사용할 원격 셸(remote shell)을 직접 지정할 수 있습니다. rsync -e ssh처럼 옵션을 사용하면 안전한 원격 연결을 위해 ssh를 사용하도록 설정됩니다.
$ rsync -avz -e ssh thegeekstuff@192.168.200.10:/var/lib/rpm /root/temp Password: receiving file list ... done rpm/ rpm/Basenames sent 406 bytes received 15810230 bytes 2432405.54 bytes/sec total size is 45305958 speedup is 2.87
예제 7. 대상에서 수정된 파일 덮어쓰지 않기
일반적인 동기화 상황에서 대상 쪽의 파일이 수정되었다면, 소스의 오래된 파일로 덮어쓰고 싶지 않을 수 있습니다.
바로 이럴 때 -u(update) 옵션을 사용합니다. 즉, 대상의 파일이 수정된 상태라면 덮어쓰지 않습니다. 아래 예제에서 Basenames 파일은 이미 대상에서 수정된 상태이므로, -u 옵션을 사용하면 덮어쓰지 않습니다.
$ ls -l /root/temp/Basenames total 39088 -rwxr-xr-x 1 root root 4096 Sep 2 11:35 Basenames $ rsync -avzu thegeekstuff@192.168.200.10:/var/lib/rpm /root/temp Password: receiving file list ... done rpm/ sent 122 bytes received 505 bytes 114.00 bytes/sec total size is 45305958 speedup is 72258.31 $ ls -lrt total 39088 -rwxr-xr-x 1 root root 4096 Sep 2 11:35 Basenames
예제 8. 디렉터리 구조만 동기화하기 (파일 제외)
-d 옵션을 사용하면 소스에서 대상으로 디렉터리 트리 구조만 동기화합니다. 아래 예제는 재귀적으로 디렉터리 구조만 동기화하며, 디렉터리 안의 파일들은 복사하지 않습니다.
$ rsync -v -d thegeekstuff@192.168.200.10:/var/lib/ . Password: receiving file list ... done logrotate.status CAM/ YaST2/ acpi/ sent 240 bytes received 1830 bytes 318.46 bytes/sec total size is 956 speedup is 0.46
예제 9. 전송 진행 상황 확인하기
rsync로 백업을 수행할 때 진행 상황, 즉 몇 개의 파일이 복사되었는지, 어떤 속도로 복사되고 있는지 등을 알고 싶을 수 있습니다.
--progress 옵션을 사용하면 아래와 같이 rsync 실행의 상세한 진행 상황을 표시합니다.
$ rsync -avz --progress thegeekstuff@192.168.200.10:/var/lib/rpm/ /root/temp/ Password: receiving file list ... 19 files to consider ./ Basenames 5357568 100% 14.98MB/s 0:00:00 (xfer#1, to-check=17/19) Conflictname 12288 100% 35.09kB/s 0:00:00 (xfer#2, to-check=16/19) . . . sent 406 bytes received 15810211 bytes 2108082.27 bytes/sec total size is 45305958 speedup is 2.87
또한 rsync를 내부적으로 사용하는 rsnapshot 유틸리티를 활용하면 로컬 리눅스 서버나 원격 리눅스 서버를 백업할 수도 있습니다.
예제 10. 대상에서 생성된 파일 삭제하기
소스에는 없지만 대상에는 존재하는 파일이 있다면, rsync 실행 시 해당 파일을 대상에서 삭제하고 싶을 수 있습니다.
이때 --delete 옵션을 사용합니다. 이 옵션은 소스 디렉터리에 존재하지 않는 파일들을 대상에서 삭제합니다.
# 소스와 대상이 동기화된 상태. 이제 대상에 새 파일을 생성합니다. $ > new-file.txt $ rsync -avz --delete thegeekstuff@192.168.200.10:/var/lib/rpm/ . Password: receiving file list ... done deleting new-file.txt ./ sent 26 bytes received 390 bytes 48.94 bytes/sec total size is 45305958 speedup is 108908.55
대상에는 new-file.txt라는 새 파일이 있었지만, --delete 옵션과 함께 소스와 동기화하자 해당 파일이 삭제되었습니다.
예제 11. 대상에 새 파일 생성하지 않기
대상에 이미 존재하는 파일만 업데이트(동기화)하고 싶다면 어떻게 해야 할까요? 소스에 새 파일이 추가되었더라도 대상에는 생성되지 않도록 하려면 --existing 옵션을 사용하면 됩니다.
먼저 소스에 new-file.txt를 생성합니다.
[/var/lib/rpm ]$ > new-file.txt
그다음 대상 쪽에서 rsync를 실행합니다.
$ rsync -avz --existing root@192.168.1.2:/var/lib/rpm/ . root@192.168.1.2's password: receiving file list ... done ./ sent 26 bytes received 419 bytes 46.84 bytes/sec total size is 88551424 speedup is 198991.96
위 출력에서 볼 수 있듯이, 새 파일인 new-file.txt는 전송되지 않았습니다.
예제 12. 소스와 대상 간의 차이점 확인하기
-i(itemize) 옵션은 소스와 대상 사이의 파일 또는 디렉터리 차이를 확인할 때 유용합니다.
소스 측:
$ ls -l /var/lib/rpm -rw-r--r-- 1 root root 5357568 2010-06-24 08:57 Basenames -rw-r--r-- 1 root root 12288 2008-05-28 22:03 Conflictname -rw-r--r-- 1 root root 1179648 2010-06-24 08:57 Dirnames
대상 측:
$ ls -l /root/temp -rw-r--r-- 1 root root 12288 May 28 2008 Conflictname -rw-r--r-- 1 bin bin 1179648 Jun 24 05:27 Dirnames -rw-r--r-- 1 root root 0 Sep 3 06:39 Basenames
위 예제에서 소스와 대상 사이에는 두 가지 차이가 있습니다. 첫째, Dirnames 파일의 소유자와 그룹이 다릅니다. 둘째, Basenames 파일의 크기가 다릅니다.
이제 rsync가 이러한 차이를 어떻게 표시하는지 살펴보겠습니다. -i 옵션은 항목별 변경 사항을 표시합니다.
$ rsync -avzi thegeekstuff@192.168.200.10:/var/lib/rpm/ /root/temp/ Password: receiving file list ... done >f.st.... Basenames .f....og. Dirnames sent 48 bytes received 2182544 bytes 291012.27 bytes/sec total size is 45305958 speedup is 20.76
출력 결과에서 파일 이름이나 디렉터리 이름 앞에 9개의 문자가 표시되며, 이것이 변경 사항을 나타냅니다.
이 예제에서 Basenames(및 Dirnames) 앞의 문자들이 의미하는 바는 다음과 같습니다.
> : 로컬 호스트로 파일이 전송되고 있음을 의미 f : 파일임을 나타냄 s : 크기(size)가 변경되었음을 나타냄 t : 타임스탬프(timestamp)가 변경되었음을 나타냄 o : 소유자(owner)가 변경되었음을 나타냄 g : 그룹(group)이 변경되었음을 나타냄
예제 13. 파일 전송 시 포함/제외 패턴 지정하기
rsync는 동기화 시 특정 패턴에 맞는 파일이나 디렉터리만 포함하거나 제외할 수 있는 기능을 제공합니다.
$ rsync -avz --include 'P*' --exclude '*' thegeekstuff@192.168.200.10:/var/lib/rpm/ /root/temp/ Password: receiving file list ... done ./ Packages Providename Provideversion Pubkeys sent 129 bytes received 10286798 bytes 2285983.78 bytes/sec total size is 32768000 speedup is 3.19
위 예제에서는 'P'로 시작하는 파일이나 디렉터리만 포함(--include 'P*')하고, 나머지 모든 파일은 제외(--exclude '*')했습니다.
예제 14. 대용량 파일 전송하지 않기
--max-size 옵션을 사용하면 특정 크기보다 큰 파일은 전송하지 않도록 rsync에 지시할 수 있습니다.
$ rsync -avz --max-size='100K' thegeekstuff@192.168.200.10:/var/lib/rpm/ /root/temp/ Password: receiving file list ... done ./ Conflictname Group Installtid Name Sha1header Sigmd5 Triggername sent 252 bytes received 123081 bytes 18974.31 bytes/sec total size is 45305958 speedup is 367.35
max-size=100K는 100K 이하의 파일만 전송하도록 합니다. 메가바이트는 M, 기가바이트는 G로 표기할 수 있습니다.
예제 15. 파일 전체를 전송하기
rsync의 핵심 기능 중 하나는 파일 전체가 아니라 변경된 블록만 대상에 전송한다는 점입니다.
하지만 네트워크 대역폭은 여유가 있고 CPU 성능이 걱정된다면, -W(whole-file) 옵션을 사용해 파일 전체를 전송할 수 있습니다. 이 경우 소스와 대상에서 체크섬을 계산할 필요가 없으므로 rsync 처리 속도가 빨라집니다.
# rsync -avzW thegeekstuff@192.168.200.10:/var/lib/rpm/ /root/temp Password: receiving file list ... done ./ Basenames Conflictname Dirnames Filemd5s Group Installtid Name sent 406 bytes received 15810211 bytes 2874657.64 bytes/sec total size is 45305958 speedup is 2.87
추가 학습 자료
- UNIX/Linux에서 SSH와 함께 rsync 설정하기 (비밀번호 없는 rsync)
- exclude-from 옵션으로 여러 파일 및 디렉터리를 제외하는 rsync 예제 6선