Part 1: 백업 계획
모든 사용자들은 적어도 한번쯤 백업을 계획한다. 그러나 유감스럽게도, 우리 대부분은 “백업하지 않는” 것이 오히려 습관처럼 되어있다.
Disclaimer:
이 기사는 단행본, 하우투 문서들, 맨 페이지, 유즈넷 뉴스그룹, 그리고 셀 수 없는 시간을 키보드와 씨름하며 얻은 유용한 정보들을 제공한다. 비록 모든 주제에 대해 통달했다는 것을 뜻하지는 않지만, 초급자가 중급 사용자가 되는 발판이 될 것이다. 모든 예제들은 우리 홈 네트워크로부터 그대로 가져왔으므로 우리가 아는 한 잘 동작한다. 이 가이드를 어떻게 사용할까
·[Enter]처럼 각 괄호에 담긴 단어들은 키보드에서 그 키를 누르거나 마우스 1번 버튼을 누르라는 뜻이다.
·{your name here}처럼 구불구불한 괄호 안에 담긴 단어들은 사용자가 입력해야 할 “진짜” 데이터에 대응하는 데이터를 뜻한다.
·이탤릭체로(기울어진) 쓰여진 텍스트는 사용자 자신이 셸 프롬프트에 써넣어야 할 명령을 뜻한다.
필요한 것 들 ( Prerequisites)
당신의 시스템에 리눅스가 설치되었다면, 필요한 모든 것이 이미 갖추어져 있을 것이다.
백업 계획 (Backup Plan)
당신이 홈 네트워크에서 백업을 계획하고 있다면, 몇 가지 작업순서를 정할 필요가 있다. 하드디스크가 전혀 못쓰게 되더라도(crash), 백업의 진정한 가치는 실수로 지운 파일이나 변경된 파일 모두를 반드시 되살리는 것이다. 언제고 당신은 (아마 그리 오래지 않아) 어떤 중요한 파일들을 지우거나 변경할 것이다. 그리고 백업도 없이 부트마저 불가능하게 만들게 될 것이다. 사실 이런 것을 털어놓기는 부끄럽지만, 나는 실제로 /root 디렉터리를 한 방에 날려버렸었다.
譯註: 백업 대체로 백업의 가치를 절실하게 느낄 때는 이미 돌이킬 수 없는 큰 대가를 치른 뒤일 경우가 많다. 우습게도, 백업에 대한 이 글을 나는 두 번째 쓰고 있다. 새로 구성한 시스템에 백업에 대한 장치를 미처 못하고 있었는데 마침 원본이 손상되어 버렸기 때문이다. |
Note▶ 당신의 시스템이 크랙된 적이 있다면 백업은 깊이 생각한 후에 결정해야 한다. 백업은 수행과정을 매우 단순하게 하거나 녀석들이 시스템을 망치지 못하도록 계획되어야 한다.(특히 홈 네트워크에서는) 홈 네트워크를 위한 백업계획은 다음 두 가지 영역에 걸쳐 다루어진다: 얼마나 많이 백업을 하려는가? 그리고 어떻게 최소한의 수고로 백업을 할 것인가?
얼마나 백업을 할 것인가
백업하는 공간은 바로 돈이므로 나는 모든 백업을 최소한으로 유지하려 애쓴다. 그래서 나는 단지 선택된 디렉터리만 백업할 뿐, 전체 파일 시스템은 백업하지 않는다. /usr와 /opt 등 디렉터리는 인스톨 시디롬에 그 대부분이 들어있으므로, 하드 드라이브가 손상되더라도 기본적인 것들은 그저 다시 설치하면 그만이다. 그러나, 시스템 환경이나 사용자 설정값이 들어있는 /etc나 /home 디렉터리는 어디에서도 복구할 수 없으므로 정말 중요하다. 백업작업의 효율성과 경제성을 높이기 위해, 당신은 백업 계획에, 선택된 디렉터리를 가끔씩(월 또는 주 단위) 전체 백업을 수행하고, 그 다음엔 변경된 파일만 매일 백업(증분 백업 incremental backups)하도록 설정해야 한다.
譯註: 증분(增分) 백업 적당한 말을 찾으려 애썼는데 결국 이해하기 어려운 말이 되어버렸다. incremental backups는 증분 백업, 또는 부가(附加)적인 백업이라고 번역되기도 하는데, 전체 백업 후에, 백업 시스템의 효율성을 높이기 위해 변경된 파일들만 대상으로 백업을 추가하는 것을 뜻한다. |
어떻게 백업하는가
테이프 드라이버는 홈 네트워크 백업용으로 사용하기에는 대체로 너무 비싸고, 플로피 디스크는 실용성이 없다. (나는 백업 디스크 수가 132 장을 넘었을 때 플로피 디스크를 포기해버렸다) 우리는 여분의 하드 드라이브를 사용하는 방법이 가장 좋은 해결책이라고 생각한다. 단, 여기서 말하는 하드 드라이브가 파티션이 아니라는 것에 주의한다! 내 하드 드라이브에 문제가 생긴 모든 경우에 드라이브 전체가 죽거나 못쓰게 되었지, 피해가 하나의 파티션에 끝나지 않았다. 하드 드라이브를 사용하는 방법이 비록 가장 안전한 방법은 아니지만(譯註: 온라인으로 침투한 크래커에게 시스템이 점령당했을 때 테이프 드라이버가 아마 상대적으로 안전할 것이다), 얼마나 많이 백업할 것인지 범위를 한정하는 방법도 있다.(하지만, 이미 크래커가 은밀히 활동하고 있다면!)
譯註: 백업 파티션과 드라이브 하드 드라이브에 백업하려면 반드시 원본이 들어있는 하드디스크와 물리적으로 다른 파티션에 설치해야 한다. 나는 하드디스크 하나에 파티션을 몇 개 만들고 그 가운데 하나에 백업파일들을 보존하고 있었다. 루트 파티션에 문제가 생겼을 때 몇 번 백업파티션의 데이터로 복원할 수 있었고, 그래서 나는 꽤 안심하고 있었지만, 하드디스크 스핀들 모터가 고장나자 백업파티션은 아무 소용도 없었다. |
백업 프로그램들
모든 un*x 계열의 배포판에는 백업에 사용할 수 있는 세 개의 일반적인 프로그램이 포함되어 있다: tar, cpio, 그리고 dump가 그 것으로 각각의 유틸리티는 저마다 장점과 단점을 가지고 있다.
TAR: tar(Tape ARchive)는 소규모 네트워크에서 백업 프로그램으로 가장 일반적으로 사용되는 유틸리티이다. 이 유틸리티는 오래 전부터 여러 가지 용도로 사용되어 왔고, 앞으로도 아마 꽤 오랫동안 남아있을 것이다. 대부분의 사람이 모르고 있지만, tar는 테이프에 파일들을 옮겨 넣기 위해서 만들어진 것으로 백업용으로 설계된 것이 아니다. tar의 목적은 백업이 아니라 다른 컴퓨터들에서도 설치될 수 있도록 파일들을 테이프에 옮겨 쓰는 것이다. 그런 이유로 tar는 증분 백업기능이 미약하다.
CPIO: cpio는 증분 백업 기능을 제외하고 tar와 비슷한 유틸리티이다. 사실, cpio는 “파일 리스트” 기능조차 없다: 백업본에 포함할 파일들을 선택하려면, cpio는 find 프로그램으로부터 파일이름을 파이핑하여 사용해야만 한다. 하지만 cpio는 tar에 비해 두 가지 장점을 가진다: cpio는 더 작은 비압축 백업본을 만들고, 백업본에 손상된 부분이 있더라도 프로그램이 그냥 죽어버리지 않는다.
譯註: cpio 아래는 find 명령의 출력을 cpio의 표준입력으로 사용하는 일반적인 방법이다. /home 디렉터리 아래 모든 파일을 테이프 드라이브(/dev/st0)로 백업한다:
$ find /home -print | cpio -o > /dev/st0 find 유틸리티의 -mtime, -newer 등 옵션을 사용하면 증분 백업도 쉽게 할 수 있다. -newer 옵션으로 비교하는 /backup/time/home_full 파일은 최근 백업시간을 기록한 파일이다: $ find /home -mtime -l -name .bak -print | cpio -o > /dev/st0 $ find /home -newer /backup/time/home_full -print | cpio -o > /dev/st0
cpio와 tar는 압축을 하지 않고, 많은 파일을 묶어 하나의 덩어리로 만드는 유틸리티이다. ‘더 작은 비압축본’은 cpio가 더 효율적으로 파일을 묶을 수 있다는 것을 뜻한다.(일반적으로 백업 대상 파일의 전체크기가 백업매체의 크기보다 훨씬 크다면 tar가 더 유리하다.)
‘그냥 죽어버리지 않는다’는 말은 백업본에 손상된 부분이 있다면 그 부분을 건너뛰고 계속해서 작업을 수행한다는 뜻이다. 이 기능이 정말 고마울 때가 있을 것이다. |
DUMP: dump는 tar나 cpio와 완전히 다른 프로그램이다. 이 유틸리티는 파일들이 아닌, 파일시스템 전체를 백업한다. dump는 파일 시스템이 하드 드라이브에 있거나, 심지어 그 파일시스템 안에 있는 파일이라도 상관하지 않는다. dump 유틸리티는 0-9 단계의 증분 백업을 지원하며, 한 파일시스템을 한번에, 신속하게, 그리고 효율적으로 옮겨 쓴다. 하지만, 가상 디렉터리를 다룰 수 없으며, tar나 cpio보다 훨씬 많은 백업공간을 잡아먹는다.
우리의 백업 방법
우리는 run-backup이라는 이름을 가진 백업 스크립트를 사용한다. 이 글의 끝인 Part 3에 쓰여진 글을 그대로 하드 드라이브의 적당한 위치로 옮긴 다음, 아래 명령을 수행해 실행할 수 있도록 설정한다:
chmod 777 run-backup [Enter]
run-backup 스크립트에서 어떤 부분을 고쳐야 할까
이 스크립트는 변수 네 개만 바꾸면 어떤 컴퓨터에서도 실행할 수 있도록 디자인되었다: COMPUTER, DIRECTORIES, BACKUPDIR, 그리고 TIMEDIR. 현재 우리는 리눅스 박스 두 대와 솔라리스 박스 두 대에서 이 스크립트를 실행하고 있다. BACKUPDIR은 우리 머신에 nfs로 마운트 되어 있지만, 컴퓨터에 연결된 다른 어떤 하드 드라이브라도 상관없다.
스크립트가 하는 일은 무엇인가?
스크립트가 실행되면, 먼저 오늘이 이 달의 첫 번째 날인지 검사한다. 만약 그렇다면, 스크립트는 DIRECTORIES 변수에 설정된 디렉터리와 파일리스트 전체를 tar로 묶고, 예를 들어 myserver-01Nov.tgz처럼 파일이름에 컴퓨터 이름과 날짜, 그리고 tgz를 붙인 다음, BACKUPDIR 변수에 설정된 디렉터리에 집어넣는다. 백업본의 파일이름들은 각각 서로 다르므로, 당신이 지우지 않는 한 BACKUPDIR 속에 계속 남아있을 것이다.
그 다음에, 오늘이 만약 이 달의 첫 날은 아니지만 일요일이라면, 스크립트는 DIRECTORIES에 설정된 목록 전체에 대한 백업을 만들고, BACKUPDIR 안에 있는 일요일 파일에 덮어쓴다. 다시 말하면, 백업 디렉터리에는 오직 하나의 일요일 파일만 있어서 매주 일요일마다 이 파일을 덮어쓰는 것이다. 그런 방법으로 하드 드라이브 공간을 쓸데없이 낭비하지 않도록 만들면서도 여전히 한 주 전의 전체 백업은 남아있게 된다.
스크립트는 또 일요일의 날짜를 TIMEDIR 디렉터리에 넣어둔다. 만약 오늘이 첫 번째 일요일이 아니라면, 스크립트는 전체 백업이 있었던 일요일 이후에 변경된 파일에 대해서만 모두 증분 백업을 만든다. 그런 이유로 일요일이 지나고 매 요일의 백업은 마지막 파일보다 계속 커지게 될 것이다.
당신은 최근 24시간 이내에 변경된 파일만 증분 백업을 하고 매 요일의 백업은 최소한으로 유지하려고 애쓰겠지만, 혹시 당신의 하드 드라이브가 이번 금요일에 먼 남쪽(?)으로 가버린다면, 당신은 일요일, 월요일, 화요일, 수요일, 그리고 목요일의 백업을 복원해야만 할 것이다. 일요일과 다른 요일들의 백업으로 백업본은 계속 더 많은 파일을 포함하지만, 당신은 단지 일요일과 목요일의 백업만으로 복원해야한다. 아래에 백업 디렉터리의 간단한 보기가 있다:
root 828717 Oct 1 16:19 myserver-01Oct.tgz root 14834 Oct 22 01:45 myserver-Fri.tgz root 5568 Oct 18 01:45 myserver-Mon.tgz root 14999 Oct 23 01:44 myserver-Sat.tgz root 1552152 Oct 24 01:45 myserver-Sun.tgz root 5569 Oct 21 01:45 myserver-Thu.tgz root 5570 Oct 19 01:45 myserver-Tue.tgz root 5569 Oct 20 01:45 myserver-Wed.tgz
스크립트를 어떻게 실행시킬까?
우리는 매일 새벽 1시(모두 잠들어 있을 시간)에 cron 작업으로 스크립트를 실행한다. cron에 대한 자세한 도움말은 Part 2에 있다.
주의: 증분 백업은 일요일에 백업한 시간을 알아야한다. 만약 당신이 주중에 백업 스크립트를 시작했다면, TIMEDIR 디렉터리 안에 시간파일을 만들어야 한다.(echo $NOW > $TIMEDIR/$COMPUTER-full-date #update full backup date) 예문으로 제공되는 스크립트에서 이 파일 이름은: myserver-full-date이고 그 속에는 다음 한 줄이 들어있다:
26-Sep
복원 Restoring:
복원은 백업보다 상대적으로 쉬운데, 한 가지만 잘 기억하자: tar는 파일이름 앞에 / 문자를 포함하지 않는다. 그러므로 /etc/passwd 파일을 복원한다면 먼저 / 디렉터리로 옮겨간 다음에 아래처럼 명령을 써야한다:
tar -zxvf {wherever_file_is}/myserver-Sun.tgz etc/passwd
譯註: cpio, dump 복원 cpio로 만들어진 백업도 일부분을(또는 전체) 복원할 수 있다. 아래는 테이프 백업장치로부터 /etc 디렉터리를 복원하는 명령이다. -m 옵션은 파일 속성을 그대로 복원하며, -d 옵션은 서브디렉터리 구조도 복원하는 옵션이다:
cpio -imd ‘/etc’ < /dev/st0
dump로 만들어진 백업은 restore로 복원한다. dump처럼 restore도 사용자에게 상세한 설명을 제공하며, 대화형으로 동작한다. |
다음 달에는 dhcp를 살펴보기로 한다.
Copyright 1999, JC Pollman and Bill Mote Published in Issue 47 of Linux Gazette, November 1999 & http://www.linuxlab.co.kr/~el/
Part 2: Cron
리눅스 배포판에는 작업일정 관리와 관련된 프로그램으로 두 가지가 따라 나온다: cron과 at가 그 것으로, 둘 다 시스템이 부트될 때 데몬으로 실행된다 - 그래서 이들 프로그램은 결코 끝나지 않는다(시스템이 종료되거나 데몬을 죽이기 전까지). cron 스케줄은 일정을 반복해서 수행하고 at은 한번만 수행한다.
cron은 crontab 파일로부터 실행에 필요한 정보를 읽어들인다. 시스템과 각각의 사용자는 자신의 crontab 파일을 가진다. 시스템의 crontab은 /etc/crontab에 있다. 이 파일은 그대로 둔다. run-backup 일정을 설정하기 위해, root 사용자로 자신의 crontab 파일을 만들어야 한다.
루트의 crontab 파일을 만들자
먼저 EDITOR 변수를 정의한다. 이 변수는 아마 로그인하는 모든 사용자들이 반드시 읽어들이는 /etc/profile 에 넣어두는 방법이 가장 좋을 것이다. /etc/profile을 열고 아래 두 줄을 추가한다.
EDITOR=vi [Enter] export EDITOR [Enter]
만약 vi보다 더 좋아하는 에디터가 있다면, 당신이 좋아하는 것으로 바꾸길 바란다. 바뀐 변수가 시스템에 반영되려면 로그아웃한 다음 다시 로그인해야한다. 그 다음 아래처럼 쓴다:
crontab /etc/crontab [Enter]
이 명령은 시스템의 crontab을 복사하여, 당신이 사용할 crontab 파일을 만든다. 이제, 아래 명령으로 당신의 crontab 파일을 편집한다:
crontab -e [Enter]
crontab은 실행되는 프로그램과 설정파일 모두에 사용되는 이름이라는 것을 기억한다 - passwd랑 비슷하다. 아마 아래와 비슷한 줄들이 보일 것이다(原註: 이 예문은 RedHat 배포판의 crontab이다):
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/
# run-parts 01 * * * * root run-parts /etc/cron.hourly 02 4 * * * root run-parts /etc/cron.daily 22 4 * * 0 root run-parts /etc/cron.weekly 42 4 1 * * root run-parts /etc/cron.monthly
우리가 실행하려는 명령들이 아니므로 HOME=/ 줄 아래 모든 것을 지우고, run-backup 스크립트가 저장되어 있는 디렉터리 이름을 PATH에 추가한다.
crontab 안에서 각각의 줄은 프로그램 하나씩을 실행한다. crontab 파일은 특별한 형식을 가지는데: 프로그램이 실행되는 데 필요한 다섯 개의 필드로 구성된다.
주의: 시스템 crontab 안에는 프로그램을 실행하기 위해 cron 데몬에게 알려주어야 하는 특별한 사용자(예를 들어 root)가 설정되어 있지만, 사용자 crontab에는 이 필드가 필요 없다. 다섯 개의 필드는 다음과 같다:
minutes hours day-of-month month day-of-week
맨 페이지에 따르면:
시간과 날짜 필드는:
field allowed values minute 0-59 hour 0-23 day of month 1-31 month 1-12 (or names, see below) day of week 0-7 (0 or 7 is Sun, or use names) |
어떤 필드에 애스터리스크(*, asterisk)가 있다면, “처음부터-끝까지” 항상 설정되어 있다는 의미이다.
숫자로 된 범위는 허용된다. 하이픈(-, hyphen)으로 두 숫자를 구분하여 범위를 설정하며 앞에 있는 숫자가 뒤보다 작아야한다. 특정 범위는 그 사이 숫자들을 포함한다. 예를 들어, 시간 필드에 사용된 8-11은 8, 9, 10 그리고 11시에 정해진 항목을 실행한다.
목록은 허용된다. 목록은 숫자들(또는 범위들)을 쉼표(,)로 구분하여 설정한다. 예를 들어: “1,2,5,9”, “0-4,8-13”.
간격 수치(step values)는 범위에 덧붙여 사용할 수 있다. 범위 뒤에 “/<number>”를 덧붙여 지정한 범위 안에서 특정 수치를 건너뛴다. 예를 들자면, “0-23/2”는 한 시간 건너 다른 한 시간마다 특정한 명령을 실행하기 위해 시간 필드에 사용될 수 있다.(V7 표준에서 “0,2,4,6,8,10,12,14,16,18,20,22”이 선택된다.) 간격은 애스터리스크 뒤에도 허용되므로, 당신이 “매 두 시간마다”를 말하려 한다면 그저 “*/2”라고 사용한다.
“month”와 “day of week” 필드에는 이름이 사용될 수도 있다. 특정한 요일이나 달을 구분할 수 있도록 앞에서 세 글자 정도를 사용한다(문제가 없는 경우). 범위나 목록에는 이름이 허용되지 않는다.
날짜와 요일이 함께 설정되어 있다면, 두 설정 모두 적용된다. 예를 들어 “30 4 1,15 * 5”라고 다섯 개의 필드가 설정되었다면 매달 1일과 15일, 4시 30분에 명령을 실행하고, 또 매주 금요일마다 같은 명령을 실행한다.
이제, 우리가 매일 새벽 한 시 5분이 되면 백업 스크립트를 실행하려 한다면, 우리 crontab 파일은 다음과 같을 것이다:
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin MAILTO=root HOME=/
5 1 * * * /usr/local/bin/run-backup
그리고 스크립트는 무슨 일이 있었는지 알리기 위해 작업이 끝난 후에는 root에게 email을 보낸다. run-backup 스크립트가 만족할만하게 작동해서 굳이 메일을 확인할 필요가 없다거나, crond로부터 자꾸 날아드는 email이 귀찮아졌다면 MAILTO 줄을 다음과 같이 고친다:
MAILTO=””
더 많은 정보를 원한다면, 맨 페이지를 살펴본다:
man crontab (/usr/bin/crontab, 실행파일에 대한 도움) man 5 crontab (/etc/crontab, 설정파일에 대한 도움) man cron (cron과 cron 데몬에 대한 도움)
Part 3: run-backup 스크립트
#!/bin/sh # 전체와 증분 백업 스크립트 # full and incr backup script # created 27 Sep 99 # Based on a script by Daniel O’Callaghan <danny@freebsd.org>
# 아래 변수 다섯 개를 당신의 컴퓨터/백업에 알맞은 것으로 바꾼다.
COMPUTER=myserver # 컴퓨터 이름 DIRECTORIES=”/etc /home” # 백업할 대상 디렉터리 BACKUPDIR=/backup/backups # 백업본이 만들어질 디렉터리 TIMEDIR=/backup/backups/last-full # 전체 백업한 날짜를 저장할 디렉터리 TAR=/bin/tar # tar 유틸리티 이름과 위치
# 이 아래 줄은 모두 손대지 말고 그대로 둔다.
PATH=/usr/local/bin:/usr/bin:/bin DOW=`date +%a` # 요일 이름, 예를 들어 Mon DOM=`date +%d` # 월 단위 날짜, 예를 들어 27 DM=`date +%d%b` # 날짜와 달, 예를 들어 27Sep
# 그 달의 첫 날에 영구적인 전체 백업을 만든다. # 매주 일요일마다 전체 백업을 만든다 - 이전에 만든 일요일 백업을 덮어쓴다. # 한가한 시간에 증분 백업을 만든다. # 각각의 증분 백업은 지난주에 만든, # 같은 이름을 가진 증분 백업을 덮어쓴다. # # 만약 NEWER = “” 이라면, tar는 지정한 디렉터리 안의 모든 파일을 백업한다.
# 그렇지 않다면 NEWER 날짜보다 새로운 파일들만 백업한다. # NEWER는 매주 일요일마다 쓰여진 날짜파일로부터 날짜를 가져온다.
if [ $DOM = “01” ]; then # 달마다 하는 전체 백업 NEWER=”” $TAR $NEWER -z -c -f $BACKUPDIR/$COMPUTER-$DM.tgz $DIRECTORIES fi
if [ $DOW = “Sun” ]; then # 매주 일요일마다 전체 백업 NEWER=”” NOW=`date +%d-%b` echo $NOW > $TIMEDIR/$COMPUTER-full-date # 전체백업 데이터를 업그레이드. $TAR $NEWER -z -c -f $BACKUPDIR/$COMPUTER-$DOW.tgz $DIRECTORIES
else # 증분 백업 - 지난주의 백업을 덮어쓴다. # 지난번 전체 백업을 한 날짜를 가져온다. NEWER=”--newer `cat $TIMEDIR/$COMPUTER-full-date`” $TAR $NEWER -z -c -f $BACKUPDIR/$COMPUTER-$DOW.tgz $DIRECTORIES fi
譯註: tar 옵션 tar는 원래 xvzf처럼 하이픈 없이 옵션을 한 덩어리로 묶어 사용한다. 하지만 유닉스계열의 표준 유틸리티들이 하이픈으로 옵션을 구분하므로 위 예문에서 tar는 표준적인 표기형식을 따르고 있다. |
|