AMANDA를 이용하여 백업하기 AMANDA는 "Advanced Maryland Automated Network Disk Archiver"의 약자로서
Maryland 대학에서 개발한 백업 유틸리티이다. AMANDA는 네트웍 여기저기에
흩어져 있는 컴퓨터들의 데이타를 백업하기에 적당한 솔루션이다.
고친 과정 |
---|
고침 0.1 | 2002-09-17 | 고친이 styoo | 최초 작성 | 고침 0.2 | 2002-10-17 | 고친이 styoo | 원격 서버에서 복원하는 방법 추가 |
윈도우 머신에서 네트웍에 흩어져 있는 여러 대의 파일 서버에 있는 데이타를
백업/복원하기 위해서는 네트웍 드라이브로 연결해서 윈도우 백업 소프트웨어를
이용하거나 또는 상용 소프트웨어를 사용하는데, 상용 소프트웨어의 경우 각 파일
서버마다 모듈을 사야하므로 그 가격이 만만치 않다. 그리고, 윈도우에서
제공하는 백업 소프트웨어를 사용할 경우, 백업할 대상을 네트웍 드라이브로
연결해서 백업할 수도 있는데, 이 경우는 일부 테잎 장치를 지원하지 않는 문제가
있다. 그래서 리눅스 머신에서 그 작업을 대신할 수 없을까 해서 백업
소프트웨어를 찾아보니 AMANDA라는 것이 괜찮아 보였다. 약 한 달의 준비 기간과
시험기간을 거쳐 실전에 사용해보니 비교적 만족스럽기에 여러분에게도
추천하고자 이 글을 작성하게 되었다.
Copyright (C) 2002 유성태
이 문서는 GNU Free
Documentation License 버전 1.1 혹은 자유 소프트웨어 재단에서
발행한 이후 판의 규정에 따르며 저작권에 대한 본 사항이 명시되는 한
어떠한 정보 매체에 의한 본문의 전재나 발췌도 무상으로 허용됩니다.
본 저자는 문서의 내용이 야기할 수 있는 어떠한 결과에 대해서도
책임을 지지 않습니다. 본 문서에서 내포하고 있는 정보들 및 예제들은
여러분이 알아서 활용하십시오. 비록 최선을 다했으나 이 문서는 틀린
점이나 오류가 있을 수도 있습니다. 만약 여러분이 틀린 점을
발견했다면 꼭 저에게 알려 주시기 바랍니다.
AMANDA라는 비교적 훌륭한 백업 소프트웨어를 개발하고 있는 AMANDA 개발
그룹에 감사드립니다.
"UNIX Backup & Recovery" 책에 "Using Amanda"라는 Amanda 사용에 대한 내용이
있으며 http://www.backupcentral.com/amanda.html에서 온라인으로도 볼 수 있다.
설치는 위 자료를 참고하기 바란다.
Amanda는 백업을 운영할 사용자를 정하게 되어 있으며, 래드햇 또는 데비안은 그
사용자가 backup으로 지정되어 있다. backup이 아닌 다른 사용자로 지정하려면
패키지를 다시 빌드하여야 하는데 configure 단계에서 원하는 사용자로 바꾼 후
패키지를 빌드하면 된다. 필자는 데비안 소스 패키지를 받아다가
--with-user=backup --with-group=backup을 --with-user=styoo
--with-group=styoo로 바꾸었다. 당연한 말이지만, styoo는 필자가 사용하는
리눅스 박스의 login name이다. 그 이외의 configure 옵션은 특별히 바꿀 필요가
없을 것이다. 데비안 소스 패키지를 받아서 새로이 빌드할 경우, rules 파일외에
몇 개의 파일에서 backup을 원하는 사용자로(여기서는 styoo) 바꾸어 주어야한다.
새로이 빌드하기가 번거롭다면, 사용자를 바꿀 필요 없이 제공되는 패키지 그대로
설치해서 사용해도 된다. 그러나 이때는 root 또는 backup 사용자로 백업을
실행해야 할 것이다.
Amanda는 서버 s/w와 클라이언트 s/w로 구성되어 있다. 서버 s/w는 테잎 장치가
부착되어 있으며 백업 프로세스가 돌아갈 서버(이하 테잎서버라 칭함.)에 설치될
것이며, 클라이언트 s/w는 백업할 데이타를 저장하고 있는 시스템(이하
파일서버라 칭함)에 설치될 것이다. 테잎서버에도 백업할 데이타가 있다면
클라이언트 s/w를 설치해야 한다.
그 외에 반드시 필요한 소프트웨어로는 tar, mt-st가 있으며, 윈도우 시스템의
데이타를 samba를 이용하여 백업하려고 한다면 samba가 필요할 것이고 테잎 장치에
autoloader나 scsi changer와 같은 미디어 체인저가 있다면 mtx도 필요할 것이다.
Amanda는 백업할 때 dump와 tar 두 가지 명령 중에 한 가지를 사용할 수 있다.
여기서는 tar를 사용하여 백업하는 것을 기준으로 설명하므로 버전 1.12 이후의
tar가 반드시 설치되어 있어야 한다.
여러가지 세세한 설정에 대해서는 6절에서 설명하고 있으니
참고하기 바라며, 여기서는 대강의 Amanda 작동 순서를 설명하겠다.
백업을 시작하기 전에 테잎을 인식할 수 있는 라벨을 amlabel 명령으로 테잎에
써 넣어야 한다. 라벨을 테잎에 쓰고 나면 amcheck 명령으로 설정에 문제가
없는지 점검을 하고 문제가 없다면 백업을 실행할 수 있는 것이다.
백업은 amdump 명령으로 실행시킨다. 실행이 되면 disklist 파일로부터 무엇을
백업할 것인지 확인한 다음, 백업해야 할 데이타 용량을 추정 계산하기 시작한다.
disklist 파일은 사용자가 작성해야 하며 여기에는 백업할 대상(백업 서버의
디렉토리)의 목록이 저장되어 있다.
처음 백업하는 디렉토리라면 실제 용량에 0.5를 곱한 값을 백업할 용량으로
산정한다. 기존에 백업했던 디렉토리는 압축률이 지난 번 백업에서 결정된 것이
있으므로 그 값을 사용하여 백업할 용량을 계산한다.
용량을 추정 계산 하면서 백업할 각 대상의 백업 레벨도 결정한다. 그 대상이
기존에 백업한 적이 없다면 Full 백업(이하 전체백업이라 칭함)을 할 것이고
그렇지 않다면 Amanda가 알아서 Incremental 백업(이하 증분 백업이라 칭함)의
레벨을 결정한다. 물론 사용자가 백업 레벨을 설정할 수도 있다. 백업 레벨에
대한 것은 8.6절을 참고하기 바란다.
모든 백업 대상에 대한 용량 계산이 끝난 후 데이타를 받기 시작하며 그 데이타를
테잎서버의 로컬디스크에 저장한다. 로컬디스크에 저장이 완료된 백업 대상부터
테잎으로 쓰기 시작한다. 설정하기에 따라서는 테잎으로 바로 쓸 수도 있다.
테잎으로 바로 쓰는 것에 대해서는 8.7절을 참고하기
바란다. 어쨌든 Amanda는 데이타를 받아서 로컬디스크에 저장했다가 테잎으로
쓰는 방식을 취하고 있다는 것이다. 각 백업 대상의 데이타를 받아서 나름의
형식으로 각각 하나의 파일로 만드는데 이때 파일들을 실제로 묶어주는 것은
tar를 이용한다. 또는 tar 대신에 dump를 사용할 수도 있으나 여기서는 tar를
사용하는 것을 기준으로 설명하겠다.
amdump를 실행시킨 후 백업 진행 상태는 amstatus 명령으로 확인할 수 있다.
백업이 완료되면 Amanda 설정 파일에 지정되어 있는 이메일 주소로 완료된
백업에 대한 정보가 보내지며 그 안에는 에러 상황도 같이 표시된다.
백업의 순서를 다시 한 번 정리해 보면,
amlabel 명령으로 테잎에 라벨을 붙인다. amcheck 명령으로 설정의 이상 유무를 점검한다. amdump 명령으로 백업을 실행시킨다. amstatus 명령으로 백업 진행 상황을 점검한다.
테잎 장치의 물리적인 연결은 각자 알아서 하기로 하고 여기서는 일반적인
SCSI 테잎 장치의 인식 여부 및 작동 여부에 대해 설명하도록 하겠다.
SCSI 테잎 장치가 제대로 인식되었는지 확인하려면,
/proc/scsi/scsi 파일을 읽어보기 바란다.
필자 시스템의 /proc/scsi/scsi 파일을 읽어보면,
$ cat /proc/scsi/scsi
Attached devices:
Host: scsi0 Channel: 00 Id: 03 Lun: 00
Vendor: HP Model: C5683A Rev: C005
Type: Sequential-Access ANSI SCSI revision: 02
|
HP의 모델명 C5683A라는 테잎 장치가 인식되어 있음을 알 수 있다.
보유하고 있는 테잎 장치의 모델이 표시되면 정상적으로 인식된 것이다. 만일,
인식이 안된다면 커널에서 SCSI 관련 부분이 제대로 설정이 안된 것일 가능성이
많으니 커널을 새로이 컴파일 해야 할 것이다. 커널 컴파일과 SCSI 장치에 대한
것은 The Linux
Kernel HOWTO 문서와 The Linux 2.4
SCSI subsystem HOWTO 문서를 각각 참고하기 바란다.
테잎 장치가 제대로 작동하는 지 확인해 보기 위해 tar 명령으로 테잎에 파일을
써 넣어 보자. 테잎 장치에 쓸 수 있는 권한은 root에게 있을 것이므로 root로
로그인해서 tar 명령을 실행해야 할 것이다.
/home/styoo를 백업해 보자. 테잎 장치가 하나 뿐이라면
테잎 장치는 /dev/st0가 될 것이다.
# tar cvf /dev/st0 /home/styoo
|
제대로 실행이 되는가? 제대로 된다면 백업한 목록을 한 번 확인해 보자.
백업한 것을 /tmp 디렉토리에 복원해 보자.
# cd /tmp
# tar xvf /dev/st0
|
정상적으로 작동하는가? 그렇다면 테잎 장치의 설치와 작동이 정상적이므로
Amanda를 이용하여 백업할 준비가 되었다고 하겠다. 테잎 장치가 제대로 인식만
된다면 tar를 이용한 백업이나 복원에는 별다른 문제가 없을 것이다. 이 단계에서
문제가 발생한다면 주위 사람들에게 물어보거나 HOWTO 문서를 참고하여 해결하기
바란다.
Amanda가 작동하는데 필요한 파일이 여러개 있다. 그 파일들에 대해서 알아보자.
Amanda는 필요에 따라서 여러 가지 설정을 가질 수 있다. 설정 파일의 최상위
디렉토리는 /etc/amanda이며 그 밑에 서브디렉토리를
만들어서 입맛에 맞도록 설정을 변경할 수 있다.
예를 들어, 프로젝트 명 SpaceWar와 EarthBurn이라는 두 개의 프로젝트를
수행하고 있다고 하자. 각 프로젝트 별로 따로 백업을 관리할 계획이라면
/etc/amanda/SpaceWar와
/etc/amanda/EarthBurn라는 두 개의 디렉토리를 만들어서
그 아래에 필요한 필요한 설정 파일을 넣어 둘 수 있다. 그리고 공통으로 사용하는
설정은 /etc/amanda 디렉토리에 넣어두면 된다.
테잎서버에서 사용하는 파일들은 아래와 같다. 각각의 위치는 Amanda 소스로부터
바이너리를 빌드할 때 설정하기에 따라 바뀔 수 있다.
- /etc/amanda/amanda.conf
테잎 장치에 대한 설정, 동시에 진행될 백업 프로세스의 수등과 같은
공통적으로 사용되는 설정에 대한 정의를 포함하고 있다. 반드시 이
파일이 필요한 것은 아니다. 다만 공통되는 설정을 한 곳에 모아두는
것이 편하다는 필자의 생각에 따른 것일 뿐이다.
- /etc/amandahosts
테잎서버에서 파일서버로 액세스가 가능하도록 테잎 서버의
호스트네임과 사용자 이름을 저장하고 있다.
- /etc/amandapass
윈도우 파일 서버의 데이타를 samba를 이용하여 백업할 경우, 공유
이름과 접근 권한을 가진 사용자 이름 그리고 그 사용자의 암호에
대한 목록을 저장하는 파일이다.
- /etc/amanda/SpaceWar/amanda.conf
이 절의 처음에서 예를 든, 가상의 SpaceWar라는 프로젝트에 대한 설정
파일이며 그 안에 /etc/amanda/amanda.conf
파일을 부르는 설정이 들어 있으며, 테잎 라벨에 대한 설정, 로그
파일의 위치 등을 포함한다.
- /etc/amanda/SpaceWar/disklist
이 파일에 SpaceWar라는 프로젝트의 백업할 디렉토리와 그 디렉토리가
있는 파일 서버의 목록 그리고 백업 형태를 지정한다.
- /var/lib/amanda/amandates
/etc/amanda/*/disklist 파일에서 정의된 백업
목록중에서 백업이 완료된 것에 대하여 그 디렉토리 이름과 백업 레벨
그리고 백업된 날짜를 저장하고 있다.
- /var/lib/amanda/gnutar-lists/
이 디렉토리 밑에 백업된 디렉토리(또는 파일시스템)에 대한 상태가
저장된 파일들이 있으며 이를 참조로 다음 증분 백업 할 때에 포함할
파일들이 결정된다. 이 디렉토리에 있는 파일들은 tar에 의해
생성된다.
- /var/lib/amanda/SpaceWar/curinfo/
백업된 각 디렉토리에 대한 히스토리가 저장된다.
- /var/lib/amanda/SpaceWar/index/
흔히 catalogue라고 하는 백업된 파일 목록이 저장된다.
- /var/lib/amanda/SpaceWar/tapelist
사용할 테잎 목록을 저장하고 있다.
- /var/log/amanda/SpaceWar/log/
백업 로그가 저장된다.
들어가기 전에, 필자가 사용하는 테잎 장치, 리눅스 서버 그리고 설정에
필요한 가정 등에 대한 얘기를 잠깐하고자 한다.
우선, 테잎 장치는 모델명 ULT3581인 IBM Ultrium Tape Autoloader이다.
1 개의 드라이브와 7개의 슬롯을 가진 제품이다. 미디어 하나의 용량은 비압축
상태로 100GB이며 50% 압축이 된다고 한다면 최대 200GB까지 하나의 미디어에
저장할 수 있다. 테잎에 데이타를 기록하는 속도도 평균 14MB 이상이 나오며
윈도우에서는 20MB 속도가 나오는 것을 확인하였다. 특정 제품 선전을 위한
것이 아님은 두 말할 나위도 없다. DAT, DLT 등에 비해 월등히 빠른 속도를
보여주고 있으며 Super DLT와는 비교를 하지 않아서 아는 바가 없다.
리눅스는 Debian 3.0이며 커널은 버전 2.4.18을 사용하고 있다. 커널은
소스로부터 따로 컴파일 하였다. 위 테잎 장치에 대한 디바이스 드라이버를
IBM에서 제공하고 있으며 RedHat 7.1/7.2에서 사용할 수 있고 RedHat에서
제공하는 2.4.2 커널 또는 kernel.org에서 제공하는 2.4.9 커널을 지원한다고
한다. 그러나 반드시 IBM에서 제공하는 디바이스 드라이버를 사용할 필요는
없다. 필자는 2.4.18의 sg 모듈과 st 모듈을 이용하고 있으며 아직 아무런
문제점을 발견하지 못하였다. IBM의 드라이버를 사용하였을 때 속도가 더
향상되는 지는 모르겠으나, 이 글을 쓰는 시점에 옛 기억을 더듬어 보면 별
차이가 없었던 것으로 기억된다.
5절에서 언급한 적이 있지만, 프로젝트명 SpaceWar에서
사용하는 파일들을 백업한다는 가정하에 설정 부분을 진행할 것이다. 그리고
아래에서 설명할 설정은 되도록이면 일반적으로 적용할 수 있도록 하겠지만
특정 부분은 위에서 언급한 필자의 시스템 구성에 맞추어서 설명하도록 하겠다.
아마도 Amanda Server s/w를 설치하면
/etc/amanda/DailySet1/amanda.conf파일이 있을 것이다.
이 파일을 /etc/amanda/amanda.conf로 복사한 후 편집을
하도록 하자. /etc/amanda/amanda.conf에 설정할
여러가지 파라미터가 있다. 필요한 것들을 하나씩 알아보자.
- mailto
백업이 이루어진 결과에 대한 정보를 메일로 받을 사용자를 지정한다.
mailto "aaa@bbb.ccc.co.kr" - dumpuser
백업을 실행할 테잎서버의 사용자를 지정한다.
dumpuser "styoo" 2절에서 언급한 대로 패키지를 Amanda
사용자를 변경하여 새로이 빌드하지 않고, 제공되는 그대로
설치하였다면 dumpuser는 backup이 될 것이다. 또는 root가
될 수도 있다.
- etimeout
파일서버의 백업할 각 디렉토리의 용량을 측정하는데 할당가능한
최대 시간(단위:초).
etimeout 3600 파일서버의 백업할 디렉토리의 용량을 측정하는데 걸리는 시간이
3600초를 초과한다면, 더 이상 측정하지 않고 그 디렉토리에 대한
백업을 진행하지 않는다.
- dtimeout
네트웍 불량 등의 이유로 파일서버로부터 백업할 데이타를 받지 못할
경우 대기할 최대 시간(단위:초).
dtimeout 3600 백업이 진행되기 전 또는 백업 진행 중에 어떤 이유로 파일서버로부터
데이타를 받지 못할 경우, 3600초 동안 대기하다가 그 이상 시간이
초과되면 백업을 진행하지 않는다.
- tapedev
테잎 장치를 지정한다.
tapedev "/dev/nst0" 테잎 장치가 /dev/st0가 아니라 왜
/dev/nst0인지 궁금할 수도 있다. 그것은
Amanda가 non-rewinding 테잎 장치를 사용하기 때문이다.
non-rewinding 테잎 장치는 "n"을 붙여서 표시한다. 따라서
/dev/st0이 아니라
/dev/nst0인 것이다.
/dev/st0와 /dev/nst0의
차이는 tar 명령으로 쉽게 확인할 수 있다.
/usr/bin디렉토리를 테잎에 백업한 다음,
/tmp에 복원하는 경우를 가정하자.
먼저, /dev/st0에 쓰는 경우를 보자.
$ tar cvf /dev/st0 --directory /usr/bin .
|
백업이 끝나면 /tmp 디렉토리로 이동해서
복원을 해 보자.
$ cd /tmp
$ tar xvf /dev/st0
|
테잎이 자동으로 rewind 된 후에 백업된 파일들이 복원될 것이다.
이제, /dev/nst0에 백업하는 경우를 보자.
$ tar cvf /dev/nst0 --directory /usr/bin .
|
백업이 끝났으면 복원을 해 보자.
$ cd /tmp
$ tar xvf /dev/nst0
|
파일이 제대로 복원 되는가? 아마도 복원되는 파일이 전혀 없거나 에러가
발생할 것이다. 테잎에 데이타를 써 넣은 후 테잎이 rewind 되지 않았기
때문이다. 테잎을 rewind 시킨 후 다시 복원을 시도해 보자.
$ mt -f /dev/nst0 rewind
$ tar xvf /dev/nst0
|
파일이 복원되는가? 아마도 잘 될 것이다. 비슷하게
/dev/st0에 데이타를 백업한 후 이어서 또 다른
데이타를 백업하면 테잎이 처음으로 rewind된 후 데이타를 덮어쓰게
된다. 그러나 /dev/nst0를 사용하면 뒤에 이어서
데이타를 써 넣는다. Amanda는 각 백업 대상을 각각 하나의 파일로
만든 후 테잎에 써넣는 방식을 취하고 있으므로 만들어진 각 백업 대상의
각 파일을 차례 차례 테잎에 써넣어야 한다. 따라서 non-rewinding
테잎 장치인 /dev/nst0를 사용하는 것이다.
- changerdev
autoloader와 같은 미디어 체인저가 있으면 지정한다. 아래의
tpchanger에 따라서 설정할 필요가 없는 경우도 있다. 필자가
사용하는 IBM 3581 autoloader는 이를 지정할 필요가 없었다.
changerdev "/dev/sg0" - tpchanger
autoloader와 같은 미디어 체인저가 있으면 이를 구동할 스크립트를
지정한다. IBM 3581 autoloader의 경우 mtx 패키지에 들어 있는
mtx-changer 스크립트를 약간 수정하니 그럭저럭 구동하였다.
tpchanger "mtx-changer" - tapetype
사용할 테잎의 종류를 지정한다.
tapetype IBM-LTO 위에서 예로 든 IBM-LTO는 Amanda에서 지정된 이름이 아니라 사용자가
임의로 지정하는 것이다. IBM-LTO가 어떤 테잎인가에 대한 정의를
따로 해 주어야 한다.
- columnspec
백업 프로세스가 끝난 후, Amanda는 메일로 그 정보를 보내준다. 그때
사용할 각 목록의 길이 등을 지정한다.
columnspec "HostName=0:13,Disk=1:20,OrigKB=1:9,OutKB=1:9,DumpRate=1:7,TapeRate=1:7" HostName=0:13의 의미는, 호스트네임의 표시에 최대 13자를 사용할
수 있고 "0"은 그 왼쪽에 공백이 없다는 뜻이다. 비슷하게 1:7은
해당 아이템에 사용할 수 있는 글자의 수는 7개 이며 그 왼쪽에
공백을 하나 넣어라는 의미이다. 그리고 각 아이템의 순서대로
메일에 표시된다.
- holdingdisk
3절에서 설명했다시피 Amanda는 데이타를
로컬디스크에 저장했다가 다시 테잎으로 옮겨 쓰는 방식을
취하고 있다. 이 로컬디스크를 holdingdisk라고 부른다.
holdingdisk hd1 {
comment "main holding disk"
directory "/backup-image/Image"
use -10Mb
chunksize 0
}
|
위에서 "use -10Mb"의 의미는 10Mb를 제외한 나머지 공간 모두를
Amanda가 사용한다는 뜻이다. 양수 값을 지정하면 그 크기 만큼만
사용하라는 의미이다. 그리고 Amanda는 데이타를 받아서
백업이미지를 만들때 하나의 파일로 만든다. 이때 OS 차원에서
파일 크기에 제한이 있고 백업이미지가 그 제한 크기보다 크다면
문제가 발생할 것이다. 이를 방지하기 위해서 chunksize 값을 지정할
수 있다. "chunksize 0"는 이미지 크기를 OS에 맡긴다는 의미이다.
"chunksize 2Gb"라고 지정하면 백업이미지를 2Gb 크기로 쪼개라는
뜻이 된다.
- define tapetype
위에서 지정한 tapetype을 정의한다.
define tapetype IBM-LTO {
comment "just produced by tapetype program"
length 101376 mbytes
filemark 0 kbytes
speed 13500 kps
}
|
사용하는 테잎의 종류는 테잎 장치에 따라서 결정되므로 테잎 장치가
무엇이냐에 따라 위의 정의는 달라질 것이다.
Amanda 홈페이지에서
대부분의 테잎 장치에 대한 tapetype을 구할 수 있다. tapetype을
알 수가 없다면 tapetype 명령으로 구할 수도
있으므로 걱정할 필요는 없다. tapetype 명령의
사용법은 tapetype --help를 참고하기 바란다.
또는 Amanda
사용자 메일링 리스트를 뒤져보면 구할 수 있을 것이다.
- define dumptype global
define dumptype global {
program "GNUTAR"
compress server fast
index yes
record yes
}
|
program "GNUTAR"는 백업 프로그램으로 tar를 사용한다는
의미이다.
compress server fast는 테잎서버에서 백업 데이타를
압축하는데 빠른 압축 속도를 사용한다는 의미이다. Amanda는
gzip을 이용하여 압축을 하며 fast는 gzip의 압축률 옵션이다.
즉 가장 낮은 압축률을 의미한다. fast 대신에 best를 사용할
수도 있다. 그리고 server 대신에 client를 사용할 수도 있다.
그 의미는 구구절절이 설명하지 않아도 알 수 있을 것이다.
index yes는 백업되는 파일 목록(카탈로그)를 저장하라는
의미이다.
record yes는 /var/lib/amanda/amandates
를 백업할 때 업데이트하라는 의미이다.
SpaceWar라는 프로젝트와 관련된 데이타들을 따로 백업한다는 가정하에
그와 관련된 설정을 따로 지정할 수 있다. 먼저.
/etc/amanda 밑에 SpaceWar라는 디렉토리를 하나
만들고 그 안에 amanda.conf 파일을 만들어 편집을 하자.
- includefile
포함할 파일을 지정한다.
includefile "/etc/amanda/amanda.conf" /etc/amanda/amanda.conf 파일에 공통으로
사용할 파라메타에 대한 정의가 들어 있으므로 당연히 포함되어야
한다.
- org
이 백업 설정에 대한 적당한 제목을 지정한다.
org "SpaceWar" SpaceWar라는 프로젝트에 대한 백업 설정이므로 SpaceWar라고
지정하였다.
- inparallel
테잎서버에서 동시에 진행 할 수 있는 백업 프로세스의 수
inparallel 4 - maxdumps
하나의 파일서버로 부터 동시에 백업을 진행할 수 있는 최대 개수
maxdumps 2 A라는 파일서버에 SpaceWar의 데이타가 저장되는 디렉토리가 4개
있다면 그 중에서 동시에 2개 디렉토리에 대한 백업을 진행할 수
있다. 전체적으로 동시에 진행되는 백업 프로세스의 수는 inparallel
파라메타에 의해 조절된다. maxdumps 파라메타는 dumptype에서
지정할 수도 있다.
- runtapes
SpaceWar 프로젝트의 백업에 사용될 테잎의 개수
runtapes 2 LTO 미디어는 하드웨어 압축을 하지 않는 상태로 100Gb의 용량을
저장할 수 있으므로 runtapes 2는 200Gb의 데이타를 백업할 수
있다는 의미이다. 3절에서 언급했듯이 각
디렉토리에 대한 백업 용량을 대략 계산한 다음 그 용량이
runtapes 파라메타 값으로부터 계산되는 용량을 초과하면
일부가 백업되지 않으므로 runtapes의 값을 적당히 지정해야
할 것이다.
- dumpcycle
한 번의 전체백업으로부터 다음 번 전체백업까지의 주기
dumpcycle 4 weeks 이 값은 적절히 알아서 잡아주면 될 것이다. 1개월에 한 번 정도
전체백업을 한다고 생각하면 4주 정도면 될 것이다. dumpcycle은
Amanda가 자동으로 백업 레벨을 결정하기 위해 필요한 하나의
파라메타이며, 필자는 백업 레벨과 스케줄을 수동으로 결정하기
때문에 dumpcycle 파라메타가 그리 큰 의미는 없었다. dumpcycle
값을 0으로 지정하면 항상 전체백업을 한다는 의미이며 dumpcycle
파라메타는 dumptype에서 지정할 수도 있다.
- runspercycle
dumpcycle 동안에 실행될 amdump의 회수
runspercycle 4 dumpcycle이 4주이고 일주일에 한 번 백업을 실행한다면 dumpcycle
동안에 실행될 amdump의 회수는 4회이다. 수동으로 백업 스케줄을
조절할 계획이라면 이 파라메타도 큰 의미는 없다.
- tapecycle
dumpcycle 동안에 사용될 테잎의 개수
tapecycle 4 tapes dumpcycle 동안에 2개의 테잎을 가지고 데이타를 계속 덮어 쓰면서
사용할 계획이라고 하자. 이때 테잎이 에러가 날 경우를 생각해서
tapecycle은 4 정도로 해 두면 될 것이다.
- labelstr
테잎 라벨을 구성할 문자열
labelstr "^SpaceWar-[0-9][0-9][0-9]*$" amlabel 명령으로 테잎에 라벨을 써 넣을때 위 문자열의 구성에
맞아야 한다.
- define dumptype
/etc/amanda/amanda.conf 파일에서 정의했던
dumptype global 외에 다른 dumptype을 정의한다.
define dumptype always-full {
global
comment "Full dump of this filesystem always"
priority high
dumpcycle 0
maxdumps 4
}
|
dumpcycle을 0으로 설정하여 항상 전체백업을 하도록 설정하고
dumptype global을 포함하도록 하였으며 maxdumps를 4로 지정하였다.
define dumptype incr-only {
global
comment "incremental dump only"
priority high
strategy nofull
maxdumps 4
}
|
strategy를 nofull로 지정하여 항상 백업 레벨 1의 증분 백업을
하도록 설정하였다. 기타 dumptype에서 지정할 수 있는 파라메타에
대해서는 Amanda man page를 참고하기 바란다.
- 기타
infofile "/var/lib/amanda/SpaceWar/curinfo"
logdir "/var/log/amanda/SpaceWar/log"
indexdir "/var/lib/amanda/SpaceWar/index"
tapelist "/var/lib/amanda/SpaceWar/tapelist"
|
disklist 파일에는 백업할 데이타를 갖고 있는 파일서버의 hostname과 백업할
디렉토리가 저장되어 있다.
gmfs1 /SpaceWar1/Program-Sources always-full
gmfs1 /SpaceWar1/Graphic-Sources always-full
gmfs2 /SpaceWar2/Protype always-full
gmfs2 /SpaceWar2/Schedule always-full
|
첫 줄을 살펴보자. gmfs1은 파일서버의 호스트네임이고,
/SpaceWar1/Program-Sources은 gmfs1에 있는 백업할
디렉토리이며 always-full은 위에서 설정했던 dumptype이다. 이와 같은
형태로 백업할 디렉토리를 disklist 파일에 적어주면 된다. 그 외에 spindle
값과 interface를 지정할 수 있으니 Amanda man page를 참고하기 바란다.
- amlabel
테잎에 라벨을 써 넣는다. amlabel "configure name" "label" |
/etc/amanda밑에 만들어진 SpaceWar라는
디렉토리가 configure name이 되며
/etc/amanda/SpaceWar/amanda.conf에 정의된
labelstr이 label이 될 것이다.
$ amlabel SpaceWar SpaceWar-001 |
미디어 체인저가 있고 제대로 설정이 되어 있다고 할 경우, 첫번째
slot에 있는 테잎에 라벨을 써 넣는다면,
$ amlabel SpaceWar SpaceWar-001 slot 1 |
- amcheck
설정에 문제가 없는 지 점검을 해 준다. - amadmin
어떤 라벨을 가진 테잎을 재 사용할 것인지 안 할 것인지, 다음에
사용할 테잎은 어떤 라벨을 가진 것인지 등등 여러가지 작업을 할 수 있다.
SpaceWar의 백업에 사용될 테잎의 목록을 보여준다.
SpaceWar-001이라는 라벨을 가진 테잎을 백업에 사용하지 않도록 설정한다.
$ amadmin SpadeWar no-reuse SpaceWar-001 |
SpaceWar-001이라는 라벨을 가진 테잎을 백업에 사용도록 설정한다.
$ amadmin SpadeWar reuse SpaceWar-001 |
- amdump
실제 백업을 실행시킨다. - amstatus
백업을 실행시킨 후 진행 상황을 모니터 한다. - amrecover, amrestore
백업된 데이타를 복원한다. root의 권한으로 실행시킨다. - amflush
백업된 데이타가 어떤 이유로 테잎에 옮겨지지 않고 로컬디스크
에 저장된 것을 테잎으로 다시 옮기고자 할 때 사용한다. - amcleanup
실패한 백업이 있을 때 이를 청소하기 위해 사용된다. amdump 명령으로 백업을 실행시켰으나 어떤 이유로 백업에 실패한
경우, 반드시 amcleanup 명령으로 관련 파일을 청소해 주어야한다.
그리고 로컬디스크에 임시로 저장되어 있는 백업 데이타도 지워
주어야 한다.
위에서 열거한 명령어는 8절에서 자세히 살펴볼 것이다.
나머지 명령어에 대한 것은 Amanda man page를 참고하기 바란다.
몇 가지 가정을 하고 실제 백업을 해 보자.
Amanda 패키지는 2절에서 설명한대로 configure의
사용자 옵션을 바꾸어서 설치한다.
테잎 장치가 제대로 작동한다. 테잎 장치는 IBM 3581 autoloader를 사용한다. 백업을 실행할 테잎서버의 사용자는 styoo이다. SpaceWar라는 프로젝트의 데이타를 백업한다. 테잎서버의 호스트네임은 backupsvr이다. 프로젝트 SpaceWar의 데이타는 파일서버 gmfs1과 gmfs2에 저장된다. gmfs1의 OS는 윈도우 2000 Server이고, gmfs2는 리눅스이다. 프로젝트 SpaceWar와 관련된 각 파일서버의 디렉토리는 아래와 같다. gmfs1 : E:\SpaceWar1\Program-Sources
gmfs1 : E:\SpaceWar1\Graphic-Sources
gmfs2 : /SpaceWar2/Prototype
gmfs2 : /SpaceWar2/Schedule
|
gmfs1의 E:\SpaceWar1 디렉토리를 backupsvr의
/SpaceWar1디렉토리에 SMB 마운트한다.
파일서버와 테잎서버는 서로 호스트네임을 알 수 있도록
/etc/hosts 파일에 기록해 두는 것이 좋다.
mailto "styoo"
dumpuser "styoo"
etimeout 3600
dtimeout 3600
tapedev "/dev/nst0"
tpchanger "mtx-changer"
tapetype IBM-LTO
columnspec "HostName=0:13,Disk=1:40,OrigKB=1:9,OutKB=1:9,DumpRate=1:7,TapeRate=1:7"
holdingdisk hd1 {
comment "main holding disk"
directory "/backup-image/Image"
use -10Mb
chunksize 0
}
define tapetype IBM-LTO {
comment "just produced by tapetype program"
length 101376 mbytes
filemark 0 kbytes
speed 13500 kps
}
define dumptype global {
program "GNUTAR"
compress server fast
index yes
record yes
}
|
autoloader를 구동하는데 사용할 mtx-changer 스크립트는 mtx 패키지에
포함되어 있는 것을 사용하였으나, IBM 3581 autoloader에 적용하기에는
일부 작동에 문제가 있어 필자가 일부를 수정하였다. 수정된 스크립트는
에 있으니 10절을 참고하기 바란다.
includefile "/etc/amanda/amanda.conf"
org "SpaceWar"
inparallel 4
runtapes 2
dumpcycle 4 weeks
runspercycle 4
tapecycle 4 tapes
maxdumps 4
labelstr "^SpaceWar-[0-9][0-9][0-9]*$"
infofile "/var/lib/amanda/SpaceWar/curinfo"
logdir "/var/log/amanda/SpaceWar/log"
indexdir "/var/lib/amanda/SpaceWar/index"
tapelist "/var/lib/amanda/SpaceWar/tapelist"
define dumptype always-full {
global
comment "Full dump of this filesystem always"
priority high
dumpcycle 0
}
define dumptype incr-only {
global
comment "Incremental dump only"
priority high
strategy nofull
}
|
localhost /SpaceWar1/Program-Sources always-full
localhost /SpaceWar1/Graphic-Sources always-full
gmfs2 /SpaceWar2/Prototype always-full
gmfs2 /SpaceWar2/Schedule always-full
|
/Spacewar1의 하위 디렉토리는 윈도우 2000 서버인
gmfs1에 있으므로 samba를 이용하여 백업해야 한다. amanda는 윈도우 머신의
데이타를 백업하기 위해 smbclient를 사용하여 백업을 진행한다. 그러나 그렇게
하지 않고, 윈도우의 디스크를 테잎서버에 SMB 마운트하여 마치 로컬디스크를
백업하듯이 할 수도 있다. 여기서는 SMB 마운트하여 로컬디스크를 백업하듯이
할 것이다. samba를 이용하여 백업을 진행한다면, localhost를 gmfs1으로 바꾸고
/etc/amandapass 파일에 공유이름과 해당 공유를 액세스
할 수 있는 사용자 그리고 암호를 적어주어야 한다. 그 포맷은 Amanda man
page를 참고하기 바란다.
백업을 진행할 사용자는 styoo이며 관련된 파일에 대한 쓰기 권한이 있어야
함은 두 말할 나위도 없다. /etc/amanda디렉토리 및 그
하위 디렉토리와 파일에 대한 읽기쓰기 권한이 styoo에게 있어야 할 것이다.
뿐만 아니라, /var/lib/amanda 디렉토리 및 그 하위의
파일들 그리고 /var/log/amanda 디렉토리 및 그 하위의
파일들에 대한 읽기쓰기 권한이 필요하다. 또한,
/dev/nst0, /dev/sg0에 대한
읽기쓰기 권한도 당연히 있어야 할 것이다.
이제, 백업을 진행해 보자. Amanda를 설치하고 위와 같이 설정을 끝마친 후
Amanda 명령어를 이용하여 백업을 진행할 때 흔히 발생할 수 있는 에러 상황도
함께 취급할 것이다.
테잎 장치에 빈 테잎을 하나 넣고 amlabel 명령으로 테잎에 라벨을 붙이자.
-f 옵션을 붙여서 강제로 라벨을 써 넣도록 하자.
$ amlabel -f SpaceWar SpaceWar-001
rewinding, reading label, not an amanda tape
rewinding, writing label SpaceWar-001, checking label
amlabel: couldn't write tapelist: No such file or directory
|
tapelist 파일이 없다고 불평을 한다. 이것은
/var/lib/amanda/SpaceWar 디렉토리가 없기 때문이니
/var/lib/amanda/ 디렉토리에 SpaceWar 디렉토리를
만들어 주면 된다. 이렇게 해 주면 amlabel 명령이 그 밑에 tapelist 파일을
자동으로 만든다.
테잎에 라벨을 써 넣은 후, amadmin 명령으로 사용할 테잎 목록을 살펴보자.
$ amadmin SpaceWar tape
The next Amanda run should go onto a new tape.
The next Amanda run should go onto a new tape.
|
amlabel 명령으로 SpaceWar-004까지 테잎에 라벨을 붙여 보자. 그리고서
/var/lib/amanda/SpaceWar/tapelist 파일을 보면
다음과 같이 되어 있을 것이다.
0 SpaceWar-004 reuse
0 SpaceWar-003 reuse
0 SpaceWar-002 reuse
0 SpaceWar-001 reuse
|
amadmin 명령으로 사용할 테잎 목록을 다시 한 번 살펴보자.
$ amadmin SpaceWar tape
The next Amanda run should go onto tape SpaceWar-001 or a new tape.
The next Amanda run should go onto tape SpaceWar-002 or a new tape.
|
runtapes과 tapecycle의 값에 따라서 그리고 tapelist 파일의 내용에 따라서
위 명령의 결과는 달라진다. 한 번 체크해 보기 바란다.
amcheck 명령으로 설정에 이상이 없는지 확인해 보자. 데비안의 경우, amanda
명령어들이 /usr/sbin 디렉토리에 있는데 amcheck
명령의 실행 권한이 root와 backup에게만 있을 수도 있으니 실행 권한을
추가해 주어야 할 것이다.
$ amcheck SpaceWar
ERROR: program /usr/lib/amanda/planner: not executable
Holding disk /backup-image/Image: 6636356 KB disk space available, using 6626116 KB
ERROR: log dir /var/log/amanda/SpaceWar: not writable
NOTE: skipping tape-writable test
Tape SpaceWar-001 label ok
NOTE: info dir /var/lib/amanda/SpaceWar/curinfo: does not exist
NOTE: it will be created on the next run
NOTE: index dir /var/lib/amanda/SpaceWar/index: does not exist
Server check took 0.010 seconds
Amanda Backup Client Hosts Check
--------------------------------
ERROR: gmfs2: [access as styoo not allowed from styoo@backupsvr] amandahostsauth failed
WARNING: localhost: selfcheck request timed out. Host down?
Client check: 2 hosts checked in 30.018 seconds, 2 problems found
|
몇 가지 에러와 경고 메세지가 보인다. 하나씩 살펴보자.
"ERROR: program /usr/lib/amanda/planner: not executable" 여기서
planner라는 것은 amdump 명령어가 실행된 후 amdump의 부름을 받고
실행되는 명령어이다. 이 외에도 몇 가지 다른 명령어가 있는데 데비안의
경우, 이들 명령어는 /usr/lib/amanda 디렉토리에
존재한다. 실행 권한이 root 또는 backup에게만 있을 수 있으니 다른
사용자에게 실행 권한이 없는 명령어를 찾아서 실행 권한을 부여해야 할
것이다.
"ERROR: log dir /var/log/amanda/SpaceWar: not writable" 이것은
SpaceWar 디렉토리가 없기 때문이니 디렉토리를 만들어 준다. 그 밑에
표시된 curinfo와 index가 없다는 메세지도 마찬가지로
/var/lib/amanda 디렉토리 밑에 SpaceWar를
만들어 준다.
"ERROR: gmfs2: [access as styoo not allowed from styoo@backupsvr]
amandahostsauth failed" 이 메세지는 backupsvr의 사용자 styoo에게
파일서버 gmfs2(리눅스 머쉰임)의 amandad에 접근할 권한이 없기 때문에
발생한다. gmfs2의 /etc/amandahosts 파일에
라고 한 줄을 넣어주면 될 것이다.
"WARNING: localhost: selfcheck request timed out. Host down?" 이
메세지는 amandad(Amanda 데몬)가 다른 사용자의 권한으로 실행되었기
때문이다. /etc/inetd.conf을 열어보면 아래와
같은 내용이 있을 것이다.
amanda dgram udp wait backup /usr/sbin/tcpd /usr/lib/amanda/amandad
amandaidx stream tcp nowait backup /usr/sbin/tcpd /usr/lib/amanda/amindexd
amidxtape stream tcp nowait backup /usr/sbin/tcpd /usr/lib/amanda/amidxtaped
|
위에서 backup을 실제 백업을 실행하는 사용자(여기서는 styoo)로 바꾸어 준 후
inetd를 재 시동 시키면 될 것이다.
위 문제가 해결되면 다음과 같은 에러가 발생할 수도 있다. "ERROR:
localhost: [access as styoo not allowed from styoo@localhost] open
of /home/styoo/.amandahosts failed" 이것은 말 그대로
/home/styoo/.amandahosts을 열 수 없다는 뜻이다.
/etc/amandahosts 파일을
/home/styoo/.amandahosts에 링크를 시켜주면 된다.
위 문제가 해결되면 다음과 같은 에러가 발생할 수도 있다. "ERROR:
localhost: [access as styoo not allowed from styoo@localhost]
amandahostsauth failed" 이것은 gmfs2에 접근할 수 없다는 에러와
유사한 것으로 테잎서버(backupsvr)의
/etc/amandahosts 파일에
라고 한 줄을 넣어주면 될 것이다.
autoloader와 같은 미디어 체인저가 없는 경우, 다음과 같은 경고
메세지가 나타날 수도 있다. "WARNING: if a tape changer is not
available, runtapes must be set to 1" 이것은 autoloader와 같은
미디어 체인저가 없기 때문에 runtape 파라메타 값이 1로 세팅되어야
한다는 뜻이다. 현재는 2로 설정되어 있다. 이 경고는 무시해도 좋다.
amcheck 명령으로 이상이 없는 것을 확인하였으면, 이제 백그라운드로 amdump
명령을 실행시켜 백업을 해 보자.
amstatus 명령으로 백업 상황을 확인해 보자.
$ amstatus SpaceWar
Using /var/log/amanda/SpaceWar/amdump from 토 9월 14 14:51:50 KST 2002
localhost:/SpaceWar1/Program-Sources getting estimate
localhost:/SpaceWar1/Graphic-Sources getting estimate
gmfs2:/SpaceWar2/Prototype getting estimate
gmfs2:/SpaceWar2/Schedule getting estimate
SUMMARY part real estimated
size size
partition : 4
estimated : 0 0k
failed : 0 0k ( 0.00%)
wait for dumping: 0 0k ( 0.00%)
dumping to tape : 0 0k ( 0.00%)
dumping : 0 0k 0k ( 0.00%) ( 0.00%)
dumped : 0 0k 0k ( 0.00%) ( 0.00%)
wait for writing: 0 0k 0k ( 0.00%) ( 0.00%)
writing to tape : 0 0k 0k ( 0.00%) ( 0.00%)
failed to tape : 0 0k 0k ( 0.00%) ( 0.00%)
taped : 0 0k 0k ( 0.00%) ( 0.00%)
all dumpers active
taper idle
|
백업할 디렉토리의 용량을 계산하고 있는 중이다. 잠시 후에 다시 한 번
amstatus 명령을 실행시켜보자.
$ amstatus SpaceWar
Using /var/log/amanda/SpaceWar/amdump from 토 9월 14 15:06:33 KST 2002
localhost:/SpaceWar1/Program-Sources 0 no estimate
localhost:/SpaceWar1/Graphic-Sources 0 no estimate
gmfs2:/SpaceWar2/Prototype 0 [dump larger than tape, but cannot incremental dump new disk]
gmfs2:/SpaceWar2/Schedule 0 14585k dumping 4832k ( 33.13%) (15:06:36)
SUMMARY part real estimated
size size
partition : 4
estimated : 2 14585k
failed : 3 0k ( 0.00%)
wait for dumping: 0 0k ( 0.00%)
dumping to tape : 0 0k ( 0.00%)
dumping : 1 4832k 14585k ( 33.13%) ( 6.42%)
dumped : 0 0k 0k ( 0.00%) ( 0.00%)
wait for writing: 0 0k 0k ( 0.00%) ( 0.00%)
writing to tape : 0 0k 0k ( 0.00%) ( 0.00%)
failed to tape : 0 0k 0k ( 0.00%) ( 0.00%)
taped : 0 0k 0k ( 0.00%) ( 0.00%)
3 dumpers idle : start-wait
taper idle
network free kps: 270
holding space : 6611460k ( 99.78%)
|
위의 결과를 보면, gmfs2의 디렉토리 중에서
/SpaceWar2/Schedule은 뭔가가 진행되고 있는데,
/SpaceWar2/Prototype은 dump가 테잎보다 크다고 말을
하고 있다. 이것은 /SpaceWar2/Prototype의 용량이
크다기 보다는 각 디렉토리에 대한 백업 용량을 모두 합산한 결과 백업할
용량이 <테잎 한 개의 용량 X runtapes의 값> 보다 크다는 뜻이다.
runtapes의 값을 증가 시키면 대부분 해결될 것이다. 물론, 실제로 디렉토리
하나의 백업 용량이 테잎 한 개의 용량 보다 클 수도 있다. 그러나 Amanda는
이를 문제 삼지는 않는다. 그렇다고 어떤 디렉토리에 대한 백업이미지가 테잎
하나의 크기 보다 크다고 해서 다음 테잎에 이어쓸 수는 없다. Amanda는 다음
테잎에 이어쓰기를 지원하지 않음을 명심하기 바란다. Amanda 패키지의 FAQ
문서를 참고하기 바란다.
그리고 윈도우 서버 gmfs1의 디렉토리를 SMB 마운트한 디렉토리는
"no estimate" 라고 되어 있다. 이 문제는 대개는 퍼미션 문제이다. Amanda
패키지를 빌드할 때 styoo라는 사용자로 옵션을 주었는데, 막상 실행할 때는
엉뚱한 사용자로 amdump를 실행했기 때문이다. 제공되는 패키지 그대로
설치했다면 root 또는 backup 사용자의 권한으로 백업을 실행해야 할 것이다.
웬만한 에러 상황은 체크를 했으니 백업이 잘 완료되었다고 하자. 그리고 1
개의 테잎을 백업에 사용했다고 하자. 이제 다시 한 번 amadmin 명령으로
사용할 수 있는 테잎 목록을 살펴보자.
$ amadmin SpaceWar tape
The next Amanda run should go onto tape SpaceWar-002 or a new tape.
The next Amanda run should go onto tape SpaceWar-003 or a new tape.
|
다음 백업에는 SpaceWar-002 테잎부터 사용하게 될 것이다. 다음 번(두번째)
백업에도 1 개의 테잎을 사용한다면 세번째 백업에는 SpaceWar-003 테잎을
사용할 것이다. 그 다음은 SpaceWar-004, 그 다음은? 그렇다. 다시 돌아와서
SpaceWar-001을 사용하게 된다. 다섯번째 백업에 들어가기 전에 아래와 같이
amadmin 명령으로 SpaceWar-001 테잎을 백업에 사용하지 못하게 해 놓았다면,
SpaceWar-002 테잎을 사용할 것이다.
amadmin SpaceWar no-reuse SpaceWar-001
|
테잎 순서에 대한 더 자세한 것은 amanda를 사용하면서 익히기 바란다.
백업된 데이타를 테잎에 쓰는 중에 에러가 발생한다면 다음 테잎에 데이타를
다시 써 넣으려 할 것이다. 그러나 사용할 다음 테잎이 없다면 백업 데이타는
로컬디스크에 남게되며 백업은 종료된다. 이런 경우에는 새로운 테잎을
준비하여 라벨을 붙인 다음, amflush 명령으로 로컬디스크의 데이타를 테잎에
옮겨 놓을 수 있다.
테잎으로 데이타를 옮겨 쓴 다음에는 amcleanup 명령으로 청소를 해 주어야
한다.
복원을 해 보자. 복원은 amrecover와 amrestore 두 가지를 이용할 수 있다.
여기서는 amrecover를 사용하기로 한다. 복원은 root의 권한으로 실행되어야
한다.
gmfs2의 /SpaceWar2/Schedule 디렉토리 밑에 있던
200206-Prog 이란 디렉토리와
200206-Mail 디렉토리를 하위 디렉토리를 포함하여 모두
복원한다고 하자. /tmp에 복구한다고 가정하자.
# cd /tmp
# amrecover SpaceWar -d /dev/nst0
|
위와 같이 명령을 주면 다음과 같은 프롬프트가 나타날 것이다.
또는 아래와 같은 에러메세지가 나올 수도 있다.
220 backupsvr AMANDA index server (2.4.2p2) ready.
500 Access not allowed: [access as styoo not allowed from root@localhost] amandahostsauth failed
|
/etc/amandahosts에 아래와 같이 root를 등록한다.
에러가 제거 되었으면 다시 amrecover를 실행시켜
/SpaceWar2/Schedule이 있는 호스트를 지정하고
복원할 최상위 디렉토리를 지정한다.
amrecover> sethost gmfs2
amrecover> setdisk /SpaceWar2/Schedule
|
복원할 하위 디렉토리를 지정한다.
amrecover> cd 200206-Prog
amrecover> add *
amrecover> cd ..
amrecover> cd 200206-Mail
amrecover> add *
|
물론, 특정 파일만 복원할 수도 있다. 해당 파일이 있는 디렉토리로 이동해서
파일을 추가해 주면 될 것이다.
복원 명령을 내린다.
필요한 테잎에 대한 정보를 알려줄 것이다. 맞으면 y라고 답한다. 그러면
테잎을 로드한 후 처음부터 읽어면서 해당 파일을 하나씩 복원할 것이다.
여기까지는 테잎서버의 테잎 장치를 이용하여 복원하는 방법이다. 그러나
이런 경우가 있을 수도 있다. 미디오 호환이 가능한 두 대의 테잎 장치를
각각 다른 리눅스 서버에 장착하여 한 대는 백업 전용으로, 다른 한 대는
복원 전용으로 사용하고자 하는 경우도 있을 것이다. 이제 백업 전용 서버에서
백업한 것을 복원 전용 서버에서 백업하는 경우를 살펴보자.
백업 전용 서버의 호스트네임은 backupsvr라 하고, 복원 전용 서버의 호스트
네임은 restoresvr이라 하자. 그리고 /SpaceWar2/Schedule
을 /tmp에 복원한다고 가정하자.
# cd /tmp
# amrecover SpaceWar -s backupsvr -d /dev/nst0
|
-s 옵션으로 backupsvr을 index server로 지정하였다.
/SpaceWar2/Schedule의 백업에 대한 index는
backupsvr에 있기 때문이다. 그 뒤의 과정은 앞서의 복원 과정과 동일하다.
이것으로 복원에 대한 것도 대략 알아 보았다. 더 자세한 것은 Amanda man
page를 참고하면서 그리고 실제로 사용하면서 하나씩 익히는 것이 최선의
방법인 듯 싶다.
dump라는 백업 프로그램은 0에서 9까지의 백업 레벨을
지원한다. Amanda가 내부적으로 사용하는 백업 프로그램은 dump 또는 tar이다.
Amanda도 0에서 9까지의 백업 레벨을 제공하며 백업 레벨은 사용자의 설정을
근거로 Amanda가 스스로 결정한다.
백업 레벨 0은 전체백업을 의미하며 백업 레벨 1은 전체 백업 이후 변경된
내용에 대한 백업을 뜻한다. 백업 레벨 2는 백업 레벨 1 이후 변경된 내용에
대한 백업이다. 나머지 백업 레벨도 비슷하게 생각하면 될 것이다.
필자는 한 달에 1회 전체 백업을 하고 주간 단위로 레벨 1의 백업을 실시한다.
9월 첫째 일요일에 전체 백업을 실시했다면 둘째 일요일에 백업할 내용은
전체 백업 이후 변경, 추가된 파일들일 것이다. 세번째 일요일에 백업할 내용도
레벨 1의 백업이므로 전체 백업 이후 변경, 추가된 파일들일 것이다. 따라서
세번째 일요일에 증분 백업을 하게되면 두번째 일요일에 증분 백업한 내용은
필요없게 되며 그 때 사용한 테잎은 재활용이 가능하게 된다.
강제로 레벨 1의 백업을 실시하기 위해서는 8.2절에서
정의한 dumptype 중에서 incr-only를 사용하면 된다.
localhost /SpaceWar1/Program-Sources incr-only
localhost /SpaceWar1/Graphic-Sources incr-only
gmfs2 /SpaceWar2/Prototype incr-only
gmfs2 /SpaceWar2/Schedule incr-only
|
이제 amcheck 명령으로 이상 유무를 확인한 후, amdump 명령으로 백업을
실행시키면 될 것이다.
Amanda는 백업을 진행하는 중에 로컬디스크(holdingdisk)의 공간이 부족하면
공간에 여유가 생길 때까지 일부 디렉토리에 대한 백업을 일시 중단하고
있다가, 공간에 여유가 생기면 그때 다시 백업을 진행한다. 이때 시간의
지연으로 인해 백업에 걸리는 시간이 늘어나게 된다. 이 경우는 일부
디렉토리를 테잎에 바로 쓰는 것이 유리할 수도 있다. writetotape이라는
dumptype을 정의하고 테잎에 바로 쓰기를 원하는 디렉토리의 dumptype을
writetotape으로 지정하면 될 것이다.
define dumptype wtritetotape {
global
comment "write directly to tape"
priority high
dumpcycle 0
holdingdisk no
}
|
writetotape이 적용된 disklist 파일의 예는 아래와 같다.
localhost /SpaceWar1/Program-Sources writetotape
localhost /SpaceWar1/Graphic-Sources always-full
gmfs2 /SpaceWar2/Prototype always-full
gmfs2 /SpaceWar2/Schedule always-full
|
백업할 필요가 없는 파일이 있을 수도 있다. 이 때는 dumptype에 exclude
또는 exclude list를 지정하여 해결할 수 있다. exclude list에 대해 알아보자.
dumptype은 아래와 같은 모양이 될 것이다.
define dumptype always-full {
global
comment "write directly to tape"
priority high
dumpcycle 0
exclude list "/etc/amanda/SpaceWar/exclude-files"
}
|
exclude-files의 내용은 다음과 같이 작성할 수 있다.
AUTOEXEC.BAT
NTDETECT.COM
arcsetup.exe
ntldr
WINNT
Documents and Settings
System Volume Information
arcldr.exe
bootfont.bin
RECYCLED
Recycled
*.SYS
*.sys
*.ini
|
아래의 스크립트는 IBM 3581 autoloader에 적용 할 수 있도록 수정된 것임을
다시 한 번 밝혀둔다. 일부 수정할 부분이 더 있으나 작동에 별 이상이 없길래
그냥 내버려 두었다.
#! /bin/sh
###############################################################################
# AMANDA Tape Changer script for use with the MTX tape changer program
# Version 1.0 - Tue Feb 20 13:59:39 CST 2001
#
# Based on 'stc-changer' by Eric Berggren (eric@ee.pdx.edu)
# Updated by Tim Skirvin (tskirvin@ks.uiuc.edu)
#
# Given that there's no license...let's make this the Perl Artistic License.
# Just make sure you give me and Eric credit if you modify this.
###############################################################################
### USER CONFIGURATION
# Name of the tape drive (takes place of "tapedev" option in amanda.conf)
# and default driver number in library (usu 0) that DRIVE_NAME points to
DRIVE_NUM=0
# Location of "STC" command and control device
MTX_CMD="/usr/sbin/mtx";
MTX_CONTROL="/dev/sg0";
# Whether tape drive must eject tape before changer retrieves
# (ie, EXB-2x0). Usually okay if set while not necessary, bad if
# required but not set.
DRIVE_MUST_EJECT=1
# How long to check drive readiness (in seconds) after mounting (or
# ejecting) a volume (on some libraries, the motion or eject command may
# complete before the drive has the volume fully mounted and online,
# or ready for retrieval, resulting in "Drive not ready"/"Media not
# ready" errors). Do an "mt status" command every 5 seconds upto this
# time.
DRIVE_READY_TIME_MAX=120
# tape "mt" command location...
MT_CMD="/bin/mt-st" # called via "MT_CMD -f DRIVE_NAME rewind" &
# "MT_CMD -f DRIVE_NAME offline" to eject
# and "MT_CMD -f DRIVE_NAME status" to get ready info
##############################################################################
#
NumDrives=-1
NumSlots=-1
LastSlot=-1
LoadedTape=-1
#
# Usage information
#
usage()
{
echo
echo "Usage: $Progname <command> [arg...]"
echo " -info reports capability and loaded tape"
echo " -slot <slot> loads specified tape into drive"
echo " current reports current mounted tape"
echo " next loads logically next tape (loops to top)"
echo " prev loads logically previous tape (loops to bot)"
echo " first loads first tape"
echo " last loads last tape"
echo " 0..99 loads tape from specified slot#"
echo " -eject uloads current mounted tape"
echo " -reset resets changer (and drive); loads first tape"
echo
exit 5
}
#
# Perform "stc" changer command (& handle the "fatal" errors)
# else, set 'CommandResStr' and 'CommandRawResStr' to the result string
# and 'CommandResCode' to the exit code
#
dotapecmd()
{
cmd=$1
arg=$2
CommandResStr=`$MTX_CMD $MTX_CONTROL $cmd $arg 2>&1`
CommandRawResStr=$CommandResStr
CommandResCode=$?
CommandResStr=`echo $CommandResStr | head -1 | sed 's/^[^:]*: //'`
if [ $CommandResCode -gt 1 ]; then
echo "0 $Progname: returned $CommandResStr"
exit 2
fi
}
#
# Unload tape from drive (a drive command; "ejecttape" is a changer command
# to actually retrieve the tape). Needed by some changers (controlled by
# setting "DRIVE_MUST_EJECT")
#
ejectdrive()
{
# Tell drive to eject tape before changer retrieves; req'd by some
# drives (ie, EXB-2x0). Not needed by QDLT-4x00. Do a "rewind"
# command first, then "offline" to eject (instead of "rewoffl")
#
if [ "$DRIVE_MUST_EJECT" -ne 0 ]; then
mtresstr=`$MT_CMD -f $DRIVE_NAME rewind 2>&1`
mtrescode=$?
if [ $mtrescode -ne 0 ]; then
if echo "$mtresstr" | egrep -sq 'no tape'; then
:; # no tape mounted; assume okay...
else
# can't eject tape, bad; output: <tape#> reason
echo "0 $mtresstr"
exit 1
fi
else
mtresstr=`$MT_CMD -f $DRIVE_NAME offline 2>&1`
mtrescode=$?
checkdrive 1
fi
fi
}
#
# Check drive readiness after (un)mounting a volume (which may take a while
# after the volume change command completes)
#
checkdrive()
{
unmounting=$1
if [ "$DRIVE_READY_TIME_MAX" -gt 0 ]; then
# sleep time between checks
pausetime=5
# number of interations to check
numchecks=`expr $DRIVE_READY_TIME_MAX / $pausetime`
if [ "$numchecks" -eq 0 ]; then
numchecks=1
fi
# check until success, or out of attempts...
while [ "$numchecks" -gt 0 ]; do
mtresstr=`$MT_CMD -f $DRIVE_NAME status 2>&1`
mtrescode=$?
if [ $mtrescode -eq 0 ]; then
# Success ?
return 0
else
# pause, before trying again....
if [ "$numchecks" -gt 1 ]; then
sleep $pausetime
# if unmounting a volume, check for 'mt' command
# failure; (sleep first for additional comfort)
if [ "$unmounting" -ne 0 ]; then
return 0
fi
fi
fi
numchecks=`expr $numchecks - 1`
done
# failed; output: -1 reason
echo "-1 drive won't report ready"
exit 1
fi
}
#
# Get changer parameters
#
getchangerparms()
{
dotapecmd status
if [ $CommandResCode -eq 0 ] && \
echo "$CommandResStr" | egrep -sq '^Storage Changer'; then
NumDrives=`echo $dspec | wc -l`
NumDrives=`echo "$CommandRawResStr" | \
grep 'Data Transfer Element' | wc -l`
if [ "$NumDrives" -le "$DRIVE_NUM" ]; then
echo "$Program: Invalid drive # specified ($DRIVE_NUM > $NumDrives)"
exit 3
fi
# grep 'Data Transfer Element $DRIVE_NUM' | \
LoadedTape=`echo "$CommandRawResStr" | \
grep 'Data Transfer Element' | \
grep 'Storage Element [0-9]' | \
awk '{ print $7 }' `
if [ -z "$LoadedTape" -o "$LoadedTape" = "e" ]; then
LoadedTape=-1
fi
NumSlots=`echo "$CommandRawResStr" | \
grep 'Storage Element [0-9]\{1,\}:' | \
grep -v 'Data Element' | \
wc -l | sed -e 's/ //g' `
LastSlot=`expr $NumSlots - 1`
else
echo \
"$Progname: Can't get changer parameters; Result was $CommandResStr"
exit 3
fi
}
#
# Display changer info
#
changerinfo()
{
getchangerparms
# output status string: currenttape numslots randomaccess?
echo "$LoadedTape $NumSlots 1"
exit 0
}
#
# Eject current mounted tape
#
ejecttape()
{
getchangerparms
ct=$LoadedTape
# If no tape reported mounted, assume success (could be bad if changer
# lost track of tape)
#
if [ $ct -lt 0 ]; then
CommandResCode=0
else
ejectdrive
dotapecmd unload
fi
if [ $CommandResCode -ne 0 ]; then
# failed; output: <tape#> reason
echo "$ct $CommandResStr"
exit 1
#else
# success; output: <tape#> drive
#echo "$ct $DRIVE_NAME"
#exit 0
fi
}
#
# Move specified tape into drive (operation level)
#
doloadtape()
{
slot=$1
if [ "$slot" -eq "$LoadedTape" ]; then
return 0
fi
ejectdrive
ejecttape
dotapecmd load $slot
sleep 25
return $CommandResCode
}
#
# Load next available tape into drive
#
loadnexttape()
{
curslot=$1
direction=$2
startslot=$curslot
while true; do
if doloadtape $curslot; then
return 0
else
if echo $CommandResStr | egrep -sq 'Slot.*reported empty'; then
if [ "$direction" -lt 0 ]; then
curslot=`expr $curslot - 1`
if [ "$curslot" -lt 0 ]; then
curslot=$LastSlot
fi
else
curslot=`expr $curslot + 1`
if [ "$curslot" -gt "$LastSlot" ]; then
curslot=0
fi
fi
# Check if we're back to where we started...
if [ "$curslot" = "$startslot" ]; then
if [ "$direction" -lt 0 ]; then
CommandResStr="No previous volume available"
else
CommandResStr="No subsequent volume available"
fi
return 1
fi
else
return 1
fi
fi
done
}
#
# Report loadtape() status
#
reportstatus()
{
if [ $CommandResCode -eq 0 ]; then
# success; output currenttape drivename
echo "$LoadedTape $DRIVE_NAME"
exit 0
else
# failed (empty slot?); output currenttape reason
echo "$LoadedTape $CommandResStr"
exit 1
fi
}
#
# Move specified tape into drive (command level)
#
loadtape()
{
slot=$1
getchangerparms
case "$slot" in
current)
if [ $LoadedTape -lt 0 ]; then
CommandResStr="Can't determine current tape; drive empty ?"
CommandResCode=1
fi
;;
prev)
if [ $LoadedTape -le 0 ]; then
loadnexttape $LastSlot -1
else
loadnexttape `expr $LoadedTape - 1` -1
fi
;;
next)
if [ $LoadedTape -ge $LastSlot -o $LoadedTape -lt 0 ]; then
loadnexttape 1 1
else
loadnexttape `expr $LoadedTape + 1` 1
fi
;;
first)
loadnexttape 1 1
;;
last)
loadnexttape $LastSlot -1
;;
[0-9]*)
doloadtape $slot
;;
*)
# error; no valid slot specified
echo "$Progname: No valid slot specified"
exit 1
;;
esac
if [ $CommandResCode -eq 0 ]; then
getchangerparms
checkdrive
fi
reportstatus
}
#
# Reset changer to known state
#
resetchanger()
{
ejectdrive
dotapecmd reset
if [ $CommandResCode -ne 0 ]; then
# failed; output: failed? reason
echo "-1 $CommandResStr"
exit 2;
else
loadtape first
fi
}
#############################################################################
#
# MAIN
#
Progname=`basename $0`
if [ ! -x "$MTX_CMD" ]; then
echo "-1 $Progname: cannot run STC command ($MTX_CMD)"
exit 2
fi
if [ -n "$MTX_CONTROL" ]; then
if echo "$MTX_CONTROL" | egrep -sq '^-f'; then
:;
else
MTX_CONTROL="-f $MTX_CONTROL"
fi
fi
if [ -n "$DRIVE_NUM" ]; then
DRIVE_NUM=0
fi
if [ $# -ge 1 ]; then command=$1; else command="-usage"; fi
case "$command" in
-info)
changerinfo
;;
-slot)
loadtape $2
;;
-eject)
ejecttape
;;
-reset)
resetchanger
;;
*)
usage
;;
esac
exit 0
|
|
|