rsync: 파일 동기화를 위한 강력한 명령줄 도구
rsync는 로컬 및 원격 시스템 간의 파일 동기화를 가능하게 하는 자유롭게 사용할 수 있는 명령줄 유틸리티입니다. 파일과 디렉토리를 손쉽게 전송할 수 있게 해주며, 데이터 마이그레이션, 백업, 미러링 등의 작업에 탁월한 성능을 제공합니다. 이러한 기능 덕분에 웹 관리자와 시스템 관리자가 반복적인 데이터 전송 작업을 효율적으로 처리할 수 있습니다.
본 문서에서는 rsync의 작동 원리를 자세히 알아보고, 실제 사용 시 유용한 예시들을 소개합니다.
rsync 작동 방식
rsync는 Unix 계열 운영체제에서 원격 동기화를 수행하는 데 특화된 명령줄 유틸리티입니다. 사용자들은 이 도구를 통해 시스템 간, 혹은 두 호스트 사이에서 파일 전송 및 동기화 작업을 원활하게 진행할 수 있습니다.
rsync의 핵심은 델타 전송 알고리즘입니다. 이 알고리즘은 두 호스트(소스 및 대상)에 있는 파일들의 차이점만을 복사하는 방식으로 동작합니다. 소스와 대상은 로컬 시스템일 수도 있고 원격 시스템일 수도 있습니다. rsync는 두 가지 방식으로 데이터 복사 및 동기화 작업을 수행합니다:
- ssh 또는 rsh 프로토콜을 사용하여 두 호스트 간에 복사/동기화
- TCP rsync 데몬을 사용하여 복사/동기화
Unix 계열 시스템을 기반으로 설계된 rsync는 Linux 환경에서도 매우 효과적으로 작동합니다.
rsync의 작업 단계를 간단히 정리하면 다음과 같습니다:
- rsync는 SSH를 통해 원격 호스트에 접속하고, 필요한 경우 비밀번호를 요청합니다.
- 연결이 수립되면, 원격 호스트의 rsync 프로세스가 소스 시스템과 통신합니다.
- 이후, 동기화가 필요한 파일 및 디렉토리를 식별하고, 델타 전송 알고리즘을 사용하여 파일 간의 차이점을 파악합니다.
만약 rsync 명령이 원격에는 파일이 없고 로컬 호스트에만 있는 경우, 해당 파일을 로컬 호스트에서 원격 시스템으로 복사합니다. 이미 양쪽에 존재하는 파일에 대해서는, 파일 내용의 변경된 부분만 복사합니다. 변경 사항이 없는 파일은 복사하지 않고 그대로 둡니다.
rsync는 증분 업데이트를 위해 임시 파일에 변경 사항을 저장한 후, 최종적으로 대상 위치로 전송합니다.
시작하기 전에 다음 사항을 확인하세요:
- 루트 권한 또는 sudo 권한이 필요합니다.
- 터미널 또는 명령줄에 접속할 수 있어야 합니다.
- rsync 명령을 안전하게 실행하기 위한 SSH 접속이 필요합니다.
- rsync 테스트를 위한 두 대의 컴퓨터가 필요합니다.
본 튜토리얼에서는 Linux Mint 21.1 Vera 환경을 사용합니다. 다른 Linux 배포판을 사용하더라도 가이드를 따라하는 데 어려움이 없을 것입니다.
scp 대신 rsync를 사용하는 이유
scp (보안 복사)는 파일을 복사하는 데 널리 사용되는 명령줄 프로토콜입니다. scp는 소스에서 대상으로 파일을 순차적으로 복사하는 선형적인 방식을 사용하며, SSH를 통해 안전하게 파일을 전송합니다.
scp의 명령 구문은 다음과 같습니다.
scp 옵션 소스 대상
그렇다면 왜 scp 대신 rsync를 사용해야 할까요?
rsync를 사용하면 다음과 같은 여러 장점이 있습니다.
- 더 빠른 속도: rsync는 원격 업데이트 프로토콜을 사용하기 때문에 scp보다 속도가 빠릅니다. 전체 파일이 아닌 변경된 부분만 전송하기 때문입니다. 정기적인 동기화 작업을 수행할 때, 처음에는 전체 복사를 수행하지만, 다음부터는 델타 전송 알고리즘을 통해 업데이트된 부분만 복사하여 효율성을 높입니다.
- 대역폭 절약: rsync는 전체 파일을 다시 복사하지 않으므로 대역폭 사용량을 줄입니다. 또한 전송 중 파일 크기를 최소화하기 위해 압축 및 압축 해제 알고리즘을 활용합니다.
- 다양한 명령줄 옵션: rsync는 scp보다 다양한 명령줄 옵션을 제공하여 사용자 맞춤형 설정이 가능합니다.
결론적으로, rsync는 증분 동기화에 매우 유용한 도구이며, scp는 파일을 안전하게 전송/동기화하는 데 효과적입니다. 간단한 작업을 원한다면 scp가 적합할 수 있지만, 반복적인 작업에는 rsync를 사용하는 것이 좋습니다.
rsync 명령 구문
rsync 명령의 기본 구문은 다음과 같습니다.
rsync [옵션] [소스] [대상]
각 용어의 의미는 다음과 같습니다.
- OPTION: rsync의 다양한 동작을 제어하는 옵션입니다.
- SOURCE: 복사할 파일 또는 디렉토리의 원본 위치입니다.
- DEST: 복사된 파일 또는 디렉토리가 저장될 대상 위치입니다.
- USER: 원격 시스템에 접속할 사용자 이름입니다.
- HOST: 원격 호스트의 이름 또는 IP 주소입니다.
옵션은 명령의 기능을 확장하는 데 사용되는 매개변수입니다. 예를 들어, -r 옵션을 사용하면 디렉토리를 재귀적으로 동기화할 수 있습니다. 하지만 -r 옵션은 그룹 및 사용자 정보, 타임스탬프, 권한, 심볼릭 링크를 동기화하지 않습니다. 이러한 속성까지 유지하려면 -a 옵션을 사용하여 아카이브 모드로 명령을 실행해야 합니다.
주요 rsync 옵션은 다음과 같습니다.
- -z: 데이터를 압축하여 전송 속도를 높이고 대역폭을 절약합니다.
- -h: 사람이 읽기 쉬운 형식으로 출력합니다.
- -b: 데이터 동기화 과정에서 백업을 수행합니다.
- -e: 원격 데이터 전송 시 SSH 프로토콜을 사용합니다.
- –progress: 데이터 동기화 진행률을 표시합니다.
- -v: 상세한 실행 정보를 출력합니다.
- –n 또는 –dry-run: 실제 파일 변경 없이 테스트를 수행합니다.
- -q: rsync 명령 출력 및 옵션을 억제합니다.
rsync 설치
대부분의 Unix 및 Linux 시스템에는 rsync가 기본적으로 설치되어 있습니다. 만약 시스템에 rsync가 없다면, 다음 명령을 사용하여 설치할 수 있습니다.
Debian/Ubuntu 및 Mint의 경우:
sudo apt-get install rsync
Arch Linux의 경우:
pacman -S rsync
Gentoo의 경우:
emerge sys-apps/rsync
CentOS/Fedora/RHEL의 경우:
sudo yum install rsync
openSUSE의 경우:
sudo zypper install rsync
Linux Mint 사용자의 경우 rsync가 이미 설치되어 있으므로, 터미널에서 `rsync` 명령을 실행하여 설치 여부를 확인할 수 있습니다. 실행 결과는 기능, 옵션 및 기타 정보를 포함하여 자세하게 표시됩니다.
nitt ~
$ rsync
rsync version 3.2.3 protocol version 31
Copyright (C) 1996-2020 by Andrew Tridgell, Wayne Davison, and others.
Web site: https://rsync.samba.org/
Capabilities:
64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints,
socketpairs, hardlinks, hardlink-specials, symlinks, IPv6, atimes,
batchfiles, inplace, append, ACLs, xattrs, optional protect-args, iconv,
symtimes, prealloc, stop-at, no crtimes
Optimizations:
SIMD, no asm, openssl-crypto
Checksum list:
xxh128 xxh3 xxh64 (xxhash) md5 md4 none
Compress list:
zstd lz4 zlibx zlib none
rsync comes with ABSOLUTELY NO WARRANTY. This is free software, and you
are welcome to redistribute it under certain conditions. See the GNU
General Public Licence for details.
rsync is a file transfer program capable of efficient remote update
via a fast differencing algorithm.
이제 다양한 사용 사례에서 rsync를 사용하는 방법을 살펴보겠습니다.
본 튜토리얼에서는 다음 두 개의 디렉토리를 생성합니다.
- 소스 디렉토리 (source-directory)
- 대상 디렉토리 (dest-directory)
다음 명령어를 입력하여 디렉토리를 생성합니다.
mkdir source-directory mkdir dest-directory
rsync 테스트를 위해 파일을 생성해야 합니다. 아래 명령어를 사용하여 테스트 파일을 생성해 봅시다.
touch source-directory/file{1..100}
이 명령어는 소스 디렉토리에 100개의 빈 파일을 생성합니다. 아래 명령어를 통해 파일이 생성되었는지 확인할 수 있습니다.
ls source-directory
Output:
nitt rsync-tutorial
$ ls
dest-directory source-directory
nitt rsync-tutorial
$ touch source-directory/file{1..100}
nitt rsync-tutorial
$ ls source-directory
file1 file18 file27 file36 file45 file54 file63 file72 file81 file90
file10 file19 file28 file37 file46 file55 file64 file73 file82 file91
file100 file2 file29 file38 file47 file56 file65 file74 file83 file92
file11 file20 file3 file39 file48 file57 file66 file75 file84 file93
file12 file21 file30 file4 file49 file58 file67 file76 file85 file94
file13 file22 file31 file40 file5 file59 file68 file77 file86 file95
file14 file23 file32 file41 file50 file6 file69 file78 file87 file96
file15 file24 file33 file42 file51 file60 file7 file79 file88 file97
file16 file25 file34 file43 file52 file61 file70 file8 file89 file98
file17 file26 file35 file44 file53 file62 file71 file80 file9 file99
참고: 대상 디렉토리(dest-directory)는 비워 둡니다.
로컬에서 디렉토리 재귀적으로 복사
rsync는 주로 로컬 서버와 원격 서버 간의 파일 복사에 사용되지만, 로컬 시스템 내에서 파일을 복사하는 데도 유용합니다.
로컬 파일 복사 시에는 다음과 같은 rsync 구문을 사용합니다.
rsync [옵션] [소스] [대상]
다음 명령을 실행하여 소스 디렉토리의 파일을 대상 디렉토리로 복사합니다.
rsync -r source-directory/ dest-directory
이 명령은 소스 디렉토리의 모든 파일 및 하위 디렉토리를 대상 디렉토리로 재귀적으로 복사합니다.
nitt rsync-tutorial $ ls dest-directory source-directory nitt rsync-tutorial $ ls dest-directory nitt rsync-tutorial $ ls source-directory file1 file18 file27 file36 file45 file54 file63 file72 file81 file90 file10 file19 file28 file37 file46 file55 file64 file73 file82 file91 file100 file2 file29 file38 file47 file56 file65 file74 file83 file92 file11 file20 file3 file39 file48 file57 file66 file75 file84 file93 file12 file21 file30 file4 file49 file58 file67 file76 file85 file94 file13 file22 file31 file40 file5 file59 file68 file77 file86 file95 file14 file23 file32 file41 file50 file6 file69 file78 file87 file96 file15 file24 file33 file42 file51 file60 file7 file79 file88 file97 file16 file25 file34 file43 file52 file61 file70 file8 file89 file98 file17 file26 file35 file44 file53 file62 file71 file80 file9 file99 nitt rsync-tutorial $ rsync -r source-directory/ dest-directory nitt rsync-tutorial $ ls dest-directory file1 file18 file27 file36 file45 file54 file63 file72 file81 file90 file10 file19 file28 file37 file46 file55 file64 file73 file82 file91 file100 file2 file29 file38 file47 file56 file65 file74 file83 file92 file11 file20 file3 file39 file48 file57 file66 file75 file84 file93 file12 file21 file30 file4 file49 file58 file67 file76 file85 file94 file13 file22 file31 file40 file5 file59 file68 file77 file86 file95 file14 file23 file32 file41 file50 file6 file69 file78 file87 file96 file15 file24 file33 file42 file51 file60 file7 file79 file88 file97 file16 file25 file34 file43 file52 file61 file70 file8 file89 file98 file17 file26 file35 file44 file53 file62 file71 file80 file9 file99
위 명령어를 실행하면, 소스 디렉토리의 모든 파일이 대상 디렉토리로 복사됩니다.
로컬에서 단일 파일 복사
디렉토리를 동기화하는 방법을 배웠으니, 이제 단일 파일을 복사하는 방법을 알아보겠습니다.
이를 위해 소스 디렉토리의 ‘file1’ 파일을 편집하고, 대상 디렉토리에 있는 동일한 파일과 동기화합니다.
파일을 편집하려면 다음 명령을 입력합니다.
nano source-directory/file1
다음 텍스트를 복사하여 nano 편집기에 붙여넣습니다.
We're updating file1 in the source-directory. Once we update, we'll push the new update to the dest-directory. rsync doesn't need to re-copy the file using the delta-transfer algorithm. This algorithm checks the differences and then updates destination files accordingly. So, once you save file1 in the source-directory, open file1 in the dest-directory. It'll be empty. However, if we check it after running rsync, you'll see that file1 in dest-directory is updated.

이제 파일을 닫고 저장합니다.
이제 rsync를 사용하여 파일을 복사해 보겠습니다.
sudo rsync -v --existing source-directory/file1 dest-directory
#Output nitt rsync-tutorial $ sudo rsync -v --existing source-directory/file1 dest-directory file1 sent 557 bytes received 35 bytes 1,184.00 bytes/sec total size is 474 speedup is 0.80 nitt rsync-tutorial $
여기서 ‘–existing’ 옵션을 사용했습니다. 이 옵션은 대상 디렉토리에 있는 기존 파일을 업데이트합니다. ‘–existing’ 옵션 없이 명령을 실행하면 업데이트가 발생하지 않습니다.
만약 복사하려는 단일 파일이 대상 폴더에 없다면 다음 명령어를 사용해야 합니다.
rsync -v source-directory/newfile dest-directory
#Output nitt rsync-tutorial $ rsync -v source-directory/newfile dest-directory newfile sent 82 bytes received 35 bytes 234.00 bytes/sec total size is 0 speedup is 0.00
여러 파일 복사
여러 파일을 복사하려면 복사할 파일들의 원본 경로와 대상 디렉토리를 지정해야 합니다.
이를 위해 ‘source-directory’ 디렉토리에 ‘newfile2’와 ‘newfile3’라는 두 개의 파일을 새로 생성합니다. 다음 명령어를 실행하여 파일을 생성합니다.
touch source-directory/newfile{2..3}
이제 다음 명령어를 사용하여 여러 파일을 동기화합니다.
rsync -v source-directory/newfile2 source-directory/newfile3 dest-directory
#Output nitt rsync-tutorial $ rsync -v source-directory/newfile2 source-directory/newfile3 dest-directory newfile2 newfile3 sent 135 bytes received 54 bytes 378.00 bytes/sec total size is 0 speedup is 0.00 nitt rsync-tutorial $
로컬에서 원격으로 파일 또는 디렉토리 복사
로컬 시스템에서 원격 시스템으로 파일을 전송하는 rsync 구문은 다음과 같습니다.
rsync [옵션] [소스] [사용자]@[호스트]:[대상]
원격 시스템의 IP 주소를 알아야 하며, 소스 파일 다음에 IP 주소를 추가해야 합니다.
rsync -av /Projects/rsync-tutorial/source-directory [email protected]:/Projects/rsync-tutorial/dest-directory
전송을 시작하기 전에 비밀번호를 입력하라는 메시지가 표시됩니다. 계속 진행하려면 비밀번호를 입력하십시오. 또한, 원격 시스템에서 다른 사용자를 사용하고 있다면 IP 주소 앞 @ 기호 전에 해당 사용자 이름을 지정해야 합니다.
rsync -av /Projects/rsync-tutorial/source-directory [email protected]:/Projects/rsync-tutorial/dest-directory
여러 파일이나 디렉토리를 복사하려면, 각 파일 또는 디렉토리 경로를 나열해야 합니다. 이에 대한 구문은 다음과 같습니다.
rsync -av /Projects/rsync-tutorial/source-directory/newfile1 /Projects/rsync-tutorial/source-directory/newfile2 [email protected]:/Projects/rsync-tutorial/dest-directory
원격 전송 관련 프로토콜
rsync를 사용하면 특정 파일 전송 프로토콜을 지정할 수 있습니다. 이를 위해서는 ‘-e’ 옵션과 함께 프로토콜을 지정해야 합니다.
예를 들어, ssh 프로토콜을 사용하려면 rsync 명령어에 ‘-e ssh’를 추가해야 합니다.
rsync -e ssh /Projects/rsync-tutorial/source-directory [email protected]:/Projects/rsync-tutorial/dest-directory
원격에서 로컬로 파일 또는 디렉토리 복사
원격 시스템에서 로컬 시스템으로 파일을 전송하는 rsync 구문은 다음과 같습니다.
rsync [옵션] [email protected]:[소스] [대상]
이는 풀 요청의 역할을 합니다. 원격 서버에서 로컬 시스템으로 필요한 파일이나 디렉토리를 가져오려면 다음 명령어를 실행해야 합니다.
rsync -av [email protected]:/Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory
이 명령어는 원격 시스템의 ‘dest-directory’에 있는 파일을 로컬 시스템의 ‘source-directory’로 가져옵니다.
마찬가지로, 전체 경로를 사용하여 특정 파일을 가져올 수도 있습니다.
rsync -av [email protected]:/Projects/rsync-tutorial/dest-directory/newfile4 /Projects/rsync-tutorial/source-directory
로컬 시스템으로 여러 파일이나 디렉토리를 복사하려면, 서버 IP 주소 뒤에 중괄호({ }) 안에 쉼표로 구분하여 경로를 지정해야 합니다.
rsync -av [email protected]:{/Projects/rsync-tutorial/dest-directory/, /home/music/2023-music} /Projects/rsync-tutorial/source-directory
파일도 이와 같은 방법으로 지정할 수 있습니다.
전송 중 실시간 진행 상황 표시
대량의 데이터 백업을 할 때, 실시간으로 진행 상황을 확인하는 것이 유용합니다. 이때는 ‘–progress’ 플래그를 사용해야 합니다. rsync 명령어에 이 플래그를 추가하면 전송 속도, 남은 시간, 전송된 데이터 양을 확인할 수 있습니다.
rsync -av --progress [email protected]:/Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory
전송 완료 후 소스 파일 삭제
‘–remove-source-files’ 플래그를 사용하면 전송이 완료된 후 소스 파일을 삭제할 수 있습니다. 이 기능은 파일 관리를 효율적으로 할 수 있게 도와줍니다.
rsync -av --remove-source-files [email protected]:/Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory
rsync 드라이 런
rsync를 사용하면 실제 실행 전에 설정을 평가할 수 있습니다. 모의 실행을 통해 의도한 대로 작업을 수행하는지 확인할 수 있습니다. 이를 통해 실수로 파일을 업데이트하거나 삭제하는 상황을 방지할 수 있습니다.
테스트 실행을 수행하려면 ‘–dry-run’ 옵션을 사용해야 합니다. 명령어에 추가하고 소스와 대상을 지정하십시오.
sudo rsync -v --dry-run source-directory/file1 dest-directory
nitt rsync-tutorial $ sudo rsync -v --dry-run source-directory/file1 dest-directory file1 sent 43 bytes received 19 bytes 124.00 bytes/sec total size is 474 speedup is 7.65 (DRY RUN) nitt rsync-tutorial
출력 결과는 실제 실행과 유사하지만, 출력 끝에 ‘(DRY RUN)’이 표시됩니다.
최소 및 최대 파일 크기 설정
rsync를 사용하여 전송 중 최소 또는 최대 파일 크기를 설정할 수도 있습니다.
최소 15KB 크기의 파일만 전송하려면 ‘–min-size=15k’를 사용해야 합니다.
rsync -av --min-size=15k [email protected]:/Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory
이 명령어는 최소 파일 크기가 15KB인 파일만 복사합니다. 파일 크기가 그 이하인 파일은 무시합니다.
마찬가지로 ‘–max-size’ 플래그를 사용하여 최대 파일 크기를 설정할 수 있습니다.
rsync -av --max-size=450k [email protected]:/Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory
여기서는 rsync가 450KB 이상의 파일은 무시합니다.
대역폭 제한 설정
대역폭을 많이 사용하는 다른 작업과 함께 rsync를 실행해야 할 경우, 전송에 대한 대역폭 제한을 설정할 수 있습니다. 이를 위해 ‘–bwlimit=KB/s’ 옵션을 사용합니다.
rsync -av --bwlimit=100 --progress [email protected]:/Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory
이 예에서는 전송 중 대역폭을 100KB/s로 설정합니다.
마무리
이것으로 rsync 명령어 가이드가 마무리되었습니다. 본 가이드를 통해 rsync 사용법과 다양한 명령어를 효율적으로 사용하는 방법을 익혔습니다.
그러나 rsync는 이 가이드에서 다룬 내용보다 더 많은 기능을 제공합니다. rsync 매뉴얼 페이지를 참조하여 더 많은 정보를 얻을 수 있습니다.
다음으로 Windows, Linux 및 macOS용 명령줄 치트 시트를 확인하십시오.