rsync 사용법 - data backup 포함
하단의 "path 에 slash 가 있을 경우 동작 방식"을 숙지하고 사용하세요.
소개
rsync 는 Remote Sync 의 약자로 samba 의 핵심 개발자인 Andrew Tridgell 이 만든 file & directory 동기화를 위한 프로토콜이자 Unix용 커맨드라인 유틸리티이다.
전송시에 네트웍 대역폭을 최소화하는 delta encoding algorithm 을 구현하여 rcp 나 scp 보다 훨씬 빠르고 효율적으로 site 간의 데이타를 동기화한다.
rsync는 client와 server 프로그램이 모두 포함되어 있으며 server 로 구동시 TCP의 873 포트를 사용한다.
server 구동시 SSH 나 RSH 같은 Remote Shell protocol 기반에서 동작할 수도 있으므로 ssh 기반으로 rsync 를 사용하면 방화벽 오픈을 할 필요가 없이 편리하게 사용할 수 있다.(SSH 추천)
주요 용도로는 전통적인 rcp, scp를 대치하는 용도로 사용할 수 있으며 원격 사이트 미러링(Remote Site mirroring), 데이타 백업(data backup) 등의 용도로도 사용할 수 있다.
용법
rsync 는 다음과 같은 문법으로 사용한다.
rsync options source destination
주요 옵션은 다음과 같다.
- -v: verbose 자세한 정보 출력
- -r : 재귀적으로 하위 디렉터리 까지 복사(단 전송시 타임스탬프나 permission을 보존하지 않는다)
- -a : archive mode. -r, -t(타입스탬프 보존), -l (심볼릭 링크 보존), -p(permission 보존), -g(g그룹 보존), -o(소유자 보존 - root 만 가능), -D(device, special 파일 보존)과 동일하다. 일반적으로 rsync 로 복제시 -a 옵션에 -z 옵션을 추가하면 충분하다.
- -z : 데이타 압축
- -h : human-readable, output numbers in a human-readable format
path 에 slash 가 있을 경우 동작 방식
source path 에 trailing slash 가 있을 경우 rsync 는 목적지에 폴더를 생성하지 않으니 주의해야 한다.
백업 대상 소스인 test 폴더에 dir1, dir2 라는 하위 폴더가 있다고 가정ㅇ해 보자.
test source 폴더
$ tree test
test
├── dir1
└── dir2
다음 명령어는 다음과 같이 동작한다.
$ rsync -a test test_dest
$ tree test_dest/
test_dest/
└── test
├── dir1
└── dir2
목적지인 test_dest 하위에 source 경로인 test 가 생성되고 그 안에 파일과 폴더가 복사된다.
소스에 / 를 추가할 경우 아래와 같이 목적지에 소스의 폴더를 생성하지 않고 복사한다.
폴더 내용만 복사
$ rsync -a test/ test_dest
$ tree test_dest/
test_dest/
├── dir1
└── dir2
위와 같이 / 가 있는지 여부에 따라 동작이 다르므로 rsync 로 백업시 주의해야 하며 다음 rsync 명령어는 둘 다 동일한 동작을 수행한다.
$ rsync -azvh /var/lib/mysql /home/backups
$ rsync -azvh /var/lib/mysql/ /home/backups/mysql
사용하기
Local ➡ Local
mysql 의 DB 를 /home/backups/mysql 에 복제
rsync -azvh /var/lib/mysql /home/backups
Local ➡ Remote
Local 의 /root/data 디렉터리를 example.com 의 /home/lesstif/backup 에 복제. 호스트 명(example.com) 뒤에 : 가 빠지면 제대로 동작 안 하니 주의해야 한다.
$ rsync -avz /home/lesstif/data/ lesstif@example.com:/home/lesstif/backup/
Remote ➡ Local
example.com 의 /home/lesstif/data 디렉터리를 local 의 /home/lesstif/backup/ 에 복제
$ rsync -avz lesstif@example.com:/home/lesstif/data /home/lesstif/backup/
Remote 의 일부만 Local 에 복제
백업 대상 폴더에 여러 개의 하위 폴더가 있고 특정 폴더만 백업이 필요할 수 있다.
예로 아래와 같이 src 에 3개의 하위 폴더가 있고 dir1, dir3 만 복제가 필요한 경우
$ tree ../src/
../src/
├── dir1
│ └── file1
├── dir2
│ └── file2
└── dir3
└── file3
trailing slash 에 따라 rsync 의 동작이 다른 점을 활용해서 아래와 같이 for 루프를 돌면서 src 의 맨 뒤에 / 를 붙여주면 dir1과 dir3 의 내용만 복제할 수 있다.
$ cd src
$ for i in dir1 dir3; do rsync -avz lesstif@example.com:$PWD/$i/ /home/lesstif/backup/$i;done
대상 파일 변경시 덮어 쓰지 않음
동기화시 목적지(destination) 파일이 수정되었을 경우 rsync 를 수행하면 source 파일로 덮어써 버린다.
즉 아래 명령을 실행하면 /lesstif/lesstif/backup/a.conf 파일이 바뀌었어도 리모트에 있는 a.conf 로 덮어써 버린다.
이 상황을 원치않을 경우 rsync 에 -u 옵션을 추가하여 실행하면 파일이 변경 되었을 경우 덮어쓰지 않는다.
$ rsync -avuz lesstif@example.com:/home/lesstif/data /home/lesstif/backup/
고급 예제
Remote 의 폴더중 일부만 Local 에 복제
아래와 같이 src 에 여러 폴더가 있고 이중에 dir1, dir2 만 복사해야 할 경우가 있다.
$ tree ../src/
../src/
├── dir1
│ └── file1
├── dir2
│ └── file2
└── dir3
└── file3
trailing slash 를 활용해서 다음과 같이 src 의 맨 뒤에 / 를 붙여주고 rsync 를 실행하면 된다.
$ cd src
$ for i in dir1 dir2;do rsync -avz lesstif@example.com:$PWD/$i/ /home/lesstif/backup/$i; done
디렉터리 구조만 복제
rsync 에 -d(소문자) 옵션을 추가하면 원본의 디렉터리 구조만 복제하고 안의 파일들은 복제하지 않는다.
$ rsync -vd lesstif@example.com:/home/lesstif/ .
진행 내역 보기
--progress 옵션을 추가하면 전송시 진행 내역을 볼 수 있다.
$ rsync -avz --progress lesstif@example.com:/home/lesstif/data /home/lesstif/backup/
ssh가 22가 아닐 경우 연결
보안때문에 SSH 를 다른 포트(예: 10022) 를 사용하는 서버에 연결시 아래와 같이 -e 뒤에 ssh와 연결할 포트를 추가하고 실행하면 된다.
$ rsync -avz --progress -e 'ssh -p 10022' lesstif@example.com:/home/lesstif/data /home/lesstif/backup/
특정 확장자만 전송
특정 파일(예: pdf)만 전송할 경우 아래와 같이 include 에 모든 파일을 의미하는 * 를 써주고 그 다음에 전송할 파일 종류(--include=*.pdf) 를 적어준 후에 마지막에 --exclude=* 로 모든 파일을 제외해주면 의도한 대로 동작
$ rsync -zarv --prune-empty-dirs --include="*/" --include="*.pdf" --exclude="*" "$from" "$to"
불필요한 파일 제외
USB 를 마운트해서 복사할 경우 휴지통이나 미리보기 데이타등의 불 필요한 파일은 --exclude 옵션으로 명시적으로 지정해서 제외해야 한다. 아래 gist 를 참고
symbolic link 처리
심블릭 링크의 경우 link 로 처리(--link)하거나 원본을 따라가서 원본을 복사(-L), 또는 제외(--no-links)하는 3가지 옵션이 있다.
link 로 처리
rsync -avz --link --progress lesstif@example.com:/home/lesstif/data /home/lesstif/backup/
참조하는 원본 복사
rsync -avz -L --progress lesstif@example.com:/home/lesstif/data /home/lesstif/backup/
link 는 제외
rsync -avz --no-links --progress lesstif@example.com:/home/lesstif/data /home/lesstif/backup/
-a 옵션 사용시 --no-links, -L, --link 옵션은 -a 뒤에 와야 함
파일이 존재할 경우 덮어쓰기(overwrite)
rsync 는 파일이 목적지에 존재할 경우 생성 시간과 크기를 비교해서 동일할 경우 건너뜀.
-I, --ignore-times 옵션을 주면 생성 시간을 확인하지 않으므로 덮어쓰기와 동일한 효과 발생
파일 덮어쓰기
rsync -avz -I --progress lesstif@example.com:/home/lesstif/data /home/lesstif/backup/
같이 보기
- scp, ssh, rsync 를 key 비밀 번호/암호 입력창 없이 사용하기
- rsync - deprecated - 리눅스를 활용한 인프라 구축의 모든 것중
Ref
- http://www.thegeekstuff.com/2010/09/rsync-command-examples/
- http://www.tecmint.com/rsync-local-remote-file-synchronization-commands/