블로그 > 블로거 http://blog.naver.com/wonie777/120001195066 | ||||||||
Part 1: 백업 계획 모든 사용자들은 적어도 한번쯤 백업을 계획한다. 그러나 유감스럽게도, 우리 대부분은 “백업하지 않는” 것이 오히려 습관처럼 되어있다.
Disclaimer: 이 기사는 단행본, 하우투 문서들, 맨 페이지, 유즈넷 뉴스그룹, 그리고 셀 수 없는 시간을 키보드와 씨름하며 얻은 유용한 정보들을 제공한다. 비록 모든 주제에 대해 통달했다는 것을 뜻하지는 않지만, 초급자가 중급 사용자가 되는 발판이 될 것이다. 모든 예제들은 우리 홈 네트워크로부터 그대로 가져왔으므로 우리가 아는 한 잘 동작한다. 이 가이드를 어떻게 사용할까 ·[Enter]처럼 각 괄호에 담긴 단어들은 키보드에서 그 키를 누르거나 마우스 1번 버튼을 누르라는 뜻이다. ·{your name here}처럼 구불구불한 괄호 안에 담긴 단어들은 사용자가 입력해야 할 “진짜” 데이터에 대응하는 데이터를 뜻한다. ·이탤릭체로(기울어진) 쓰여진 텍스트는 사용자 자신이 셸 프롬프트에 써넣어야 할 명령을 뜻한다.
필요한 것 들 ( Prerequisites) 당신의 시스템에 리눅스가 설치되었다면, 필요한 모든 것이 이미 갖추어져 있을 것이다.
백업 계획 (Backup Plan) 당신이 홈 네트워크에서 백업을 계획하고 있다면, 몇 가지 작업순서를 정할 필요가 있다. 하드디스크가 전혀 못쓰게 되더라도(crash), 백업의 진정한 가치는 실수로 지운 파일이나 변경된 파일 모두를 반드시 되살리는 것이다. 언제고 당신은 (아마 그리 오래지 않아) 어떤 중요한 파일들을 지우거나 변경할 것이다. 그리고 백업도 없이 부트마저 불가능하게 만들게 될 것이다. 사실 이런 것을 털어놓기는 부끄럽지만, 나는 실제로 /root 디렉터리를 한 방에 날려버렸었다.
Note▶ 당신의 시스템이 크랙된 적이 있다면 백업은 깊이 생각한 후에 결정해야 한다. 백업은 수행과정을 매우 단순하게 하거나 녀석들이 시스템을 망치지 못하도록 계획되어야 한다.(특히 홈 네트워크에서는)
얼마나 백업을 할 것인가 백업하는 공간은 바로 돈이므로 나는 모든 백업을 최소한으로 유지하려 애쓴다. 그래서 나는 단지 선택된 디렉터리만 백업할 뿐, 전체 파일 시스템은 백업하지 않는다. /usr와 /opt 등 디렉터리는 인스톨 시디롬에 그 대부분이 들어있으므로, 하드 드라이브가 손상되더라도 기본적인 것들은 그저 다시 설치하면 그만이다. 그러나, 시스템 환경이나 사용자 설정값이 들어있는 /etc나 /home 디렉터리는 어디에서도 복구할 수 없으므로 정말 중요하다.
어떻게 백업하는가 테이프 드라이버는 홈 네트워크 백업용으로 사용하기에는 대체로 너무 비싸고, 플로피 디스크는 실용성이 없다. (나는 백업 디스크 수가 132 장을 넘었을 때 플로피 디스크를 포기해버렸다) 우리는 여분의 하드 드라이브를 사용하는 방법이 가장 좋은 해결책이라고 생각한다. 단, 여기서 말하는 하드 드라이브가 파티션이 아니라는 것에 주의한다! 내 하드 드라이브에 문제가 생긴 모든 경우에 드라이브 전체가 죽거나 못쓰게 되었지, 피해가 하나의 파티션에 끝나지 않았다.
백업 프로그램들 모든 un*x 계열의 배포판에는 백업에 사용할 수 있는 세 개의 일반적인 프로그램이 포함되어 있다: tar, cpio, 그리고 dump가 그 것으로 각각의 유틸리티는 저마다 장점과 단점을 가지고 있다. TAR: CPIO:
DUMP:
우리의 백업 방법 우리는 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
스크립트를 어떻게 실행시킬까? 우리는 매일 새벽 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
다음 달에는 dhcp를 살펴보기로 한다. Copyright 1999, JC Pollman and Bill Mote
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] 만약 vi보다 더 좋아하는 에디터가 있다면, 당신이 좋아하는 것으로 바꾸길 바란다. 바뀐 변수가 시스템에 반영되려면 로그아웃한 다음 다시 로그인해야한다. 그 다음 아래처럼 쓴다: crontab /etc/crontab [Enter] 이 명령은 시스템의 crontab을 복사하여, 당신이 사용할 crontab 파일을 만든다. 이제, 아래 명령으로 당신의 crontab 파일을 편집한다: crontab -e [Enter] crontab은 실행되는 프로그램과 설정파일 모두에 사용되는 이름이라는 것을 기억한다 - passwd랑 비슷하다. 아마 아래와 비슷한 줄들이 보일 것이다(原註: 이 예문은 RedHat 배포판의 crontab이다): SHELL=/bin/bash # run-parts 우리가 실행하려는 명령들이 아니므로 HOME=/ 줄 아래 모든 것을 지우고, run-backup 스크립트가 저장되어 있는 디렉터리 이름을 PATH에 추가한다. crontab 안에서 각각의 줄은 프로그램 하나씩을 실행한다. crontab 파일은 특별한 형식을 가지는데: 프로그램이 실행되는 데 필요한 다섯 개의 필드로 구성된다. 주의: 시스템 crontab 안에는 프로그램을 실행하기 위해 cron 데몬에게 알려주어야 하는 특별한 사용자(예를 들어 root)가 설정되어 있지만, 사용자 crontab에는 이 필드가 필요 없다. 다섯 개의 필드는 다음과 같다: minutes hours day-of-month month day-of-week 맨 페이지에 따르면: 시간과 날짜 필드는:
어떤 필드에 애스터리스크(*, asterisk)가 있다면, “처음부터-끝까지” 항상 설정되어 있다는 의미이다. 숫자로 된 범위는 허용된다. 하이픈(-, hyphen)으로 두 숫자를 구분하여 범위를 설정하며 앞에 있는 숫자가 뒤보다 작아야한다. 특정 범위는 그 사이 숫자들을 포함한다. 예를 들어, 시간 필드에 사용된 8-11은 8, 9, 10 그리고 11시에 정해진 항목을 실행한다. 목록은 허용된다. 목록은 숫자들(또는 범위들)을 쉼표(,)로 구분하여 설정한다. 예를 들어: “1,2,5,9”, “0-4,8-13”. 간격 수치(step values)는 범위에 덧붙여 사용할 수 있다. 범위 뒤에 “month”와 “day of week” 필드에는 이름이 사용될 수도 있다. 특정한 요일이나 달을 구분할 수 있도록 앞에서 세 글자 정도를 사용한다(문제가 없는 경우). 범위나 목록에는 이름이 허용되지 않는다. 날짜와 요일이 함께 설정되어 있다면, 두 설정 모두 적용된다. 예를 들어 “30 4 1,15 * 5”라고 다섯 개의 필드가 설정되었다면 매달 1일과 15일, 4시 30분에 명령을 실행하고, 또 매주 금요일마다 같은 명령을 실행한다. 이제, 우리가 매일 새벽 한 시 5분이 되면 백업 스크립트를 실행하려 한다면, 우리 crontab 파일은 다음과 같을 것이다: SHELL=/bin/bash 5 1 * * * /usr/local/bin/run-backup 그리고 스크립트는 무슨 일이 있었는지 알리기 위해 작업이 끝난 후에는 root에게 email을 보낸다. run-backup 스크립트가 만족할만하게 작동해서 굳이 메일을 확인할 필요가 없다거나, crond로부터 자꾸 날아드는 email이 귀찮아졌다면 MAILTO 줄을 다음과 같이 고친다: MAILTO=”” 더 많은 정보를 원한다면, 맨 페이지를 살펴본다: man crontab
Part 3: run-backup 스크립트 #!/bin/sh # 아래 변수 다섯 개를 당신의 컴퓨터/백업에 알맞은 것으로 바꾼다. COMPUTER=myserver # 컴퓨터 이름 # 이 아래 줄은 모두 손대지 말고 그대로 둔다. PATH=/usr/local/bin:/usr/bin:/bin # 그 달의 첫 날에 영구적인 전체 백업을 만든다. # 그렇지 않다면 NEWER 날짜보다 새로운 파일들만 백업한다. if [ $DOM = “01” ]; then # 달마다 하는 전체 백업 if [ $DOW = “Sun” ]; then # 매주 일요일마다 전체 백업 else # 증분 백업 - 지난주의 백업을 덮어쓴다.
|
0