카테고리 없음

rsync 디렉토리 동기화 / 백업

이륙합니다 2019. 9. 24.

ftp 로 계속 업로드하지 않고, 동기화 하고 싶었드아.

드롭박스는 드롭박스 안에 htdocs 가 있어야 해서 탈락.

 

copy 와 같다 생각하면 됨.

 

rsync -avz     원본위치           복사위치

 

rsync -avz kang@ip주소:/var/www/sirasony/public_html /var/www/html

 

옵션(-avz)

 

 - a : 

(-r)지정된 원본디렉토리 이하의 모든 디렉토리와 파일,

심볼릭 링크(-l), 장치파일(-D)까지 모두 사본생성경로로 원래 권한(-p), 시간(-t),그룹(-g), 소유자(-o) 권한을 유지한채 복사하란 뜻입니다.  다음과 동일. rsync -r -l -p -t -g -o -D

-v : verbose 실행과정 내용을 가능한 상세히 보여 달라는 뜻입니다.

-z : 전송데이터 량을 줄이기 위해 전송중 압축을 하라는 내용입니다. 최종 복사된 파일이 압축되는 것은 아닙니다.



정기적 백업의 자동화 cron

 

cron 의 실행하는 스케쥴표는 crontab  명령으로 작성할 수 있습니다.

 

$crontab -e

 

아마도 처음 crontab을 실행한다면 어떤 에디터를 사용할지 물어 볼겁니다. 익숙한 에디터를 선택하시면 됩니다.  그러면  crontab은 하나의 설정파일을 열어 줍니다.

 

해당 파일에 작업 command 를 추가 해주면 되는 데 형식은 다음과 같습니다.

 

#분 시 일 달 요일  command

#30 1 2 3 *   rsync ...  # 3월 2일 1시 30분에  rsync ...를 실행한다. (특정일 실행)

#10 2 * * 1  rsync ...     #  매주 첫날 2시 10분에 rsync...를 실행한다. (주 단위 실행)

#0 3 *  * *   rsync ...    # 매일 3시 정각에 rsync... 를 실행한다.  (매일 실행)

 

즉 위처럼 원하는 스케쥴에 rsync 실행줄을 넣어 주면 되는 겁니다.   (맨앞 # 코멘트 표시는 제거해야죠 ^^)

 

여기에 좀더 세련된 관리 방법을 넣어 보겠습니다.

 

7일 단위 증분 백업하면서 동기화하기

 

위 말이좀 헷갈리죠?

 

  이 말뜻은  매일 동기화를 해서 원본과 맞추되.  만약에 특정 변경된 파일이 문제가 있어 복원 필요한 경우 해당 파일을 적어도 일주일 전까지는 되돌릴 수 있도록 따로 변경분만 별도 백업 한다는 뜻입니다.

 

어떻게?

 

--backup   이란 옵션을 사용하면 됩니다.

 

 이 옵션을 사용하게 되면 원본에 동기화를 할때 변경이 발생해서 덮어쓰이게 되는 경우 이전파일을 다른 이름으로 바꾸거나(--suffix 옵션)  다른 디렉토리로(--backup-dir)로 옮겨 놓을 수 있도록 하는 명령 입니다.

 

즉, 바뀌게 되는 파일만 또 다른 공간으로 살려두게 되는 것이죠. 

 

그런데 이 옵션만으로는 좀 세련되게 하기가 안되므로 간단히 스크립트를 만들고 이 스크립트를 실행하는 명령을  crontab 으로 등록하겠습니다.

 

아래 스크립트입니다.   http://rsync.samba.org/examples.html  있는 예제를 좀더 간단하게 바꾸었습니다.

 

#!/bin/sh

 

SRCPATH=/src

 

BACKUPHOME=/backup

 

#동기화 제외 대상 목록을 넣을 파일

EXCLUDES=$BACKUPHOME/exclude_files.txt

 

# 일요일, 월요일, 화요일 ... 토요일 또는 영문으로 (sunday ... )

BACKUPSUB=`date +%A`     

 

OPTS="--force --ignore-errors --delete-excluded --exclude-from=$EXCLUDES  

          --delete --backup --backup-dir=$BACKUPHOME/$BACKUPSUB -a"

 

export PATH=$PATH:/bin:/usr/bin:/usr/local/bin

 

rm -rf  $BACKUPHOME/$BACKUPSUB/*

 

# 동기화 실행 진행

rsync $OPTS $SRCPATH  $BACKUPHOME/current

 

이 파일을  /backup/runrsync.sh  실행가능한 파일로 저장합니다.

 

그리고  요일별로 변경분만 백업될 디렉토리를 미리 만들어 주어야 합니다.

 

$mkdir /backup/일요일  /backup/월요일 /backup/화요일 /backup/수요일  /backup/목요일 /backup/금요일  /backup/토요일

 

 

$crontab -e 

 

실행 후 아래 처럼 추가해줍니다.

#0 2 *  * *   /backup/runrsync.sh

 



출처: https://funnylog.kr/439 [퍼니로그]

 

# 한 서버에서 다른 서버의 디렉토리 동기화 하기
1) ssh 또는 rsh를 사용하는 방법(데이터 전송시 암호화 적용)
$ rsync  -avz   root@호스트네임:/AAA/fies   /BBB
또는
$ rsync -avz    호스트아이피:/AAA/files    /BBB

2) rsync 데몬을 사용하는 방법(데이터 전송시 암호화 없음. inetd 서비스가 실행상태여야함)
$ rsync -avz   호스트아이피::/AAA/files    /BBB

만약 rsync를 사용해서 /AAA/files의 어떤 파일을 삭제했을 때 destination 디렉토리에서도 지워지길 원하는 경우 아래와 같은 명령어 사용.
$ rsync -av --delete  /AAA/files  /BBB


서버간 동기화를 해야 하는 경우 아래의 사항 참고

[Source 서버용]
1. rsync 설치
2. rsync 설정(/etc/default/rsync)
3. rsync.conf 생성 및 아래 구문 복사 후 붙여넣기
   $ sudo nano /etc/rsyncd.conf
  
log file = /var/log/rsync.log            # 로그 파일 경로
[source]                                         # 부르고 싶은 명칭
path = /var/www/omeka1/files       # 소스 디렉토리 설정
uid = root                                       # rsync 사용 가능한 사용자
gid = root                                       # rsync 사용 가능한 그룹
use chroot = yes                            # chroot 사용여부
host allow = x.x.x.x                        # 해당 호스트 아이피만 접근 가능
max connection = 100                   # 최대 연결 개수
timeout 300                                    # 타임아웃 시간 설정



[Destination 서버용]
1. rsync 설치
2. rsync 설정(/etc/default/rsync)
3. rsync 명령어 실행
    문법은 rsync -avz 소스서버아이피 또는 도메인주소::부르고싶은명칭  목적지경로
    아래와 같이 작성하고 엔터.
    
     $ rsync  -avz   소스서버아이피::source    /var/www/omeka2


내가 사용한 명령어는 아래와 같다. rsync -av --exclude=.svn --delete --delete-excluded /source /destination

위와 같은 명령어를 사용할 수 있다.

각 옵션은 rsync -h 로 설명을 보고 꼭 확인해 보기 바란다. 일단 위에 쓴 것만 설명하면,

-a : 설명을 보면 아카이브 모드라고 써 있다. 이 옵션을 빼고 실행하니까 -r이나 -d 옵션을 주지 않으면 실행이 안 된다고 에러가 떴다. -r은 디렉토리로 재귀한다(recurse into directories)고 설명돼 있다. 하위 폴더까지 복사한다는 말이다. -d는 재귀하지 않고 디렉토리를 옮긴다(transfer directories without recursing)고 써 있다. 하위 디렉토리를 복사하지 않는다는 걸로 이해된다. 이렇게 하면 디렉토리‘만’ 옮기는 것 같다. 여튼 다른 블로그에서 봤을 때 -a가 옵션으로 붙어 있었으므로 나도 사용했다. 그 뿐이다.

-v : -av는 a 옵션과 v 옵션을 동시에 사용한 거다. v 옵션은 작업 상황을 텍스트로 보여주라는 옵션이다. 이 옵션을 주지 않으면 작업이 성공했다는 메세지도 안 나온다. 원래 쉘은 그런 거다. 아무 반응이 없으면 성공인 거다.

--exclude=.svn : .svn은 빼고 동기화 하라.

--delete : 원본 소스에 없는 놈은 목표 폴더에서도 지워라.(원본 폴더에서 지운 파일이 있다면 백업쪽에도 반영시키라는 말이겠죠?)

--delete-excluded : --exclude에 지정된 놈도 목표 폴더 쪽에서 지워라.(백업할 필요 없는 놈은 백업하지 말라는 말이죠 ㅋ)

이상이다.

윈도우에서 사용하기

자료를 백업하기 위해서 1테라짜리 하드를 하나 사 뒀다.

이놈을 네트워크 드라이브인 z로 잡아 뒀다.

처믐엔 allway sync 같은 프로그램을 이용하려고 했지만, 이놈은 처음엔 무료고 일정 용량 이상 싱크를 하면 더이상 사용을 하지 못하는 놈이었다. 당했다 ㅡㅡ;;

그래서 이놈저놈 찾다가 그냥 rsync를 이용하기로 했다. 최고로 안정적인 무료 프로그램 아닌가 ㅡㅡ;;

그리고 난 프로그래머! cui따위 두렵지 않아!!! ㄷㄷㄷ;;

그래서 일단 윈도우에서 rsync를 사용하기 위해 cygwin을 설치했다.

cygwin은 윈도우에서 unix 프로그램들을 사용할 수 있게 해 주는 프로그램이다. 좀 눈이 돌아갔지만 무사히 설치했다.

그리고 아래 명령어를 이용해서 깔끔하게 끝냈다.

rsync -av --delete /cygdrive/c/backup /cygdrive/z

이상!

원격에서 하기

원격 rsync 는 ssh를 사용한다. 서버컴에서 192.168.0.2 의 ~/backup 폴더로 백업할 때 아래 명령을 사용하면 된다. 192.168.0.2 원격 컴퓨터의 사용자 이름은 mytory 라고 가정한다.

rsync -avzO /serverComputer/backup mytory@192.168.0.2:~/backup

-z 옵션은 전송시 압축을 해서 보내라는 거다. 그럼 받는 쪽에서 압축을 푼 다음에 받게 될 거다.(아마)

~/backup 에서 ~ 기호는 home 폴더를 의미한다. cd ~ 라고 터미널에 쳐 보라.

위 명령을 치면 암호를 입력하라고 나온다. 암호 입력 과정을 생략하고 싶다면, ssh 사용시 암호 입력 과정을 생략할 수 있도록 키를 생성하는 방법을 참고하라.



# Crontab을 활용한 주기적이고 자동적인 파일 동기화
크론탭을 열고 아래의 명령어 예시와 같이 원하는 시점으로 작성
분/시/일/월/요일 순으로 작성
$ crontab -e

[명령어 입력 예시]
15 2 30 7 *   rsync -avz  /AAA/files  /BBB      # 7월 30일 2시 15분에  rsync 실행

15 2 * * 1     rsync -avz  /AAA/files  /BBB      #  매주 첫날 2시 15분에 rsync 실행

0 1 *  * *       rsync -avz  /AAA/files  /BBB      # 매일 1시 정각에 rsync 실행

0-59/1 * * * *   rsync  -avz   소스서버아이피::source    /var/www/omeka2   # 1분마다 rsync 실행

댓글