2016년 9월 28일 수요일

tar를 이용한 백업

 
http://coffeenix.net/doc/misc/tar_backup.txt
[출처] http://linuxstart.co.kr/main/manual/guide/guide01_05.html (지금은 링크 없어짐)

[ tar를 이용한 백업 (1) ]


본 글에서는 tar라는 유틸리티를 이용하여 백업하는 법을 배워보기로 한다. 


tar를 통해 우리는 파일을 백업할 수 있고 복원할 수 있다. tar와 cron을 
연동해서 잘만 사용하면 비싼 백업유틸리티를 사지 않아도 훌륭한 
백업작업을 할 수 있다. 

우선 tar 명령어를 사용하는 법 부터 배워 보자.



O tar 옵션 정리



사용법: tar 옵션 파일1 [파일2 파일3 ...] 디렉토리1 [디렉토리2 
디렉토리3 ...] 

-c 디렉토리를 포함하여 여러개의 파일들을 묶을 때 사용한다(Create). 

-x 디렉토리를 포함하여 묶인 파일의 압축을 풀겠다는 것을 tar에게 
알린다(eXtract). 
-t tar 파일안에 있는 파일이나 디렉토리 목록을 볼 때 사용하는 
옵션이다(lisT). 
-f <파일명> 
파일을 묶을 때는 출력 파일, 파일의 압축을 풀때는 입력 파일을 이 
옵션 뒤에 써 준다(File). <파일명>에는 /dev 디렉토리 밑의 
장치명이 올 수도 있다. 이 때는 그 장치명에 해당하는 장치를 
출력으로 하거나 입력으로 한다. 
-v 작업 진행 상황을 화면에 표시한다(Verbose). 
-C <디렉토리> 
tar 동작을 개시하기 전에 명시한 <디렉토리>로 디렉토리를 바꾼 후 
작업한다. 기본적으로 현재 디렉토리를 대상으로 작업하지만 다른 
디렉토리에 압축을 풀 때 유용한 옵션이다. 
-M -f 옵션 뒤에 미디어 장치명(플로피나 DAT같은)이 올 때 멀티 볼륨 
백업을 하거나 복원할 때 사용한다(Multi-volume). 파일이 
많아서 한장의 미디어로 모든 파일을 백업이나 복원할 수 없을 
때 사용한다. 
-G 이 옵션은 부분 백업(incremental backup)할 때 사용한다. 
부분 백업은 어떤 기준을 정하고 그 기준과 다른 파일들만 
부분적으로 백업하는 것을 말한다. 
-V <볼륨명> 
볼륨명을 정한다. 현재 백업되어 묶인 파일에 특별한 이름을 
부여하는 것이다. 
-N <날짜> 
지정된 날짜 이후에 만들어진 파일이나 디렉토리를 대상으로 
한다(Newer). 



O 파일을 묶어 보자. 



다음 처럼 하면 파일을 묶을 수 있다. 

$ tar -c -v -f ex1.tar file1 file2 dir1/ dir2/ 

위의 예는 file1, file2 두개의 파일과 dir1과 dir2 두개의 디렉토리를 
위디렉토리를 포함하여 한개의 파일인 ex1.tar(`-f ex1.tar')로 묶어 
주라(`-c')는 것이다. 진행상황(`-v')도 화면에 표시한다. 

뒤에 오는 file1, file2, dir1, dir2에는 얼마든지 묶고자 하는 
파일이나 
디렉토리 목록이 올 수 있으며, 그 순서는 상관없다. 

다음처럼 하면 

$ tar -c -v -f ex2.tar file3 file4 /home/sylee/dir3 
/home/sylee/dir4 

/home/sylee/dir3, /home/sylee/dir4 디렉토리를 묶는 것이지만 실제로 
묶을 때는 제일 앞의 '/'을 제거한다. 즉 절대 경로명이 아니라 상대 
경로명으로 묶게된다. 잠시 후에 알아 보겠지만 절대 경로가 아니라 상대 
경로로 기록해 두게 되면 사용자가 풀고자 하는 디렉토리를 정할 수 있게 
된다.


[ tar를 이용한 백업 (2) ]



O 파일을 풀어 보자. 



다음 처럼 하여 파일을 푼다. 

$ tar -x -v -f ex1.tar 

위의 예는 ex1.tar를 현재 디렉토리에 푼다. 현재 디렉토리에 file1, 
file2 두개의 파일과 dir1, dir2 두개의 파일이 생성될 것이다. 현재 
디렉토리에 사용자가 쓰기 권한이 있어야 함은 물론이다. 

다음 처럼 하면 어떻게 될까? 

$ tar -x -v -f ex2.tar -C /home/sylee/tmp 

이 경우에는 /home/sylee/tmp 라는 디렉토리에 file3 file4 두개의 
파일이 풀리고 home/sylee/dir3(절대 경로로는 
/home/sylee/tmp/home/sylee/dir3), home/sylee/dir4(절대 경로로는 
/home/sylee/tmp/home/sylee/dir4)라는 두개의 디렉토리가 생성된다. 

다음 처럼 하여 모든 파일을 뽑아 낼 것이 아니라 원하는 파일만 뽑을 
수 있다. 

$ tar -x -v -f ex2.tar -C / home/sylee/dir3 

/home/sylee/dir3가 아니라 home/sylee/dir3 임을 유의하자. 먼저 / 로 
디렉토리 를 옮긴 후 home/sylee/dir3 라는 디렉토리를 푼다. 유의할 것은 
다음 처럼 사용 하면 안된다. 

$ tar -x -v -f ex2.tar home/sylee/dir3 -C / 


위에서 옵션을 분리해서 사용했다. 다음처럼 붙여 사용하여도 된다. 

$ tar xvf ex2.tar -C / home/sylee/dir3 

파일을 묶을 때도 마찬가지이다. 



O 부분 백업 



백업용 장비로 DAT같은 것도 많이 사용하고 있다. DAT는 리눅스에서는 
/dev/st0로 인식된다. 

DAT로 특정한 날짜 이후로 바뀐 파일을 백업하고 싶다면 다음처럼 한다. 


$ tar -c -v -M -f /dev/st0 -N '3 Oct 1999' \ 
> -V "backup from 3 Oct 1999" -G / 
$ 

정리하여 설명하면, 
1. DAT로 백업하기 위해서 `-f /dev/st0'처럼 쓴다. 
2. DAT가 여러장 필요할 지도 모르므로 `-M' 옵션을 사용하였다. 
3. 1999년 10월 3일 이후로 바뀐 파일들만 백업하기 위해 `-N '3 Oct 
1999'' 
처럼 적어 주었다. 
4. 1999년 10월 3일 이후의 부분 백업임을 알기 위해 볼륨명을 
"backup from 3 Oct 1999"로 주었다. `-V "backup from 3 Oct 
1999"'처럼 
적어 주면 된다. 
5. 부분 백업이므로 `-G' 옵션을 준다. 

주) 위의 경우에는 파일 시스템 전체(`/')를 백업하였다. 백업하고자 
하는 
디렉토리 목록을 정한 뒤, 그 디렉토리만 뒤에 적어 주면 될 
것이다. 


자, 좀더 생각을 해 보자. 1 주일 후에 동일한 방법으로 백업하기 
위해서는 
tar 옵션에 `-N '3 Oct 1999'' 대신, `-N '10 Oct 1999'로 주면 될 
것이다. 
다음 처럼. 

$ tar -c -v -M -f /dev/st0 -N '10 Oct 1999' \ 
> -V "backup from 3 Oct 1999" -G / 
$ 

하지만 매번 백업을 받을 때마다 오늘 날짜를 생각해 주어야 하나? 
지난번 백업 날짜를 자동으로 알아내어 그 이후로 바뀐 파일만 백업할 
수는 없을까? 있다. 간단히 백업할 때 현재 날짜를 파일에 기록하면 될 
것이다. 다음 번에 백업할 때는 이 파일을 참조하여 부분 백업 받으면 될 
것이다. 현재 날짜는 date라는 명령어로 얻을 수 있다. 

$ date +"%d %b %Y" 
13 Oct 1999 

위의 명령어의 결과를 쉘변수에 저장해 두고 활용하자. 쉘변수에 
저장하는 
이유는 나중에 날짜를 파일로 다시 저장하기 위해서이다. 

다음 처럼 하면 쉘변수 `NOW'에 현재 날짜가 기록된다. 

$ NOW=`date +"%d %b %Y"` 

다음 처럼 하면 파일에 현재 날짜를 기록할 수 있다. 

$ echo $NOW > /.last_week 

위에서 처럼 하여 다음 백업할 때 "최근 백업 날짜"를 알아 낼 수 있다. 

최근 백업 날짜를 알아 내는 이유는 "최근 백업 날짜" 이후로 바뀐 
파일만 부분 백업할 것이기 때문이다. 최근 백업 날짜는 다음 처럼 얻을 수 
있다. 역시 쉘변수로 저장한다. 

$ THEN=`cat /.last_week` 

자 그래서, 다음번에 백업할 때는 다음과 같은 단계를 거치면 될 
것이다. 

$ NOW=`date +"%d %b %Y"` 
$ THEN=`cat /.last_week` 
$ tar -c -v -M -G -f /dev/st0 -V "Backup from \"$THEN\" to 
\"$NOW\"" \ 
> -N "$THEN" / 
$ echo $NOW > /.last_week

  
[ tar를 이용한 백업 (3) ]



O 백업 시나리오 



여러분이 서버 관리자라고 하자. 그러면 백업은 서버 관리자로서 필수 
사항이다. 제일 처음에 완전백업(full backup)을 받는다. 시스템의 모든 
파일을 백업받는다는 말이다. 다음처럼. 

$ tar -c -v -M -f /dev/st0 / 

완전백업본을 만약에 대비해서 2개 정도 만들어 둬도 좋다. 그리고 
정기적으로 완전백업본을 받아 두는 것도 좋을 것이다. 

완전백업을 받았으면, 월별 백업, 주별 백업, 일별 백업을 받는다. 각각 
지난달 1일 이후, 지난 주 월요일, 어제 이후로 바뀐 파일들을 백업 받는 
것이다. 

월별로 백업 받기 위해서 부분 백업 스크립트를 하나 작성하자. 매달 
1일에 돌리는 것으로 한다. 파일명은 month_back.sh로 하자. 

#!/bin/bash 
NOW=`date +"%d %b %Y"` 
THEN=`cat /.last_month` 
tar -c -v -M -G -f /dev/st0 -V "Backup monthly from \"$THEN\" to

\"$NOW\"" \ 
-N "$THEN" / 
echo $NOW > /.last_month 


주별로 백업 받기 위해서 부분 백업 스크립트를 작성하면 다음과 같다. 
월별 백업과 거의 같다. 매주 월요일날 돌리는 것으로 한다. 파일명은 
week_back.sh로 하자. 

#!/bin/bash 
NOW=`date +"%d %b %Y"` 
THEN=`cat /.last_week` 
tar -c -v -M -G -f /dev/st0 -V "Backup monthly from \"$THEN\" to

\"$NOW\"" \ 
-N "$THEN" / 
echo $NOW > /.last_week 


하루 하루 부분 백업 받기 위해서는 다음과 같다. 파일명은 day_back.sh로 
한다. 

#!/bin/bash 
NOW=`date +"%d %b %Y"` 
THEN=`cat /.last_day` 
tar -c -v -M -G -f /dev/st0 -V "Backup monthly from \"$THEN\" to

\"$NOW\"" \ 
-N "$THEN" / 
echo $NOW > /.last_day 


스크립트는 거의 같다. 중요한 것은 각각의 스크립트를 주기적으로 한달에 
한번, 한 주에 한 번, 하루에 한번 실행시키면 된다. 정기적으로 무언가를 
하기 위해 우리는 cron 유틸리티를 활용하면 된다. 

다음처럼 해서 간단히 cron에 작업을 등록할 수 있다. 

# chown root.root month_back.sh week_back.sh day_back.sh 
# chown u+x month_back.sh week_back.sh day_back.sh 
# cp month_back.sh /etc/cron.monthly 
# cp week_back.sh /etc/cron.weekly 
# cp day_back.sh /etc/cron.daily 


위와 같이 하면 한달에 한번 /etc/cron.monthly의 month_back.sh을 
실행한다. 
week_back.sh과 day_back.sh은 한주에 한번, 하루에 한번 crond에 의해 
실행된다. 

하루에 한번 실행될 때 몇시 몇분에 실행될 것인가를 정해주기 위해 
/etc/crontab을 편집하면 된다. 

[cornerstone@sylee:/etc/cron.daily] cat /etc/crontab 
1 SHELL=/bin/bash 
2 PATH=/sbin:/bin:/usr/sbin:/usr/bin 
3 MAILTO=root 
4 HOME=/ 
5 
6 # run-parts 
7 01 * * * * root run-parts /etc/cron.hourly 
8 00 1 * * * root run-parts /etc/cron.daily 
9 00 3 * * 0 root run-parts /etc/cron.weekly 
10 00 5 1 * * root run-parts /etc/cron.monthly 

위의 파일에서 7행에서 10행까지를 알아보자. 작업을 적어주는 양식은 

<분> <시> <일> <월> <요일> <실행할명령어> 

이다. 7행은 매시간 실행할 작업을 /etc/cron.hourly라는 디렉토리에서 
찾아서 실행하라는 것이다. 매시 1분에 실행된다. 8행은 매일 새벽 1시에 
/etc/cron.daily라는 디렉토리내의 스크립트를 실행하라는 것이다. 9행인 
경우에는 매월, 매일 새벽 3시에 무엇을 할 것 같지만 5번째 필드인 
<요일>필드의 값이 0 이므로 1주일에 한번 일요일에 /etc/cron.weekly 
디렉토리내의 스크립트를 실행하라는 것이며, 시간은 새벽 3시이다. 10행은 
독자의 해석에 맡기겠다. 

참고로 <분>은 0-59, <시>는 0-23, <날짜>는 0-31, <달>은
0-12(0또는 
12는 12월, 1은 1월...), <요일>은 0-7(0과 7은 일요일, 1은 월요일...)로 
나타낸다. 

시간대를 잘 조정하여 사용하면 된다.<끝>

댓글 없음:

댓글 쓰기