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이라는 백업된 아카이브가 생성됩니다.
증분 백업¶
$ 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로 리모트 서버에 백업
백업 쉘 스크립트 제작¶
예제로 실제 제작한 스크립트 소스입니다.
#!/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 을 이용해 백업용 계정의 콘솔 접근을 제어 할 것을 권장합니다.