2012년 7월 8일 일요일

리눅스 백업에 대한 정리

I. 백업에 대한 정리

백업은 보안만큼이나 중요하다고 생각합니다. 시스템 관리자는 백업에
많은 관심을 기울여야 한다고 생각합니다.

처음에 백업을 할 때는 어떤 주기로 백업을 할 것인가를 선택해야 합니다.
모든 데이터를 매일 백업하는 것은 비효율적이므로 꼭 백업이 필요한
데이터만 적당한 주기로 백업하는 것이 불필요한 디스크 공간을 절약할
수 있고 백업작업으로 인한 필요 이상의 프로세스를 줄 일 수가 있습니다.

다른 서버에서 복사가 가능한 바이너리나 기본 설정 파일들은 굳이 백업
할 필요가 없으며 각 시스템마다 고유한 시스템 설정(Configuration)과
실제 데이터는 반드시 백업해야 합니다. 일반적으로 리눅스의 경우,
대부분의 설정은 /etc 디렉터리에 있으며 각종 데이터는 /home 이하에
, 그리고 기타 부가적으로 설치하는 프로그램은 /usr/local에 있으니
자신의 시스템 고유의 설정을 고려하여 각각의 디렉토리 이하에 대해
적절한 백업을 하면 됩니다. 예를 들면 메일 서버의 경우 /var/spool/mail
이하의 데이터가 매우 중요하므로 백업시 추가해야 합니다. 백업디렉토리
설정시 주의할점은 백업이 되는 파일을 다시 백업하여 무한 루프에
빠지는 실수를 주의해야하고 실시간으로 시스템내 프로세스에 대한 정보가
저장되는 /proc 역시 백업을 하는 실수를 하지 말아야 합니다.

그럼 예제를 들어 보이겠습니다.

[root@neo-na backup]# tar cvzpf /tmp/backup/home.tar.gz /home --exclude=/home/admin

압축옵션 중에 \'p\' 옵션은 이전 데이터의 퍼미션 정보를 그대로
보존한다는 의미입니다. \'z\'는 gzip으로 압축한다는 뜻입니다. 위와 같이
압축을 하면 /home/admin 이하를 제외하고는 /home 이하의 모든 파일들이
home.tar.gz 란 이름으로 생성이 됩니다. 제외할 디렉토리나 파일이 더 있을
경우에는 -exclude옵션을 계속 이어쓰면 됩니다.

현재까지 최신 안정커널인 Kernel 2.2 리눅스의 경우 하나의 파일은 최대
사이즈가 2G이므로 특정 파티션 이하에 많은 파일이 있어 하나의 파일로
백업할 경우 2G 를 넘을 경우에는 적당히 분산하여 백업을 해야합니다.
/home 이하 하부 디렉토리에 많은 파일이 있을경우 2G 를 초과하여
백업파일이 제대로 생성되지 않는 경우가 있으므로 이를 /home 이하의
디렉토리명이나 파일이름의 이니셜로 구분하여 (가령, 3등분하면서)
백업을 합니다.

tar cvzpf home_a_h.tar.gz /home/[a-h]*
tar cvzpf home_I_p.tar.gz /home/[i-p]*
tar cvzpf home_q_z.tar.gz /home/[q-z]*

그럼 실제 백업스크립트를 작성해 보겠습니다. 이 백업스크립트의 이름은
back.sh 라 하겠습니다.

== back.sh 의 내용 ==

#!/bin/sh
cd /tmp/backup ---(1)
rm -f *.tar.gz ---(2)
tar cvzpf apache.tar.gz /usr/local/apache/htdocs/* ---(3)
tar cvzpf home.tar.gz /home/* --exclude=/home/admin ---(4)
chmod 700 *.tar.gz ---(5)
ls -alh | mail -s www50_backup dokim@inempire.com ---(6)
df -h | mail -s www50_df dokim@inempire.com ---(7)

(1)은 백업작업이 이루어지는 /tmp/backup으로 이동을 합니다.
(2)은 새롭게 백업을 해야하므로 기존의 백업된 파일을 모두 삭제합니다.
(3)(4) 는 백업을 해야 할 디렉토리 이하에 대해 데이터를 각각 백업합니다.
(5)는 백업된 파일의 권한을 700으로 설정합니다.
(6)은 백업이 제대로 되었는지 확인하기 위해 현재 디렉토리내 백업파일의
리스트를 백업담당자인 dokim@inempire.com 에게 메일로 발송합니다.
(7)은 파티션이 가득찰 수도 있으니 현재의 파티션 정보를 백업담당자에게
메일로 발송합니다.

위 예에서는 풀백업을 보여주고 있는데 필요에 따라 적절히
증가분(변경분) 백업은 풀백업을 받은 후 기존의 백업 데이터와 비교하여
이미 백업된 이후 변경되거나 추가된 부분만 백업하는 방식입니다.

예를 들면 백업을 단순화하기 위해 /usr/local/apache/htdocs 에 대해서만
백업을 한다고 가정을 들겠습니다. 백업정책은 일주일 단위로 풀백업을 받고
이후 매일 증가분 백업을 하기로 합니다. 아래 스크립트는 증가분(변경분)
에 대해서만 백업을 받을 수 있는 스크립트입니다.



위에서 예를 든 풀 백업과 약간 다른 풀 백업 스크립트와 증가분(변경분)에
대해서만 백업할 수 있는 스크립트의 예를 들어 보이겠습니다.

== 풀 백업 스크립트의 내용 ==

#!/bin/sh ---(1)
cd /tmp/backup ---(2)
find /tmp/backup/* -mtime +7 -exec rm -f {} \';\' ---(3)
apache=/tmp/backup/apache_$(date +%Y%m%d).tar.gz ---(4)
tar cvzpf $apache /usr/local/apache/htdocs/* ---(5)
chmod 700 *.tar.gz ---(6)
ls -alh | mail -s 111.111.111.111_backup dokim@inempire.com -(7)
df -h | mail -s 111.111.111.111_df dokim@inempire.com -(8)
echo `date +\"%d %b %Y\"` > FULL ---(9)
cp -f *.tar.gz /backup --(10)
chmod 755 /backup/*.tar.gz --(11)

(3)은 계속해서 불필요한 예전 백업파일을 지우기 위한 부분입니다.
백업받은지 7일 지난 파일은 삭제한다는 의미입니다. 굵게 표시한
+7이라는 숫자가 수정한지 7일이상 된 것을 의미하고있습니다.
서버관리자의 의도에 맞게 숫자를 고치시면 될 것같습니다. 이
백업스크립트는 백업파일이 저장되는 곳과 다른 곳에 위치되어 있어야
합니다.만약 같은 곳에 위치해 있다면 백업 스크립트까지 지워지겠죠.

(4)의 $(date +%Y%m%d) 라고 작성을 한 부분은 백업받은 날짜를
파일이름에 넣기위해서 이렇게 표시를 했습니다. 이 압축시킬 파일의
이름을 $apache 이라는 변수로 선언을 했습니다. 이 스크립트를
실행시키면 /tmp/backup/ 라는 폴더에 aapche_백업날짜.tar.gz 이런
이름으로 백업압축파일이 저장이 됩니다. 예를 들어 2000년 12월16일에
이 스크립트가 실행되었다면 backup-20001216.tar.gz 가 될 것입니다.

(6)은 백업된 데이터의 보안설정도 중요하므로 root 만이 수정할 수
있도록 퍼미션을 700으로 해준 것이다.

(9)는 증가분(변경분) 백업스크립트 작동시 이용하기 위해 필요한
부분입니다. 풀백업이 이루어진 날짜가 이 FULL 이라는 파일에 저장이
될 것입니다.

(10), (11)은 나중에 설명할 ncftpget 을 이용한2차 백업서버로 전송하기
위해서 필요한 설정입니다. ncftpget 을 이용하지 않는 다면 필요가
없는 부분입니다.


== 증가분(변경분) 백업스크립트의 예 ==

#!/bin/bash
TODAY=`date +\"%d %b %Y\"` ---(1)
PREVIOUS=cat FULL ---(2)
apachemod=/tmp/backup/apachemod_$(date +%Y%m%d).tar.gz ---(3)
tar cvzpfG $apachemod -N \"$PREVIOUS\" /usr/local/apache/htdocs/ -(4)
chmod 700 *.tar.gz
ls -alh | mail -s 211.74.60.120_backup dokim@inempire.com ---(5)
cp -f *.tar.gz /backup ---(6)
chmod 755 /backup/*.tar.gz ---(7)

(1)은 현재의 시간을 tar 옵션중에서 (4)라인에서 보이는 것처럼 -N
옵션이 이해할수 있는 25 2월 2001 형태로 TODAY 란 변수에 대입합니다.

(2)는 Full 백업시간이 저장되어 있는 FULL 을 읽어들여서 PREVIOUS
라는 변수에 대입합니다.

(4)은 풀백업시간이후의 변경,추가된 것에 대해서만 압축파일로 압축이
될 것이다. -N 옵션은 $PREVIOUS 란 변수에 기록되어 있는 시간 이후에
변경되거나 추가된 것만 백업을 한다는 의미입니다.

(6), (7)은 나중에 설명할 ncftpget 을 이용한2차 백업서버로 전송하기
위해서 필요한 설정입니다 ncftpget 을 이용하지 않는다면 필요가
없는 부분입니다.



맥업 스크립트 파일을 매일 일일이 실행시키는 것은 불편할것입니다.
Cron으로 실행시키면 굳이 일부러 실행시킬 필요가 없을 것 같습니다.
(Cron에 대해서 간단히 설명드리자면 어떤 명령을 주기적으로 실행하는데
필요한 프로세스입니다.) 주기적으로 백업되어진 파일만 다른 곳에
저장하면 될 것 같습니다.

위에서 설정한 것처럼 백업스크립트를 작성한다고 했을 때
풀백업스크립트는 일주일에 한번만 실행될 수 있도록 설정을 하고
증가분 스크립트는 매일 실행될 수 있도록 설정을 하면 될 것입니다.
아래는 cron 테이블 설정 예입니다. Cron 테이블은 7개의 구성요소로
이루어지는 데 6번째 필드(user)는 생략되어도 됩니다.

분 | 시 | 날짜 | 달 | 요일 | 사용자 | 명령어


각 항목은 정수로 나타낼수도 있고 몇 개의 항목은 와일드 카드 문자로
인식되는 \'*\' 문자로 표현이 가능한데 \'*\' 는 \'매\' 의 의미입니다.
즉 시간필드에 \'*\' 이 있다면 매시간이라는 의미입니다. 날짜 항목에 \'*\'
이 있다면 매일이라는 의미입니다. 그리고 하나의 필드에 중복된 시간을
나타내고자 한다면 콤마로 구분하면 되고 연속된 시간을 구분하고자
한다면 하이픈(-)을 이용하여 일정기간을 나타낼 수 있습니다.

13 02 * * 1 /tmp/back.sh --(1)
11 02 * * * /tmp/mod.sh --(2)

(1)은 매주 월요일 2시13분에 Full 백업스크립트를 실행시킨다는
의미입니다.
(2)는 매일 2시11분에 증가분 스크립트에 대해서 실행시킨다는
의미입니다.

------------------------------------------------------------
II. 2차 및 3차 백업

A = 데이터를 압축해 놓은 1차 서버
B = 백업한 데이터를 가져갈 2차서버
밑에 설명할 문장 중 A , B 를 위와 같이 정의하겠습니다.

서버자체에서의 1차백업은 짧은 기간에 정기적으로 이전의 백업을
삭제하고 새롭게 데이터 백업을 받으므로 데이터의 훼손이나 삭제
사실을 늦게 발견했을 경우에는 이미 삭제된 데이터로 백업을 받아
복구할 수 없는 경우가 있습니다. 또는 자체백업이 되는 서버에
장애가 있거나 백업데이터 자체가 훼손이 되는 경우도 있습니다.
이런 경우에 대비하여 반드시 2차 백업을 , 가능하다면 3차 백업까지
설정하여 운영하는 것이 필요한 데 2차 백업은 1차 백업의 내용을 ftp
로 전송하거나 rsync 를 이용하여 특정 디렉토리에 대해 동기화를 하는
방법이 있습니다. A에서 네트워크가 되는 원격지의 linux 가 깔린
B로 데이터를 전송하는 것입니다.
A 에서 전송스크립트를 이용하여 B로 전송을 하도록 하겠습니다.


가) 전송 스크립트 1 (B에서 설정할 내용)

== 전송 스크립트 내용 ===

#!/bin/sh --(1)
cd /backupdata --(2)
rm -f *.tar.gz --(3)
ncftpget -u admin -p \'xxxxxxx\' 11.111.111.111 . \'/backup/*\' --(4)

(2)은 백업받을 디렉토리로 이동을 합니다.
(3)은 기존에 받아있던 백업데이터를 다 지우는 것입니다.
(4)는 ncftpget이라는 명령어를 이용하여 데이터가 있는 서버로 접속하여
데이터를 가져오는 구문입니다. -u 옵션은 user 를 말합니다. -p는
passwd 를 말합니다. 그리고 그뒤에는 서버의 ip입니다. \'/backup/*\'
이 부분은 백업데이터가 저장되어 있는 폴더를 지정해두어야 합니다.

한가지 유의할 사항은 ncftpget 은 백업 폴더와 백업데이터의 퍼미션이
만약 700 으로 되어있고 소유자와 소유그룹이 root로 되어있다면
데이터 전송은 불가능합니다. 적절하게 퍼미션을 755로 바꿔주면
전송이 가능합니다.


나) 전송스크립트 2

또다른 전송방법으로 rsync 라는 패키지를 이용한 방법이 있습니다. 이는
rpm으로 기본 제공되므로 쉽게 이용이 가능하며 백업뿐만이 아니라
Clustering으로도 적용이 가능하다고 합니다.


-----A 에서 설정할 내용

o A 서버의 /etc/inetd.conf에

rsync stream tcp nowait root /usr/bin/rsync rsyncd --daemon

이 라인을 추가해 줍니다. 그리고 killall -1 inetd 로 inetd를 재 설정해줍니다.
rsync포트는 873입니다. --daemon은 데몬모드로 작동한다는 뜻입니다.

o /etc 에 rsyncd.conf 라는 파일을 생성해줍니다. 원래 이파일은
없기떄문에 만들어줘야 합니다. rsyncd.conf 라는 파일을 생성해주고
아래와 같이 설정을 해줍니다.

[mail] ---(1)
path=/tmp/backup ---(2)
comment=backup ---(3)
uid=root ---(4)
gid=root ---(5)
use chroot=yes ---(6)
read only=yes ---(7)
hosts allow=111.111.111.112 -(8)
max connections=1 ---(9)

(1)은 rsync의 서비스 명으로 어떠한 이름을 설정하여도
상관없습니다. 백업서버에서 데이터 전송시 필요한 설정이다.
(2)는 데이터를 동기화 할(즉 백업으로 전송할)디랙토리를
설정한다. 여기에서는 /tmp/backup 디렉토리에 대해 2차 백업을
할 것이다.
(3)은 서비스 명에 대한 설명이다.
(4)는 파일을 전송하는 사용자의 uid로 기본값은 nobody 이다.
(5)는 파일을 전송하는 사용자의 gid로 기본값은 nobody 이다.
(6)은 (2)의 path를 최상위 디렉토리로 사용하여 이외의 디렉토리는
접근할 수 없더록 하는 설정으로 보안상 꼭 필요하므로 꼭 설정한다.
(7)은 읽기 전용모드로 설정한다는 의미이다.
(8)은 기본값은 모든 접속을 받아들이므로 보안을 유지하려면 백업서버의
ip를 설정해야 한다.
(9)는 백업서버에서 전송시 동시접속자수를 뜻한다. \'1\' 정도면 적당하다.



------B에서 설정할 내용

== B에서 설정할 스크립트 ==

#!/bin/sh
cd /backup ---(1)
rm -rf *.tar.gz ---(2)
/usr/bin/rsync -av 111.111.111.111::mail /backup ---(3)
chown root.root ---(4)
chmod 700 * ---(5)

(1)은 백업받을 디렉토리인 /backup으로 이동합니다.
(2)는 기존의 백업데이터를 삭제합니다.
(3)은 rsync 를 이용해 서버에 접속하여 데이터를 받아옵니다. 이때
\'-a\'는 아카이브 모드로서 파일의 속성이나 퍼미션 및 소유권 등의
정보를 보존하여 동기화 한다는 의미입니다. \'-v\'는 \'verbose\'의 의미로
동기화의 진행상황을 자세하게 보여줍니다. 데이터 서버에서 서비스
명을 mail 로 했으므로 \'data.co.kr::mail\' 로 설정되었으며 동기화한
데이터는 /backup이라는 디렉토리에 저장됩니다.


* 2차 백업 전송스크립트도 cron으로 설정을 해서 주기적으로 자동화를
해 놓으면 효율적이 될 것입니다.

참고로 tar를 이외의 cp를 이용하는 방법도 고려해 볼만합니다. 예를
들어 cp -ap /etc/ /backup과 같이 /etc 디렉토리 전체를 복사한 후
cp -aufp /etc /backup/etc/ 로 전체복사 이후 새롭게 생성이나 변경 ,
수정된 파일이나 디렉토리만 복사하는 방법도 있습니다.

댓글 없음:

댓글 쓰기

국정원의 댓글 공작을 지탄합니다.

UPBIT is a South Korean company, and people died of suicide cause of coin investment.

 UPBIT is a South Korean company, and people died of suicide cause of coin. The company helps the people who control the market price manipu...