####################################################################
# Backup Copy 와 NFS 그리고 mirrordir을 이용한 로컬 및 리모트 백업 #
# 작성자 : 박범석             #
#                                #
# 최종 수정 : 2002-04-17                                           #
####################################################################


기존에 로컬 하드 및 원격지로의 미러 백업에 rsync를 이용했다.
설정이 간단하고 마땅히 다른툴이 없어서 많이 이용하고 있다.
rsync를 이용한 백업은 다음 URL을 참고하기 바란다.
http://tunelinux.pe.kr/bbs/read.php?table=linuxinfo&no=30&o[at]=s&o[sc]=t&o[ss]=rsync&o[st]=a
하지만 구조가 복잡하고 큰 트리구조의 디렉토리를 미러할경우 에러가 자주 발생한다.
완벽한 백업을 위해서는 여러번 실행시켜줘야 한다. 여간 번거로운 일이 아니다.
그래서 찾아보던중에 Backup Copy와 mirrordir이란 유틸리티를 찾게 되었다.
Backup Copy는 리모트 백업을 지원하지는 않는다. 그래서 NFS를 이용해야 한다.
물론 mirrordir는 리모트 백업이 지원 된다.

1. Backup Copy
Backup Copy의 공식 홈페이지는 다음과 같다.
http://www.enjoy.ne.jp/~gm/cpbk/

현재 최신 버전은 4.1.0 이다.

필자가 번역한 문서 및 한글 메세지 패치한 바이너리는 다음 URL에서 다운받
을 수 있다.
http://linux.sarang.net/~darchon/linux/cpbk/
파일를 저자에게 보냈고 다음 버전에 포함시켜 준다고 한다.

또, 현재 cpbk는 umask값에따라 동작하기 때문에 일부 퍼미션의 경우 제대로 카피하지
못하는 문제가 있다. 예를들어 일반적으로 umask는 022를 사용하는데 이경우 퍼미션이
777인 파일이 755로 카피되는 문제가 있다.
저자에게 메일을 보냈는데 다음과 같은 답변을 받았다.

Cpbk-4.1.0 is affected by your `umask' setting.
Because cpbk doesn't clear file creation mask. So some permissions are not
preserved.
To fix the problem, add `umask(0);' at just before calling copy_procedure()
function in main() function in cpbk.c.

필자가 패키징한 바이너리에는 umask 패치를 포함시켰다.

설치 및 옵션은 유저 메뉴얼과 중복되는 내용이므로 다음 문서를 참조하기 바란다.
http://linux.sarang.net/~darchon/linux/cpbk/cpbk-ko.txt
문서에 예제가 있으므로 따로 설명하지는 않겠다. 여기서는 위 문서에 없는 내용을
이야기 하겠다.
웹서버와 같이 일시적으로 생성되었다 금방 없어지는 파일이 많은 서버의 백업을
하는경우 cpbk source dest 와 같이하면 에러가 나면서 실행이 중단되는 경우가
있다. 맨처음 소스 파일의 리스트를 만들당시 있었던 파일이 없어졌기 때문이다.
그래서 -I ( --ignore-minor-error ) 옵션을 줘야한다. 작은 에러는 무시하라는
옵션이다. 유저 메뉴얼에는 위험할 수 있다고 하지만 이 옵션을 쓰지 않으면
백업이 불가능하다.

다음은 cpbk로 /usr 를 tmp 로 미러링하는 예이다.

[root@ns1 backup]# cpbk /usr/ tmp/
소스 파일을 탐색해 리스트를 작성하고 있습니다… 완료
데스티네이션 파일을 탐색해 리스트를 작성하고 있습니다… 완료
파일을 비교해 명령 리스트를 생성하고 있습니다… 완료

   608/45109 파일 ( 36064KB/753598KB)   4% [--------------------] 복사중  : /usr

cpbk로 리모트 백업을 하기 위해서는 NFS 마운트를 하면 된다.
NFS의 설정은 다음 URL을 참조하기 바란다.
http://people.sarang.net/linux/nfs.php
자세한 설명이 있어서 초보자도 금방 따라할 수 있을것이다.


2. mirrordir
mirrordir 의 공식 홈페이지는 다음과 같다.
http://mirrordir.sourceforge.net/
다음 URL에서도 다운받을 수 있다.
http://linux.sarang.net/~darchon/linux/mirrordir
rpm 파일은 필자가 zlib 보안패치와 부팅시에 secure-mcserv 가 실행되게 패치를 했다.

설치는 아주 간단하다.
tar xzf mirrordir-0.10.49.tar.gz
cd mirrordir-0.10.49
patch -p1 < ../mirrordir-zlib-1.1.3-zfree.patch
./0install-quick /usr/local/
물론 아래와 같이 설치해도 된다.
./configure
make
make install

rpm의 경우는
rpm -Uvh mirrordir-0.10.49-5.i386.rpm

현재 최신 버전이 0.10.49 이지만 다양한 기능이 있다.
특이한 점은 mc의 지원이다. mc는 Midnight Commander filesystem으로
secure-mcserv 가 서버에 실행중이여야 한다.
서버에서 secure-mcserv -d 로 실행시키면 데몬모드로 실행이 된다.
-p 포트번호 로 원하는 포트로 실행시킬 수 있다.
secure-mcserv -d -p 12345 : 데몬모드로 실행시키고 12345포트를 사용한다.
-v 는 이하의 모든 명령어에 공통되는 옵션으로 실행시 자세한 정보를 보여준다.

* pslogin ssh를 대체할 수 있는 보안쉘이다.

pslogin 은 mirrordir --login-mode --secure 과 같다
사용법은 pslogin mc://host
secure-mcserv 실행시 -p 옵션으로 포트번호를 지정해 줬을경우
pslogin mc://host:port 로 접속한다.
만약 darchon 이란 계정으로 접속하고 싶으면
pslogin mc://darchon@host 처럼 접속하면 된다.

처음 실행시 다음과 같은 문구가 나오면 y를 입력한다.
before connected to this
host for the first time. Type y to continue.
그 외 여러 옵션이 있지만 백업에 관련없는 사항이므로 자세한 설명은 하지
않겠다.

* forward ssh의 패킷 포워딩같은것이다.

* copydir cp와 비슷하지만 ftp 와 mc로의 복사도 지원한다.
   copydir 는 mirrordir -c --no-erase-directories --keep-files 과 같다.
  
   예를들어 copydir source dest 하면 cp -a source dest 과 같다.
   copydir ftp://host/pub/xxx.tar.gz . 는 ftp에 접속해서 xxx.tar.gz 을
   현재의 디렉토리에 받아온다. ftp대신 mc를 이용할 수도 있다. 물론 서버에
   secure-mcserv 가 실행중이여야 한다.
  
* recursdir find 와 비슷하다.
   recursdir 는 mirrordir --recurs-mode 과 같다.
 
   예를들어 recursdir source -C 'if (!glob ("*.c", FILE)) printf ("%sn", PATH);'
   는 source 디렉토리 하위로 *.c 파일들을 찾아서 출력한다.
   recursdir source --tar-file source.tar 는 source 디렉토리를 source.tar 로
   묶어 준다.

* mirrordir 이 유틸리티의 중심이 되는 명령어로 위의 명령어를 모두 포함하고 있다.
  
   mirrordir source dest : source 를 dest 로 미러한다.

   mirrordir /home /backup/home --exclude /home/darchon : home 을 /backup/home
   으로 미러하지만 /home/darchon 은 제외한다.

   mirrordir ftp://host/pub /home/ftp/pub : ftp://host/pub 를 /home/ftp/pub 로
   미러한다.

   mirrordir mc://host/home /backup/home : secure-mcserv가 실행중인 host의 /home
   을 /backup/home 으로 미러한다.
  
   더 많은 옵션이 있으니 자세히 알고 싶으면 공식 홈페이지의 문서를 참조하기
   바란다.

   예) 192.168.0.1 의 /home 을 192.168.0.2 의 /backup 으로 백업
    1) mirrordir 을 양쪽에 설치한다.
    2) 192.168.0.1 에 secure-mcserv -d 로 secure-mcserv 를 데몬으로 실행시킨다.
       note) /etc/hosts.allow 로 제어할경우 secure-mcserv : 192.168.0.2 를 추가한다.
    3) 192.168.0.2 /root 에 .netrc 파일을 다음처럼 만든다.
       machine 192.168.0.1 login root password 패스워드
       note) 암호가 노출될 수 있으니 시스템 보안에 각별히 신경써야 한다.
             .netrc 는 ftp의 자동 login에 쓰인다. mirrordir(pslogin)도 .netrc를 이용한다.
    4) 192.168.0.2 에서 다음 명령어를 입력한다.
       mirrordir --secure -K 512 mc://192.168.0.1/home /backup
       note) 자세히 보고 싶으면 -v 압축전송을 원하면 -z 옵션을 추가한다.

   mirrordir은 기능이 많고 리모트 백업이 지원되는 장점이 있다. 버전이 낮지만
   필자가 테스트한 결과 안정적으로 동작했다.
  


3. 비교
   두가지 모두로 리모트 백업을 테스트한 결과 cpbk는 1개의 서버당 로드 1이
   약간 넘었다. nfs로 마운트했고 속도가 빨라서 생기는 IO의 로드로 생각된다.
   또한 여러대를 한꺼번에 백업할려면 백업서버에 상당히 많은 양의 메모리가
   필요하다. 최소 1기가 이상은 필요할듯 싶다.
   mirrordir은 6대를 한꺼번에 백업해도 로드 0.5를 넘기는 경우가 거의 없었다.
   메모리 역시 거의 소모하지 않는다. 하지만 cpbk에 비해 속도가 매우 느리다.
   하지만 처음백업시에만 오래걸리고 이후의 바뀐파일들만 받는건 그리 오래걸리지
   않으니 문제가 될건 없어보인다.
   또한 앞에서 설명했듯이 cpbk는 리모트백업을 지원하지 않는다. 그래서 NFS를
   이용해야한다. 그리고 mirrordir는 아직 초기 버전이다. 일장일단이 있으니
   선택은 각자 하기 바란다. 🙂 필자의 경우는 두가지 모두 사용하고 있다.

#########################################################################

#!/bin/sh
#writen by hakkoo
cronlog=/root/tmp/mirror_time.log
date > $cronlog

#/boot  200M
#/      2G
#swap   1G
#/var   2G
#/home  100G
#/usr   …

#sfdisk -d /dev/hdc > /root/160G
#/sbin/sfdisk /dev/hdc < /root/160G

/sbin/mkfs.ext3 /dev/hdc1
/sbin/mkfs.ext3 /dev/hdc2
/sbin/mkfs.ext3 /dev/hdc5
/sbin/mkfs.ext3 /dev/hdc6
/sbin/mkfs.ext3 /dev/hdc7

/sbin/mkswap /dev/hdc3
mkdir /disk
mount /dev/hdc2 /disk

mkdir /disk/boot
mkdir /disk/var
mkdir /disk/home
mkdir /disk/usr

## disk backup
mount /dev/hdc1 /disk/boot
mount /dev/hdc5 /disk/var
mount /dev/hdc6 /disk/home
mount /dev/hdc7 /disk/usr

/usr/local/bin/mirrordir / /disk --exclude /proc --exclude /disk
(주의, 커널 2.6 이상에서는 sys 도 exclude 시켜야 함 그렇지 않을경우 무한 대기)
# 파티션을 무시하고 /root 의 데이터만 mirroring 하고자 할 경우 -i 옵션
#/usr/local/bin/mirrordir / /disk -i --exclude /proc -i --exclude /disk -i --#exclude /home -i --exclude /usr --i --exclude /var


mkdir /disk/proc
mkdir /disk/disk

umount /dev/hdc1
umount /dev/hdc5
umount /dev/hdc6
umount /dev/hdc7
umount /dev/hdc2

# smartctl
smartctl -s on -a /dev/hdc|grep Power_On|awk '{print $2 " : " $10}'
smartctl -s on -a /dev/hdc|grep "Error [0-9]"|awk '{print $1 " " $2 " : " $8 " " $9}'

date >> $cronlog
cat $cronlog
#########################################################################

mirrordir을 이용한 로컬 및 리모트 백업

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다