rsync
rsync는 'Remote Sync'의 약자로, 빠른 증분 파일 전송을 제공하는 오픈소스 유틸리티이다.
rsync로 데이터 전송 시 네트워크 대역폭을 최소화하는 Delta Encoding Algorithm을 구현하여 scp보다 훨씬 빠르고 효율적으로 데이터를 동기화할 수 있다.
또한 rsync를 통해 서버 간의 동기화나 백업을 진행할 수도 있다.
root 권한이 따로 필요 없고, 익명 사용자(anonymous)를 지원한다. 복사 시 심볼릭 링크, 디바이스, 소유자 그룹, 허가권 등을 복사할 수 있고, exclude, exclude-from 옵션도 지원한다.
rsync는 client와 server 프로그램이 모두 포함되어 있으며, server로 구동 시 TCP 873번 포트를 사용한다.
server 구동 시 SSH나 RSH 같은 Remote Shell Protocol 기반에서 동작할 수도 있으므로 ssh 기반으로 rsync 사용 시 방화벽을 오픈 할 필요없이 편리하게 사용 가능하다.
사용 방법
$ rsync [options] <src> <dest>
rsync 옵션
주요 options
옵션 | 설명 |
---|---|
-a , --archive |
압축 모드. -rlptgoD와 동일 -r, -t(타입스탬프 보존), -l (심볼릭 링크 보존), -p(permission 보존), -g(g그룹 보존), -o(소유자 보존 - root 만 가능), -D(device, special 파일 보존) 일반적으로 -a 옵션에 -z 옵션을 추가하면 충분 |
-v , --verbose |
상세한 정보 출력 |
-r , --recursive |
하위 디렉터리까지 재귀적으로 실행 |
-z |
데이터 압축 |
-h |
human-readable, output numbers in a human-readable format |
기타 options
옵션 | 설명 |
---|---|
# 기타 옵션 | |
-A , --acls |
ACLs를 보존(-p 옵션과 함께 사용) |
-b , --backup |
백업 생성(--suffix 나 -backup-dir 참조) |
-c , --checksum |
시간이나 크기가 아니라 checksum으로 파일을 비교 |
-d , --dirs |
하위 디렉터리를 포함하지 않고 전달 |
-e , --rsh=COMMAND |
원격 셸을 지정 |
-E , --executability |
실행 권한을 보존 |
-g , --group |
그룹을 보존 |
-H , --hard-links |
하드 링크를 보존 |
-k , --copy-dirlinks |
디렉터리의 심볼릭 링크는 원본 디렉터리로 변경 |
-K , --keep-dirlinks |
디렉터리의 심볼릭 링크는 심볼릭 그대로 취급 |
-l , --links |
심볼릭 링크는 심볼릭 링크 형태 그대로 복사 |
-L , --copy-links |
심볼릭 링크의 원본 파일이나 디렉터리로 변경 |
-o , --owner |
소유자를 보존(슈퍼유저만 해당) |
-p , --perms |
퍼미션을 보존 |
-q , --quiet |
에러가 아닌 메시지는 출력하지 않음 |
-t , --times |
변경 시간을 보존 |
-u , --update |
새로운 파일은 덮어쓰지 않음 |
--backup-dir=DIR |
지정한 디렉터리(DIR)에 백업을 만듦. |
--bwlimit |
전송 대역폭을 제한(KByte 기준) |
--chmod=CHMOD |
파일이나 디렉터리 퍼미션(CHMOD)을 지정 |
--delete |
서버 쪽에는 없고 클라이언트에만 있는 파일은 지움 |
--devices |
디바이스 파일을 보존(슈퍼유저만 해당) |
--existing |
추가된 파일은 전송하지 않고 업데이트된 파일만 전송 |
--exclude |
불필요한 파일을 제외 |
사용 예시
Local 파일 Local에 복제
# /home/${USER} 디렉토리를 압축하여 /backup/${USER} 디렉토리에 상세한 정보와 함께 백업
$ rsync -av /home/${USER} /backup/${USER}
Local 파일을 Remote에 복제
# /home/${USER}/monitoring/config/ 디렉토리를 압축하여 monitor-server 서버의 /home/monitor/loki/config 디렉토리에 복제
$ rsync -av /home/${USER}/monitoring/config/ monitor-server@192.168.121.149:/home/monitor/loki/config/
Remote 파일을 Local에 복제
옵션 미지정 시 rsync에서 데이터 삭제는 진행되지 않음. 삭제를 원할 시 --delete
옵션을 사용
# monitor-server 서버의 /home/monitor/loki/config 디렉토리를 로컬 서버의 /home/${USER}/backup/ 디렉토리에 백업
# --delete : monitor-server 서버의 /home/monitor/loki/config 디렉토리 목록에 존재하지 않는 항목들은 로컬에서 삭제됨.
$ rsync -avzr --delete monitor-server@192.168.121.149:/home/monitor/loki/config /home/${USER}/backup/
디렉터리 구조만 복사
# -d, --dirs : 원본의 디렉토리 구조만 복제하고 안의 파일들은 복제하지 않음.
$ rsync -vd monitor-server:/home/monitor/data .
ssh 접근 포트가 22번이 아닐 경우에 rsync 연결방법
보안 때문에 SSH를 다른 포트(Ex: 66022)에 사용하는 서버를 연결 시 아래와 같이 -e
옵션 뒤에 ssh와 연결할 포트를 추가하고 실행 가능
$ rsync -avz -e 'ssh -p 66022' monitor-server@192.168.121.149:/home/monitor/data /home/${USER}/backup
불필요한 파일 제외시키기
USB를 마운트해서 복사하는 경우 휴지통이나 미리보기 데이터등의 불 필요한 파일은 --exclude
옵션으로 명시적으로 지정해서 제외가 가능하다
$ rsync -avpz --delete --exclude="lost+found" 192.168.121.100::TEST/ /home/${USER}/test/
💡 '192.168.121.100::TEST/' - '::'는 무엇?
rsync는 네트워크 상에서 파일을 전송하기 위해 주로 사용되며, 원격 시스템에 있는 특정 모듈에 접근하여 파일을 동기화할 때 사용됩니다. 이때 ::는 rsync에게 원격 시스템의 모듈을 사용하겠다는 것을 나타내며, 일반적으로 IP 주소나 호스트명 뒤에 ::를 붙여 해당 모듈을 지정합니다.
따라서 예를 들어 192.168.10.100::TEST는 192.168.10.100이라는 원격 호스트의 TEST라는 rsync 모듈을 가리킵니다. 이 모듈은 원격 서버에서 rsync 데몬이 제공하는 특정 디렉토리나 파일을 가리킬 수 있습니다.
만약 단순한 SSH 프로토콜을 통한 파일 전송이었다면 192.168.10.100:TEST와 같은 형식이 사용될 수 있지만, rsync에서는 일반적으로 ::를 사용하여 모듈을 지정하는 방식입니다.
현재 경로에 있는 모든 파일 압축해서 원격지에 보내기
$ rsync -avz -e ssh ./* jaehyo@192.168.219.100:/home/jaehyo/jupyter-notebook/datas