출처 : http://comafire.springnote.com/pages/1689674

소개

백업의 중요성은 아무리 강조해도 지나치지 않는다.오늘 멀쩡하던 하드가 내일은 멀쩡하리라는 보장이 없기 때문이다.전문적으로 백업하는 툴도 존재하지만 여기서는 백업의 정책 결정 방법 및 tar 의 스냅샷 기능을 이용한 증분백업과 cron 을 이용해 백업의 자동화하는 방법을 알아보기로하겠다.

백업용어

  • 풀 백업 (full backup): 자신이 백업하고자 하는 대상의 전체를 백업하는 방법
  • 증분 백업 (incremental backup): 원본 데이터와 비교하여 원본데이터에 추가되어진 데이터만 백업하는 방법

 

백업정책

백업에 들어가기전에 염두해두어야 할 사항들을 정책으로 정리해 보았다. (인터넷에서 펌~)

  1. 어떤 파일들을 백업할 것인가?
    백업은 시스템에 어떤 위험이나 재난이 닥쳤을 때 중요한 데이터를 안전하게 보호하기 위해 하는 것이다. 어떤 데이터가 중요한지 파악하고 어떤 데이터를 백업할지 결정하는 것은 각자 시스템에 있는 데이터용도와 가변성에 따라 다를 것이다. 하지만 일반적으론 중요한 데이터베이스등 주로 가변적인 데이터를 백업하는 것에 초점을 둘 것이라 생각한다. 즉 가변성이 떨어지는 애플리케이션이나 시스템 파일들을 매일 백업할 필요는 없다는 것이다. 물론 시간과 능력이 된다면 모든 시스템 전체를 백업 받는게 가장 좋을 것이다.

  2. 백업할 위치가 어디 인가?

    각각의 서버에 보면 설정 파일이라든지 실시간으로 계속 생성하는 파일들의 위치를 파악하는게 중요하다.

     

  3. 시스템 파일이 얼마나 자주 변경하는가?
    시스템 파일을 자세히 살펴보면 내용이 변경되거나 생성되는 것을 볼 수 있다.


  4. 누가 어디서 파일을 백업할 것인가?
    시스템 관리자가 항상 시스템 앞에 있다면 계속 살펴볼면서 백업할 수 있지만 시스템 관리자당 보통 수십대씩 관리하기 때문에 현실적으로 그렇지 못하다. 보통은 시스템 관리자가 먼저 시스템 상태를 파악하 뒤 크론(cron)이 라는 작업 스테쥴러를 실행해 시스템 본체가 아닌 다른 곳에 있는 저장 매체를 택해 원격지에서 백업을 실행한다.

     

  5. 어느 위치에 자료를 복구할 것인가?
    자료복구는 백업할 때 그 파일 위치에 복구하는 게 가장 현명한 방법이다.

     

  6. 복구할 파일을 얼마나 빠르게 복구해야 하는가?

    시스템 관리자는 항상 신속 정확해야 한다. 백업 파일을 시스템에 복구할때는 많은 사용자들이 피해를 최대한 피하기 위해 신속하고 정확하게 복구를 완료해야 할 것이다.

 

tar 이용방법

tar

테 이프 생성을 위한 유틸리티로서 바이너리 데이터를 처리할 수 있다. 또한 여러 디렉토리를 아카이브로 묶을 수 있으며 링크를 포함하는 디렉토리들을 전송할 수 있으면서도 파일의 소유권과 액세스 퍼미션 등도 그대로 보존할 수 있는 장점이 있다.

 

간단한 tar의 사용법( tar의 플래그)

  • c : 아카이브 생성
  • x : 아카이브로 부터 파일 추출
  • t : 목차 테이블 보기
  • v : 상세한 정보 출력

 

$ cd /
$ tar -cf backup.tar home
$ gzip backup.tar

/home 의 하위디렉토리를 포함하여 backup.tar로 저장 하고 backup.tar.gz 이라는 파일을 생성하여 원래의 tar 아카이브보다 훨씬 더 작게 압축 $ tar -cvf - home | gzip > backup.tar.gz 을 하였을때는 tar에 따라서 v(verbose) 옵션을 stderr로 처리하지 않고 stdout으로 처리하여 문제를 일으키는 경우가 있다 따라서 아카이브를 만들때는 v옵션을 빼는 것이 좋고, 아카이브를 풀 때는 v 옵션과 관계가 없다.

$ tar -tf backup.tar

아카이브를 풀기전에 항상 파일들의 이름을 먼저 검사한다 만일 아카이브 소그이 파일들이 현재 디렉토리에 풀리도록 묶여 있다면, 임시 디렉토리를 새로 하나 만들고, 그곳으로 이동(cd)하여 파일들을 풀어낸다.

 

일부 파일들만 뽑아내기

$ tar -xvf backup.tar filename
$ tar -xvf backup.tar `tar -tf backup.tar|grep filename`

여 기서 filename은 tar의 t옵션으로 파일의 경로명까지 알아야 한다. filename과 ./filename은 서로 다르므로 정확한 파일명을 지정해야 한다. $ tar -xvf backup.tar `tar -tf backup.tar|grep filename` 의 방법을 쓰는 것도 좋다.

절대 경로 문제

절 대경로를 갖는 디렉토리 또는 파일을 복구할때 문제가 발생한다. tar는 아카이브에 지정되어 있는 경로명으로 파일을 복구하기 때문에 파일이 복구될 곳을 변경할 수가 없다. 따라서 이미 존재하는 파일을 덮어쓰거나 퍼미션 문제가 발생할 수 있다. GNU tar의 경우, 기본적으로 모든 절대 경로명을 상대경로 변경하여 아카이브를 만든다. --absolute-names 옵션을 사용하면 절대 경로로 아카이브를 만든다. 가장 좋은 방법은 아카이브를 만들때 디렉토리가 슬래시(/)나 틸드(~)로 시작하지 않도록 조심하는 것이다.

$ tar -cf backup.tar -C / .
$ tar -cf backup.tar -C /home/smiletw . -C /home/woody ./test

-C 옵션은 아카이브를 생성하기 전에 /로 이동하도록 한다. 여러 개의 디렉토리들을 아카이브로 만들려면 -C옵션을 여러번 사용한다.

아카이브에 추가하기

 $ tar -uvf backup.tar home

새로운 파일들만 업데이트 한다. 동일한 파일이 업데이트 되면 아카이브 마지막에 추가한다. (테입장치에서는 중간에 넣을 수 없는 것을 감안)

 

GNU tar를 이용한 풀백업 및 증분 백업

일 반적으로 tar를 이용해서 아카이브를 만들면 풀백업이 된다. 그러나 사용자 홈디렉토리 또는 한 파티션 전체를 백업할때는 풀 백업을 자주 사용하기 힘들다. 이럴경우 풀 백업과 함께 증분 백업을 해 주는 것이 좋다. GNU tar는 옵션 처리만으로 손쉽게 풀백업과 증분 백업이 가능하게 해준다.먼저 GNU tar의 풀 백업 및 증분 백업에 쓰이는 옵션이 2가지 있다. -G (--incremental) 옵션과 -g snapshot-file (--listed-incremental) 이 그것이다. -G 옵션은 예전 증분 백업 포맷으로 아카이브를 생성해 준다. 이 옵션으로 생성된 아카이브에는 아카이브 내에 포함되어 있는 파일이나 디렉토리의 정보가 들어가므로 비표준 아카이브로 생성된다. 따라서 GNU버젼이 아닌 tar로도 내용을 볼 수가 없게 된다. -g snapshot-file 옵션은 표준 아카이브로 생성되면서, 파일이나 디렉토리 등의 정보를 snapshot-file에 따로 저장함으로써, 표준 아카이브를 생성하게 만들어 준다. 따라서  GNU tar를 이용한 풀 백업 및 증분 백업에서는 -G 옵션이 아닌 -g snapshot-file 옵션을 사용하는 것이 좋다.

풀 백업

 $ tar -g list -czvf backup.tar.gz home/

list 라는 snap-shot 파일이 생성된다. 그리고 backup.tar.gz이라는 백업된 아카이브가 생성된다.<br>

증분 백업

 $ tar -g list -czvf backup-1.tar.gz home/

기존의 list 파일에서 이미 풀 백업된 내용을 확인하고, 그 이후에 변경되거나 추가되거나 삭제된 파일들을 backup-1.tar.gz에 백업한다.

 

GNU tar를 이용한 복구

먼저 풀 백업된 아카이브를 복구한다.

$ tar -g list -xzvf backup.tar.gz

다음으로 증분 백업된 아카이브들 중 가장 최근에 백업한 것만 복구하면 된다.

$ tar -g list -xzvf backup-10.tar.gz

 

백업 및 복구의 유용한 옵션

-W (--verify) 검증
백업을 하는 도중 변경되는 파일이 있을 경우가 있다. 특히 풀 백업과 같이 시간이 오래 걸리는 백업의 경우 아카이브가 생성되는 동안 변경될 가능성이 높다. 따라서 풀 백업의 경우 검증해주는 것이 좋다.

$ tar -g list -cWf backup.tar home/

이 경우 아카이브 생성 후, 아카이브의 내용과 실제 디렉토리의 내용과 같은지 확인한다. 그러나 gzip으로 압축하는 -z 옵션과 같이 사용할 수 없다. 따라서 검증 옵션을 사용해서 아카이브를 생성할 경우 gzip압축은 따로 해주어야 한다.

백업 자동화

관 리하는 서버가 별로 없다면 취미삼아 한대 한대씩 수동으로 백업해주어도 상관 없지만, 자신이 관리하는 서버가 여러대일경우 위에서 이야기한 나름대로의 백업 정책을 세워서 자동화 시켜 놓지 않는다면 백업은 불가능하다. 여기서는 예로 서버백업정책을 설정하고 쉘 스크립트와 Cron(크론)을 이용해 자동으로 백업이 되도록 꾸며 보겠다.

백업 정책

백업소스 디렉토리 : /home 전체
사용자가 많지 않고 /home 안에 웹및 디비 그리고 사용자정보를 모아 놓았기때문에 /home 전체를 백업하기로 결정 하였다.

백업타겟 디렉토리 : /juvat-backup
백업본을 보관할 디렉토리로 될수 있으면 다른 파티션을 준비하고, 여유가 된다면 다른 물리적 드라이브에 저장하는 것을 추천한다.

 

백업용 리모트 서버 : mirror.juvat.net
한 서버안에 모든 원본 및 백업본이 존재한다면 한번에 모든 정보를 날릴수 있으므로 FTP 를 이용해 주기적으로 리모트 서버에 백업파일을 저장한다.

백업방법 : tar 를 이용한 풀백업 및 증분백업
전체 풀 백업을 뜨면서 생성한 스냅샷 파일을 이용해 증분 백업을 하는 형식으로 백업한다.

백업주기 : /home 안의 상황이 실시간으로 중요한 정보가 없기때문에 1일을 주기로 백업하기로 하였다.
매월 1일에 풀 백업, 달의 나머지일은 증분 백업, 백업파일은 2개월치를 로컬 서버에 보관, 매일 백업본을 FTP로 리모트 서버에 백업

백업 쉘 스크립트 제작

예제로 실제 제작한 스크립트 소스를 보자.

<source lang="perl">
#!/bin/sh
#
# comafire's Backup Script
# last modify : 03.10.26
# mail : comafire@hotmail.net
#
# *.*.1 : Full Bakcup
# *.*.2~30 : Incremental Backup
# keep : 2 month
#
DATE=$(date +%y%m%d)
YY=$(date +%y)
MM=$(date +%m)
DD=$(date +%d)
BACKUPBAS=/
BACKUPSRC="./원본 디렉토리
BACKUPDST=/백업할 디렉토리
FTPBACKUPSRC=/FTP 로 보낼 원본 디렉토리
FTPBACKUPDST=받을 FTP 서버의 백업 디렉토리
FTP=IP or DomainName
FTPSCRIPT=/etc/cron.daily/BackupFtpScript
ID=Your ID
PASSWD=Your Password


case $MM in
        01) rm -f $BACKUPDST'/'$YY'11'*.*;;
        02) rm -f $BACKUPDST'/'$YY'12'*.*;;
        03) rm -f $BACKUPDST'/'$YY'01'*.*;;
        04) rm -f $BACKUPDST'/'$YY'02'*.*;;
        05) rm -f $BACKUPDST'/'$YY'03'*.*;;
        06) rm -f $BACKUPDST'/'$YY'04'*.*;;
        07) rm -f $BACKUPDST'/'$YY'05'*.*;;
        08) rm -f $BACKUPDST'/'$YY'06'*.*;;
        09) rm -f $BACKUPDST'/'$YY'07'*.*;;
        10) rm -f $BACKUPDST'/'$YY'08'*.*;;
        11) rm -f $BACKUPDST'/'$YY'09'*.*;;
        12) rm -f $BACKUPDST'/'$YY'10'*.*;;
esac

if [ $DD = "01" ]; then
        tar -g $BACKUPDST'/'$YY$MM.list -cf $BACKUPDST'/'$DATE.tar -C $BACKUPBAS $BACKUPSRC
elif [ -f $BACKUPDST'/'$YY$MM.list ]; then
        tar -g $BACKUPDST'/'$YY$MM.list -cf $BACKUPDST'/'$DATE.tar -C $BACKUPBAS $BACKUPSRC
fi

if [ -f $BACKUPDST'/'$DATE.tar ]; then
touch $FTPSCRIPT
echo user $ID $PASSWD >> $FTPSCRIPT
echo cd $FTPBACKUPDST >> $FTPSCRIPT
echo lcd $FTPBACKUPSRC >> $FTPSCRIPT
echo bin >> $FTPSCRIPT
echo prompt >> $FTPSCRIPT
echo put $DATE.tar >> $FTPSCRIPT
if [ $DD = "01" ] && [ -f $BACKUPDST'/'$YY$MM.list ]; then
        echo put $YY$MM.list >> $FTPSCRIPT
fi
echo bye >> $FTPSCRIPT

ftp -n $FTP < $FTPSCRIPT

rm -f $FTPSCRIPT
fi

여 기서는 SFTP 대신 일반 FTP를 이용하였다. 보안을 위해서는 일반 FTP대신 SFTP 을 이용하는 것이 더욱 바람직 할 것이다. 하지만 여기서는 간단히백업의 과정을 보이기 위해서 사용하였다는것을 명심하자. 하지만 최소한 백업용 계정을 SSH 에서 로그인 할수 없도록 PAM 을 이용해 로그인을 제한한다면 패스워드가 누출 되더라도 백업본 자체에만 접근할 수 있기 때문에 꼭 PAM 을 이용해 백업용 계정의 콘솔 접근을 제어 할 것을 권장한다.