본문 바로가기
컴퓨터/리눅스

rsync : 데이터 백업 프로그램

by adnoctum 2016. 5. 5.



   rsync는 두 대의 컴퓨터의 특정 경로에 있는 파일들을 동기화시켜주는 프로그램이다. rsync를 이용하면 데이터 백업을 쉽게 할 수 있다. rsync를 이용하는 방법을 살펴 보자. 



   rsync 의 기본 사용법은 다음과 같다. 


rsync [OPTIONS] [source] [dest]


source의 내용을 dest로 복사를 해준다. 사용할 수 있는 OPTION 이 매우 많은데, 간단하게는 다음과 같이 할 수 있다. 


rsync -avz [source] [dest]


즉, archive mode 로 복사를 하며(a), 데이터를 압축해서 복사를 하고(z), 복사되는 파일을 출력해 주는 옵션(v). rsync는 파일의 변경 여부를 판단할 수 있는 매우 많은 방법을 제공하는데, 기본적으로는 파일의 마지막 수정 날짜와 파일 크기를 이용해 파일이 변경되었는지를 판단하는 것이다.  a option은 파일 권한, 파일 소유자 등을 그대로 유지시키는 옵션이다. [source]와 [dest]를 서로 다른 컴퓨터로 할 수 있는데, 이 때 네트웍을 통해서 복사를 해야 하므로 압축을 해서 전송하면 좋은 경우가 많기 때문에 z 옵션을 사용하곤 한다. 


[source]와 [dest]에는 경로를 지정하면 된다. 다음과 같은 경우를 보자. 


rsync -avz computerA.com:~/backup computerB.com:~/backup


로 하면 computerA의 backup 폴더가 통째로 computerB의 backup 폴더로 복사가 된다. 이 때, computerB의 backup 폴더가 없으면 새로 생기고, 만약 있으면 변경된 파일만 computerA에서 computerB로 복사가 진행된다. a option에는 하위 디렉토리까지 순환하면서 복사시키는 옵션이 포함되어 있기 때문에 하위 경로가 모두 복사가 된다. 만약 경로명에 슬래쉬(/)를 추가하면 그 경로 밑의 파일/디렉토리가 복사가 된다. 즉, 


rsync -avz computerA.com:~/backup/ computerB.com:~/sync


위처럼 하면 computerA의 backup 경로 밑의 파일과 폴더들이 sync의 하위로 복사가 된다. computerB의 sync 경로에는 backup 이란 경로가 만들어지지는 않는다. 


rsync는 매우 다양한 옵션을 제공한다. 특정 크기 이상의 파일은 전송에서 제외하거나, 특정 이름의 파일은 전송에서 제외하거나, 파일의 변경 여부를 파일 크기로만 판단하거나 등등등. 내가 직접 사용했던 경우들을 예로 살펴 보면 다음과 같다. 



    7  rsync -av --progress -h [address]:/disk1/Exprofile/ . --include '*/' --include 'filelist.txt' --exclude '*'

    9  rsync -av --progress -h [address]:~/Research/Exprofile/ . --include '*/' --include 'filelist.txt' --exclude '*'

   10  rsync -av --progress -h [address]:~/Exprofile/ . --include '*/' --include 'filelist.txt' --exclude '*'

  118  rsync -av --progress -h /disk1/ [address]:/disk1/ --exclude=only_nomadism --exclude=PrognosisMeasure

  119  rsync -av --progress -h /disk2/ [address]:/disk2/ --exclude=only_nomadism

  464  rsync -avh --progress /disk3/ [address]:/disk3/ --exclude=only_nomadism

  963  rsync -avzh --progress merged_matrix [address]:~


 118  rsync -av --progress -h /disk1/ [address]:/disk1/ --exclude=only_nomadism --exclude=PrognosisMeasure
  461  rsync -avh --progress /disk1/ [address]:/disk1/ --exclude=only_nomadism --exclude=PrognosisMeasure
  463  rsync -avh --progress /disk2/ [address]:/disk2/ --exclude=only_nomadism
  963  rsync -avzh --progress merged_matrix [address]:~

 590  rsync -avz --progress -h [address]:/disk3/GEO_Human/group_config/* . --exclude=merged_matrix --exclude=merged_matrix2

  594  rsync -avzh --progress -c attribute [address]:/disk3/GEO_Human/group_config/

  597  rsync -avzh --progress -c config [address]:/disk3/GEO_Human/group_config/

  598  rsync -avzh --progress -c attribute [address]:/disk3/GEO_Human/group_config/



--progress를 사용하면 복사되는 진행 상황(전송량/남은 시간) 등을 볼 수 있다. 
-h 를 하면 전송량(파일 크기)를 KB, MB, GB 를 사용해서 출력하고, 아니면 바이트로 출력해서 숫자만 나온다. 
-c 는 파일 변경 여부를 check-sum으로 확인한다. 그래서 시간이 매우 오래 걸리지만 매우 정확하게 파일의 변경 여부를 알 수 있는 방법이다. 
--exclude는 특정 파일/경로를 제외하기 위해 사용한다. 
--include는 특정 파일/경로만을 복사/전송하기 위해 사용했다. 
-v는 상황을 출력하기 위해 사용했다. -vv 처럼 v를 늘릴수록 많은 정보가 출력된다. 

위에는 없는데, --size-only 옵션을 이용하여 파일의 변경 여부를 파일 크기만을 이용해 확인하는 경우도 있었다, 왜냐 하면, 시간이 다른 두 대의 컴퓨터를 이용해서 복사를 진행했었는데 a 옵션을 사용하지 않았기 때문에(scp로 복사했기 때문에) 모든 파일을 변경된 것으로 인식해서 문제가 되었기 때문이다. 그리고 내가 사용한 예를 보면 z 옵션이 없는 경우가 많은데, 복사할 파일들 대부분이 이미 압축된 파일이었기 때문이다. 저 경우 보통 넷트웍을 통한 전송 속도가 초당 11MB 정도 나와서 이 속도와 압축 속도를 고려해서 z 옵션을 사용할지 결정했었다. 

   rsync는 local에서 local로도 사용할 수 있기 때문에, 만약 대용량 파일을 복사하면서 어느 정도 복사되었는지를 보고 싶을 때도 사용할 수 있다. 

rsync와 cron을 이용하면 주기적으로 자동으로 백업을 시킬 수 있다. 이 때, ssh 를 이용하면 사용자 인증이 필요할텐데, 특정 컴퓨터에서 접속할 때는 인증을 매번 하지 않게 할 수 있기 때문에 이렇게 한 후 cron에 rsync 명령어를 집어 넣으면 된다.