본문 바로가기
정보보안/이론

[KITRI] Day13. 시스템 백업 및 복구

by 민-Zero 2020. 5. 12.

시스템 백업 및 복구 수행하기

시스템이 손상될 경우를 대비하여 원본 데이터를 미리 복사하는 과정을 백업이라고 한다. 이때 백업에는 3가지 종류가 존재한다. 

완전백업(Full Backup) : 선택된 폴더의 모든 데이터를 저장하는 방식

증분백업(Incremental Backup) : 선택된 폴더가 완전백업이 수행된 이후 변경/수정이 있는 데이터만 저장하는 방식

차등백업(Differential Backup) : 선택된 폴더가 완전백업이 수행된 이후 변경/수정이 있는 데이터를 포함하여 모든 데이터를 저장하는 방식

 

리눅스에서 완전, 증분백업 수행하기

앞서 정리한 스크립트를 활용하여 백업을 수행하게 하고 crontab에 등록하여 주기적으로 백업을 수행할 수 있도록 해보자. 차등 백업의 경우 효율이 좋지않아 자주 안쓰이기 때문에 완전, 증분 백업을 수행하고 백업은 tar 옵션중 백업을 지원하는 옵션을 사용하면 된다.

 

/data 디렉토리에 백업을 수행해야 하는 원본이 담겨있는 곳이라고 가정하고, 백업된 파일은 /backup에 저장 하는기로 하자. 임의의 원본 데이터는 /etc/hosts /etc/services /etc/protocols 를 각 file1 2 3로 복사하여 사용하자.

 

tar 명령어를 이용한 완전 백업, 증분 백업

tar 명령어를 통해 백업에 필요한 파일을 한곳에 묶고 다른 디스크에 압축하여 저장하면 백업이 수행되는 것이다. 이때 사용하는 옵션은 -g(--listed-incremental) 옵션으로 증분 백업을 수행할때 사용하는 옵션이다.

tar cf Full-Backup.tar /data -g /backup/backuplist 명령어를 통해 완전백업을 수행한다.  -g(--listed-incremental)는 증분백업 옵션이지만 처음 수행시 완전백업을 수행하게 되어있다. 백업 수행시 어떤 파일을 백업해야 하는지 확인하는데 사용되는 dbbackuplist도 생성된다.

tar tf Full_Backup.tar 를 통해 어떤 파일이 백업 되었는지 확인하면 맨처음 백업을 수행하기 때문에 백업해야 하는 file 1 2 3이 모두 들어있는것을 확인할 수 있다.

 

date로 하루 뒤의 날짜로 변경뒤 /datacat 명령어를 사용해 file4를 생성한뒤 백업을 수행하면 똑같은 -g 옵션이지만 이번에는 Full Backup이 존재하므로 수정/추가된 파일인 file4만 백업되어있는 것을 통해 증분 백업이 수행되었음을 알 수 있다.

tar cf 0513-Backup.tar /data -g backuplist : 증분 백업 수행

 

date로 또 하루뒤의 날짜로 변경후 file1의 첫줄을 지우고 다시 증분백업을 수행하면 변경/수정 된 파일은 file1 뿐이므로 백업된 파일에 file1만 존재하는 것을 확인할 수 있다.

 

date로 또 하루뒤의 날짜로 변경후 file2를 지우고 file3의 첫줄을 지워 수정이 되도록 하면 백업된 파일에는 수정된 file3만 들어있는 것을 확인할 수 있다. 삭제된 file2의 경우 삭제 여부가 backuplist라는 db에 저장되어 있게 된다.

 

date로 하루뒤 변경, 이번에는 아무런 변화도 주지 않는다. 그럼 백업된 파일목록에 아무런 파일도 없는것을 확인할 수 있다.

 

복원

백업한 파일을 복원하는 방법은 압축을 수행했다면 우선 압축을 해제한뒤 tar로 묶은 원본파일을 풀면 된다.

 

tar xf Full-Backup.tar -g backuplist 를 수행하면 해당 디렉토리안에 data 디렉토리가 생성되는것을 확인할 수 있다.

생성된 data 디렉토리 안에는 맨처음 완전백업을 수행헀을때 저장된 file1 2 3가 존재하고 해당 디렉토리를 이용하여 파일이 손상되었을때 복원할 수 있게된다.

 

다음으로 tar xf 0513-Backup.tar -g backuplist를 수행하면 data안에 file4가 생성되었고 file1의 내용을 확인하면 지운 내용이 존재한다.

 

tar xf 0514-Backup.tar -g backuplist를 수행하면 file1modify날짜가 변경되어 있고 첫줄을 지운 내용으로 되어있는것을 확인할 수 있다.

 

tar xf 0515-Backup.tar -g backuplist를 수행하면 file2가 지워져 있고 file3를 수정했던 때로 복구 된것을 확인할 수 있다.

tar xf 0516-Backup.tar -g backuplist를 수행하면 아무런 변화도 주지않았던 상태로 복원된다.

 

스크립트 파일을 통한 정기적인 백업 수행

위의 내용을 스크립트파일을 통해 수행하도록 한뒤 crontab에 등록하게 되면 자동으로 완전백업과 증분백업을 수행하게 만들 수 있다.

백업 계획을

완전 증분 증분 증분 증분 증분 증분

의 계획으로 백업을 수행한다고 가정하자. 이때 다음주 일요일이 되면 이전의 파일은 삭제하고 다시 백업 파일들을 새롭게 생성하는 계획이다.

 

기본 준비는 tar를 통한 백업을 수행했을때와 똑같이 한뒤 시작하자.

/data 폴더를 백업할 것이며, 백업파일은 /backup에 저장한다. /etc/hosts /etc/services /etc/protocols 를 각 file1 2 3로 복사하는 동일한 과정을 수행한다.

/backup디렉 안에 백업을 정기적으로 자동화 시킬 스크립트파일 backup.sh를 생성하고 실행을 해야하므로 실행권한을 가질 수 있도록 퍼미션을 조절한다.

 

backup 스크립트 내용

전체적인 스크립트는 위와 같이 작성되었다. 스크립트에 대해 설명을 하면

 

자주 작성되는 경로를 일일이 작성하면 번거롭기 때문에 변수에 경로를 담아 사용하기 위해 변수에 경로를 할당하고 파일명으로 사용하기 위한 날짜값 또한 할당하였다. 또한 해당 요일이 무슨요일인지 판단하기 위해 WEEK라는 변수도 선언해 놓았다.

첫번째 조건문은 해당 스크립트를 사용하려고 할때 /backup 이라는 디렉토리가 없을경우 에러가 발생하여 백업이 수행되지 않기 때문에 해당 디렉토리가 없을 경우에 실행되도록 조건을 작성했다. 이때 rm 명령어는 만약 backup이라는 디렉토리가 아닌 동일한 이름으로 파일이 존재할 경우 이미 존재하는 파일 또는 디렉토리라는 에러로 backup디렉토리가 생성되지 않는 불상사를 방지하기 위해 작성한 것이다.

 

두번째 조건문은 완전 백업을 수행한 파일이 있는지 검사한뒤 없으면 완전백업을 수행하고 있으면 다시 조건문을 수행한다. 해당 조건문은 date +%w 의 결과가 담겨있는 변수 WEEK의 값이 0 즉, 일요일 이라면 backup 디렉토리 안의 모든 내용을 삭제한뒤 완전백업을 수행하고 일요일이 아니라면 백업을 수행하는 날짜를 붙인 백업 파일을 생성하는 코드이다.

 

작성을 완료했으면 backup스크립트 파일을 /bin으로 옮기면 PATH변수에 등록된 경로이기 때문에 따로 경로를 지정하지 않아도 수행할 수 있다. 수행결과 정상적으로 수행하는 것을 확인할 수 있었다.

 

동작을 확인했으면 cron에 등록하여 자동으로 백업을 수행하도록 하면 정기적으로 백업을 수행할 수 있게 된다.

매일 새벽 400분에 backup 스크립트 파일이 실행 되도록 설정하고 날짜를 변경하여 date명령어로 날짜를 변경하며 동작 여부를 확인하면 된다.

날짜가 변경되고 정상적으로 자동 백업이 수행되는 것을 확인할 수 있다.

 

만약 매번 backup된 파일들이 초기화 되는것이 아니라 년도별 주차별로 누적시키고 싶다면

이런식으로 작성하는 방법도 있을것이다.

 

댓글