Rysnc 가이드 및 이를 효과적으로 사용하기 위한 11가지 예

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용 명령줄 치트 시트를 확인하십시오.