rsync

markyang92·2021년 5월 7일
0

linux (ubuntu/debian)

목록 보기
3/37
post-thumbnail

rsync

  1. rsyncRemote Sync의 약자로 file & directory 동기화 프로토콜이자 Unix CLI Utility
  2. 전송 시 네트웍 대역폭을 최소화하는 delta encoding algorithm을 구현해 rcpscp보다 훨씬 빠르고 효율적으로 데이터 동기화
  3. 서버 구동시 ssh나 rsh와 같은 Remote shell protocol 기반에서도 동작할 수 있어 ssh 기반으로 rsync를 사용하면 방화벽 오픈할 필요가 없이 편리하게 사용할 수 있다.
  4. rsync는 파일이 목적지에 존재할 경우 default로 ( 생성 시간 && 크기 ) 를 비교해 동일할 경우 pass
    4-1. 옵션으로 바뀌어도 덮어 쓰지 않기, 무조건 덮어쓰기 옵션 가능
  5. 특정 확장자만 전송 가능하다.
  6. 빈 디렉토리 pass 가능하다.
  7. symlink에 대한 세부 옵션 가능하다.
  • 설치
$ sudo apt update && sudo apt install rsync -y

기본 rsync 예제

  1. src의 내용은 아래와 같다.

  1. 옵션이면 dst 디렉토리가 없으면 안만들어주고 rsync 도 안된다.
$ rsync ./src ./dst
$ rsync ./src/ ./dst

  1. 옵션이면 src/* 로 아스테리스크(*)를 붙여도 src/ 내의 sub-directory는 rsync 되지 않는다.
$ rsync src/* ./dst

  1. sub-directory까지 rsync 하려면 -a(archive)나 -r(recursive)로 옵션을 줘야한다.
$ rsync -a ./src/ ./dst	# -a, -r 옵션을 사용하면 아스테리스크(*)가 필요없다.

  1. 없는 srcsrc 로 주면 당연히 에러
  • errno=23

  1. srcdst 모두 remote 로 할 순 없다.

rsync path 주의

  1. source path를 주의 해야한다.
    source path/가 있는 경우 목적지에 source path 디렉토리를 생성하지 않으니 주의!!
$ rsync -a test test_dest
            -> test_dest/test # test 디렉토리가 생긴다.
$ rsync -a test/ test_dest
                  -> test/* 내용물들이 -> test_dest/ 로 복사됨


  1. dest path는 상관 없다.
    • $ rsync -av src dst
    • $ rsync -av src dst/ 같음

파일 이름이 d/c 라면?

  1. dst에 이미 d/c라는 '이름'의 '파일' 이 있다.
  2. src에는 d 디렉토리에 a, b 파일 이 있다고 가정하자.
  • 그냥 rsync로 보내면 dst의 결과는 d/a, d/b, d/c를 포함하게 된다.
  • src의 디렉토리를 정확하게 복사하려면 src에 존재하지 않는 dst내 디렉토리 안의 파일들을 '삭제'하려면
    '--delete' 옵션을 넣자!
$ rsync -a --delete 

Option

option                                                      Description
-vverbose 자세한 정보 출력
-r재귀적으로 하위 디렉터리 까지 복사
(단 전송시 타임스탬프나 permission을 보존하지 않음)
-aarchive mode. '-r' + symlink를 복사해 권한, 수정시간 유지
-u파일 변경(생성 시간 || 크기)가 감지 되어도 덮어 쓰지 않음
노옵션파일 변경(생성 시간 || 크기)가 감지 되면 덮어씀
-I, --ignore-times묻고 따지지도 않고 덮어씀
-X, --xattrspreserve extended attributes
-t타임스탬프 보존
-l심볼릭 링크 보존
-p퍼미션 보존
-gg 그룹 보존
-o소유자 보존 root만 가능
-Ddevice, special 파일 보존
-z데이터 압축. cpu 속도가 느린 embedded 환경에선 오히려 overhead.
인터넷이 느린환경이면 압축한게 낫겟지?
-hhuman readable, output numbers in a human-readable foramt
--prune-empty-dirs빈 디렉토리 pass
-e 'ssh -p <port>'포트 번호 지정
--progressrsync 실행 현황을 콘솔로 출력
--log-file=FILE로그 파일을 남김
--exclude <EXCLUDE_PATH>
--exclude <PATTERN>
rsync에서 제외할 <EXCLUDE_PATH> 명시
--exclude /A/1 \
--exclude /A/2 \ 로 여러 path 명시 가능
또는 PATTERN으로 지정한 패턴에 일치하는 파일을 제외
그리고 이 옵션을 사용은 매우 주의해야하는데, 아래의 제외 항목을 꼭 살펴볼 것
--exclude=Packages\* : Packages* 관련은 제외
---exclude=".*/": 숨긴 파일 . 은 제외하기
--exclude-from=FILEFILE에 기술된 패턴과 일치하는 파일을 제외
-x, --one-file-system

이 옵션은 rsync가 재귀를 할 때, 파일 시스템 경계를 넘지 않도록 지시한다.
즉, 같은 파일시스템일 경우만 sync한다.
아래의 내용을 제한하지 않는다.

  • user가 여러 파일시스템에서 복사할 항목을 지정하는 기능
  • user가 지정한 '각 디렉토리의 계층'을 통한 rsync의 recursion
  • receiving side에서 삭제 중에 발생하는 유사한 재귀
  • 또한 rsync는 같은 device에 대한 bind 마운트를 동일한 파일 시스템에 있는 것으로 간주

    이 옵션이 반복되면, rsync는 Copy 본에서 모든 마운트 포인트 디렉토리를 생략한다.
    그렇지 않으면, 각 마운트 지점에 빈 디렉토리가 포함된다.
    마운트 포인트의 디렉토리의 속성을 액세스할 수 없기 때문에, 마운트된 디렉토리의 속성을 사용

    rsync 에서 symlink충돌
    (--copy-links │ --copy-unsafe-links을 사용했기 때문에) 표시가 뜨면,
    다른 디바이스의 디렉토리에 대한 symlink가 mount point 같이 처리된다.
    디렉토리가 아닌 symlink는 이 옵션의 영향을 받지 않는다.

    즉, rsync src 에서 다른 파일시스템(NFS나..) 이 존재시 내용물을 copy하지 않는다.
    --no-linkssrc에서 sym link가 있는 경우 sync하지 않는다.
    1. source2. dstsymlink 제외됨
    -p, --perms이 옵션을 사용하면 (-p) dstrsyncpermissionsrc와 같게 설정한다.
    이 옵션이 꺼져있다면, permission은 다음과 같이 설정된다.
  • 기존 파일(updated) 은 기존 사용 권한을 유지하지만, --executability옵션은 파일에 대한 실행 권한만 변경할 수 있다.
  • 새 파일은 dst의 기본 사용 권한(dstumask 또는 대상 디렉토리의 기본 ACL을 사용해 지정된 사용권한)으로 마스킹된 src 파일의 permission으로 설정된 일반 사용 permission을 가져오고, 새 디렉토리가 상위 디렉토리에서 setgid 비트를 상속하는 경우를 제외하고는 특수 사용 권한 비트를 사용하지 않도록 설정한다.

  • 따라서, --perms--executability가 모두 비활성화 되면, rsync의 동작은 cp, tar와 같은 다른 파일 복사 유틸리티의 동작과 동일하다.

    요약해서, dstsrcpermission를 부여하려면, --perms를 사용하라.
    새 파일에 dstpermission을 부여하려면, --perms옵션이 꺼져있는지 확인하고, --chmod=ugo=rwX를 사용한다. (마스크 되지 않은 모든 비트가 활성화되도록함)
    --remove-source-filesrsync 후, src를 제거
    -h결과를 사람이 읽기 편한 포맷으로 출력
    -H기본적으로 하드링크는 보존되지 않는다.
    -H옵션을 넣으면 하드링크가 보존된다.


    예제

    local -> local

    • workspace/my_settings 디렉토리가 생성되어 통으로 rsync

    local -> remote

    local의 /root/data 디렉토리 내용example.com/home/lesstif/backup에 복제
    호스트명(example.com) 뒤에 :가 빠지면 제대로 동작 안하니 주의

    $ rsync -av /home/mydata/ pllpokko@example.com:/home/retmote/data


    port 지정 -e 'ssh -p [port]'

    • -e 'ssh -p [PORT]
      • remote port 설정
    $ rsync -av /home/mydata/ -e 'ssh -p 8022' pllpokko@example.com:/home/remote/data


    remote -> local


    port 지정 -e 'ssh -p [port]'

    • -e 'ssh -p [PORT]

    local의 일부 -> remote

    ../src/
    ├── dir1          ←
    │   └── file1
    ├── dir2
    │   └── file2
    └── dir3          ←
        └── file3
        
    dir1, dir3만
    
    $ cd src
    $ for i in dir1 dir3; do rsync -av lesstif@example.com:$PWD/$i/ /home/lesstif/backup/$i;done

    특정 확장자만 전송

    • 특정 확장자만 전송
      • pdf 파일만 전송한다고 하자
      • include에 모든 파일을 의미하는 */를 써주고 그 다음에 전송할 파일 종류 *.pdf 적음
      • exclude*로 모든 파일을 제외하면 pdf 만 전송됨
    $ rsync -a --prune-empty-dirs --include="*/" --include="*.pdf" --exclude="*" "$from" "$to"

    빈 디렉토리 Pass

    • --prune-empty-dirs
    $ rsync -a --prune-empty-dirs --include="*/" --include="*.pdf" --exclude="*" "$from" "$to"
                ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 빈 디렉토리 pass option

    제외

    1. src에서 .git 디렉토리와 이하 파일과 디렉터리를 제외하고 보내려면 --exclude=.git
    $ rsync -a --exclude=.git
    • 주의! 진짜 경로상 .git이 들어가는 것 모든 것을 제외한다!
      • .git만 제외하고 싶은데 dir1/.git 도 제외된다.

    1. 특정 항목 한 가지만 차단하려면 다음과 같이 /로 시작하는 '절대 경로'를 넣자.
    $ rsync -a --exclude=/src/.git
    

    1. --exclude의 특징
      3.1. 원하는 만큼 --exclude 처리 할 수 있음
      3.2. 반복적으로 동일한 패턴을 사용한다면, 패턴들을 평문 파일(라인당 패턴 하나) 안에 두고 --exclude-from=<file>로 사용할 수 있다.
      3.3 item이라는 이름의 '디렉토리'를 차단하지만 '그 이름으로 된 파일들'은 포함하고 싶다면, --exclude=item/
      3.4 간단한 와일드카드를 사용할 수 있다. --exclude=t*s
      3.5. 만약 디렉토리나 파일명을 차단하고 싶지만 그 패턴이 너무 제한적이라고 생각되면 --include를 통해 또 다른 파일이나 디렉토리를 구체적으로 포함 시키도록하자.

    무결성 테스트

    1. --checksum (-c): 파일들이 동일한지 확인하기 위해, 파일의 검사 합계(대부분 독창적인 서명)을 산출한다.
      전송이 이루어지는 동안 추가적으로 I/O와 CPU리소스를 소모하지만, '동일한 크기'를 가진 중요한 데이터나 파일을 다루고 있다면 이 옵션은 필수 적이다.
    2. --ignore-existing: 이미 dst에 있는 파일들에는 영향을 끼치지 않는다.
    3. --backup (-b): dst에 있는 파일들에 영향을 끼치지 않고, 새로운 파일을 전송하기 전에 기존 파일 이름들에 '~' 접미사를 추가하여 이름을 바꾼다.
    4. --suffix=s : --backup옵션과 함께 사용되는 접미사를 ~에서 s로 바꾼다.
    5. --update (-u): src의 파일보다 더 이후의 날짜를 가진 dst 상의 어떤 파일에도 영향을 주지 않는다.

    symbolic link 처리

    심볼릭 링크의 경우 links로 처리(--links) 하거나 원본을 따라가서 원본을 복사(-L), 또는 제외(--no-links)하는 3가지 옵션이 있다.


    -a

    • $ rsync -a ./ ../backup
    • 결과

    • $ rsync --links -r ./ ../backup
    • 결과

    -L: 심볼릭링크 따라가 원본자체를 copy


    • $ rsync -a --no-links ./workspace/ ./backup
    • 결과

      symlink 제외됨

    -x: one-file-system

    1. mount point는 제외됨
    ($HOME) $ rsync -ax ./ ${USER}/backup
    1. 결과

    --chmod

    • 이 옵션은 rsync가 하나 혹은 그 이상의 comma-separated "chmod" 를 파일 퍼미션에 적용한다.
    • D를 사용하면, 디렉토리에만 적용가능
    • F를 사용하면, 파일에만 적용가능
    • 예를 들어, 모든 디렉토리들 get marked set-gid, 파일의 others는 w 권한 없게,
       This  option  tells  rsync to apply one or more comma-separated "chmod" modes to the permission of
       the files in the transfer.  The resulting value is treated as though it were the permissions  that
       the sending side supplied for the file, which means that this option can seem to have no effect on
       existing files if --perms is not enabled.
    
       In addition to the normal parsing rules specified in the chmod(1) manpage, you can specify an item
       that  should  only apply to a directory by prefixing it with a ’D’, or specify an item that should
       only apply to a file by prefixing it with a ’F’.  For example, the following will ensure that  all
       directories  get marked set-gid, that no files are other-writable, that both are user-writable and
       group-writable, and that both have consistent executability across all bits:
    
              --chmod=Dg+s,ug+w,Fo-w,+X
    
              It is also legal to specify multiple --chmod options, as each additional option is  just  appended
              to the list of changes to make.
    
              See  the --perms and --executability options for how the resulting permission value can be applied
              to the files in the transfer.

    더 많은 예제들

    https://www.lesstif.com/system-admin/rsync-data-backup-12943658.html


    rsync 주의점

    1. xargs -P 로 여러 프로세스를 실행하면, ssh key 오류가 발생할 수 있다. 따라서 rsync를 xargs로 명령 시, 적절한 프로세스 갯수를 맞추어야한다.
    profile
    pllpokko@alumni.kaist.ac.kr

    0개의 댓글