리눅스/공통

GNU Tar를 이용한 차등 백업과 복원(증분 백업의 응용)

씨실과 날실 2020. 8. 30. 09:00

우리는 지난 시간을 통해 다양한 백업 전략, Tar를 이용한 리눅스 전체 시스템의 백업과 복원, 증분 백업에 대해 알아보았습니다. 이번에는 Tar를 이용한 증분 백업의 응용편인 Tar 차등 백업편입니다.

Tar를 이용한 차등 백업을 알기 위해서는 먼저 증분 백업에 대한 지식이 필요합니다. 증분 백업에 대한 기본적인 지식이 있다는 전제 하에 진행됩니다. 따라서 증분 백업, 차등 뱍업에 대한 이해가 부족하신 분들은 아래 링크를 먼저 방문해 숙독하시고 되돌아와 읽으시기를 권장합니다.


실습 환경 조성

실습할 디렉터리 생성

study@study-VirtualBox:~$ ls -F
공개/  다운로드/  문서/  바탕화면/  비디오/  사진/  음악/  템플릿/
study@study-VirtualBox:~$ mkdir backup
study@study-VirtualBox:~$ cd backup
study@study-VirtualBox:~/backup$ mkdir subdir1 subdir2 subdir3
study@study-VirtualBox:~/backup$ touch text1 text2 text3 subdir1/subdir1text subdir2/subdir2text subdir3/subdir3text
study@study-VirtualBox:~/backup$ 


위 글과 동일한 환경을 조성해주도록 하겠습니다.


생성 디렉터리 확인

study@study-VirtualBox:~/backup$ ls -FR
.:
subdir1/  subdir2/  subdir3/  text1  text2  text3

./subdir1:
subdir1text

./subdir2:
subdir2text

./subdir3:
subdir3text
study@study-VirtualBox:~/backup$ tree -F
.
├── subdir1/
│   └── subdir1text
├── subdir2/
│   └── subdir2text
├── subdir3/
│   └── subdir3text
├── text1
├── text2
└── text3

3 directories, 6 files
study@study-VirtualBox:~/backup$ 


참고

디렉터리 내의 하위 디렉터리와 파일들의 구조를 표시해주는 tree 명령어는 동명의 패키지가 있어야 하는데 해당 패키지는 리눅스 배포판에 기본적으로 포함되어 있지 않아 각 배포판의 주 저장소에서 설치해주어야 합니다.


차등 백업 실습

level 0 백업

study@study-VirtualBox:~$ tar -g list0 -cvzpf backup0.tar.gz backup
tar: backup: 새 디렉터리입니다
tar: backup/subdir1: 새 디렉터리입니다
tar: backup/subdir2: 새 디렉터리입니다
tar: backup/subdir3: 새 디렉터리입니다
backup/
backup/subdir1/
backup/subdir2/
backup/subdir3/
backup/text1
backup/text2
backup/text3
backup/subdir1/subdir1text
backup/subdir2/subdir2text
backup/subdir3/subdir3text
study@study-VirtualBox:~$ 

Tar를 이용한 차등 백업에서의 level 0 백업은 Tar를 이용한 증분 백업 방법과 동일합니다.

단 스냅샷 파일명은 지난 번 증분 백업에서 지정했던 list가 아니라 list0로 설정했습니다. 그 이유는 선형적 증분 백업에서는 스냅샷 파일이 1개만 있으면 되지만 차등 백업에서는 level0 백업 스냅샷과 level1 백업 스냅샷 이렇게 2개가 필요합니다. 따라서 두 스냅샷의 구별을 명확히 해주기 위해 level 숫자 0을 붙여 파일명을 바꿔 주었습니다.


study@study-VirtualBox:~$ ls -F
backup/         list0  다운로드/  바탕화면/  사진/  템플릿/
backup0.tar.gz  공개/  문서/      비디오/    음악/
study@study-VirtualBox:~$ 
첫 전체 백업 파일 backup0.tar.gz과 스냅샷 파일 list0이 생긴 것을 확인할 수 있습니다.


level 0 이후 내용 수정

study@study-VirtualBox:~$ cd backup
study@study-VirtualBox:~/backup$ rm -r text1 subdir1 && \
> mv subdir2 subdir2m && \
> mkdir subdir4 && \
> touch text4 subdir4/subdir4text
study@study-VirtualBox:~/backup$ cat >> text2
modified

study@study-VirtualBox:~/backup$ 

전체 백업(level0 백업) 이후 내용을 수정했습니다.

파일 text1, 하위 디렉터리 subdir1와 그 안의 파일 삭제

하위 디렉터리 subdir2의 이름을 subdir2m으로 수정

파일 text3, 하위 디렉터리 subdir3와 그 안의 파일은 그대로 유지

하위 디렉터리 subdir4와 그 안에 위치할 파일 subdir4text 생성

파일 text2의 내용 수정(빈 내용에 문자열 modified 추가)

수정 방식은 증분 백업에 대하여 설명할 때와 동일한 방법입니다. 이후의 수정도 이와 동일한 방법을 따랐습니다.


첫 번째 level 1 백업

study@study-VirtualBox:~/backup$ cd ..
study@study-VirtualBox:~$ cp list0 list1
study@study-VirtualBox:~$ tar -g list1 -cvzpf backup1.tar.gz backup
tar: backup/subdir2m: 디렉터리 이름이 이전 `backup/subdir2' 디렉터리 이름에서 바뀌었습니다
tar: backup/subdir4: 새 디렉터리입니다
backup/
backup/subdir2m/
backup/subdir3/
backup/subdir4/
backup/text2
backup/text4
backup/subdir4/subdir4text
study@study-VirtualBox:~$ 

여기서부터 증분 백업과 차등 백업의 차이가 생깁니다.

증분 백업(증분 백업의 응용인 차등 백업 포함)이 수행될 때마다 스냅샷 파일의 정보가 최신 정보로 업데이트됩니다.

선형적 증분 백업의 경우 스냅샷 파일에 저장된 바로 직전 백업 상태와 수정된 현재 상태만을 비교하고 달라진 내용만을 백업하고 새로 백업한 정보를 스냅샷 파일에 업데이트합니다. 따라서 선형적 증분 백업을 복원할 땐 level 0부터 level N까지의 모든 증분 백업본을 백업 순서대로 풀어 복원해주어야 온전히 복원할 수 있습니다.

그러나 차등 백업은 복원 시 level 0 백업과 level 1 백업 두 단계만 사용하도록 고안된 증분 백업의 특별한 방법입니다. 즉 차등 백업이 수차례 수행되어 여러 개의 백업본이 생기더라도 결국 필요한 것은 처음에 백업한 level 0 백업본과 마지막 차등 백업본뿐입니다.

이 차등 백업본을 만들기 위해서는 비교 대상을 직전 백업이 아니라 level 0의 원시 전체 백업본으로 늘 고정해주면 됩니다.

따라서 level 0 백업 정보가 담긴 list0 파일을 복사해 list1를 생성하고 생성한 list1 파일을 이번 증분 백업의 스냅샷 파일로 삼아 증분 백업해주면 됩니다.

따라서 cp list0 list1 명령을 사용해 새로운 그러나 담긴 정보는 level 0의 백업 정보인 스냅샷 파일을 생성하고 이렇게 생성한 list1 파일을 증분 백업의 스냅샷 파일로 설정하여(= -g list1) 증분 백업을 수행하면 됩니다.


tudy@study-VirtualBox:~$ ls -F
backup/         backup1.tar.gz  list1  다운로드/  바탕화면/  사진/  템플릿/
backup0.tar.gz  list0           공개/  문서/      비디오/    음악/
study@study-VirtualBox:~$ 

첫 번째 level 1 백업 파일인 backup1.tar.gz와 스냅샷 파일 list1이 추가로 생성된 것을 확인할 수 있습니다.

이때 level 1 백업 파일이 생성된 시점에서 list0를 복사한 list1은 level1 백업 정보로 업데이트되어 list0와 정보가 달라지게 됩니다.


첫 번째 level 1 백업 이후 내용 수정

study@study-VirtualBox:~$ cd backup
study@study-VirtualBox:~/backup$ rm -r text2 subdir2m && \
> mv subdir3 subdir3m && \
> mkdir subdir5 && \
> touch text5 subdir5/subdir5text
study@study-VirtualBox:~/backup$ cat >> text3
modified

study@study-VirtualBox:~/backup$ 


파일 text2, 하위 디렉터리 subdir2와 그 안의 파일 삭제

하위 디렉터리 subdir3의 이름을 subdir3m으로 수정

파일 text4, 하위 디렉터리 subdir4와 그 안의 파일은 그대로 유지

하위 디렉터리 subdir5와 그 안에 위치할 파일 subdir5text 생성

파일 text3의 내용 수정(빈 내용에 문자열 modified 추가)


두 번째 level 1 백업

study@study-VirtualBox:~$ cd backup
study@study-VirtualBox:~/backup$ rm -r text2 subdir2m && \
> mv subdir3 subdir3m && \
> mkdir subdir5 && \
> touch text5 subdir5/subdir5text
study@study-VirtualBox:~/backup$ cat > text3
modified

study@study-VirtualBox:~/backup$ cd ..
study@study-VirtualBox:~$ ls -F
backup/         backup1.tar.gz  list1  다운로드/  바탕화면/  사진/  템플릿/
backup0.tar.gz  list0           공개/  문서/      비디오/    음악/
study@study-VirtualBox:~$ cp -f list0 list1
study@study-VirtualBox:~$ diff list0 list1
study@study-VirtualBox:~$ tar -g list1 -cvzpf backup2.tar.gz backup
tar: backup/subdir3m: 디렉터리 이름이 이전 `backup/subdir3' 디렉터리 이름에서 바뀌었습니다
tar: backup/subdir4: 새 디렉터리입니다
tar: backup/subdir5: 새 디렉터리입니다
backup/
backup/subdir3m/
backup/subdir4/
backup/subdir5/
backup/text3
backup/text4
backup/text5
backup/subdir4/subdir4text
backup/subdir5/subdir5text
study@study-VirtualBox:~$ 

N회차 차등 백업도 증분 백업의 비교 대상은 level 0의 원시 전체 백업이어야 하므로 해당 정보가 담긴 list0 파일을 다시 한 번 복사해 스냅샷 파일을 만들어 줍니다. 그런데 이미 list1 파일이 존재하므로 list1을 list0으로 덮어쓰기해주시면 됩니다.

이때 cp 명령어로 list0를 이미 존재하는 파일인 list1로 덮어 쓰는 행위이므로 -f 옵션을 붙여 강제로 덮어쓰기 복사를 해주면 됩니다.

그 다음 단계는 이전 증분 백업과 마찬가지로 -g list1 옵션을 사용해 증분 백업해주시면 됩니다.


study@study-VirtualBox:~$ ls -F
backup/         backup1.tar.gz  list0  공개/      문서/      비디오/  음악/
backup0.tar.gz  backup2.tar.gz  list1  다운로드/  바탕화면/  사진/    템플릿/
study@study-VirtualBox:~$ 

백업 파일 backup2.tar.gz이 생긴 것을 확인할 수 있습니다. list1의 경우는 level 0 백업 정보에서 두 번째 level 1 백업 정보로 다시 한번 업데이트되었습니다.


두 번째 level 1 백업 이후 내용 수정

study@study-VirtualBox:~$ cd backup
study@study-VirtualBox:~/backup$ rm -r text3 subdir3m && \
> mv subdir4 subdir4m && \
> mkdir subdir6 && \
> touch text6 subdir6/subdir6text
study@study-VirtualBox:~/backup$ cat >> text4
modified

study@study-VirtualBox:~/backup$ 


파일 text3, 하위 디렉터리 subdir3와 그 안의 파일 삭제

하위 디렉터리 subdir4의 이름을 subdir4m으로 수정

파일 text5, 하위 디렉터리 subdir5와 그 안의 파일은 그대로 유지

하위 디렉터리 subdir6와 그 안에 위치할 파일 subdir6text 생성

파일 text4의 내용 수정(빈 내용에 문자열 modified 추가)


세 번째 level 1 백업

study@study-VirtualBox:~/backup$ cd ..
study@study-VirtualBox:~$ ls -F
backup/         backup1.tar.gz  list0  공개/      문서/      비디오/  음악/
backup0.tar.gz  backup2.tar.gz  list1  다운로드/  바탕화면/  사진/    템플릿/
study@study-VirtualBox:~$ diff list0 list1
Binary files list0 and list1 differ
study@study-VirtualBox:~$ cp -f list0 list1
study@study-VirtualBox:~$ diff list0 list1
study@study-VirtualBox:~$ tar -g list1 -cvzpf backup3.tar.gz backup
tar: backup/subdir4m: 새 디렉터리입니다
tar: backup/subdir5: 새 디렉터리입니다
tar: backup/subdir6: 새 디렉터리입니다
backup/
backup/subdir4m/
backup/subdir5/
backup/subdir6/
backup/text4
backup/text5
backup/text6
backup/subdir4m/subdir4text
backup/subdir5/subdir5text
backup/subdir6/subdir6text
study@study-VirtualBox:~$ 

두 번째 level 1 백업과 동일한 과정을 밟아줍니다. 단, 백업 파일의 이름은 다른 것으로 설정했습니다.


study@study-VirtualBox:~$ ls -F
backup/         backup2.tar.gz  list1      문서/      사진/
backup0.tar.gz  backup3.tar.gz  공개/      바탕화면/  음악/
backup1.tar.gz  list0           다운로드/  비디오/    템플릿/
study@study-VirtualBox:~$ 

백업 파일 backup3.tar.gz이 생긴 것을 확인할 수 있습니다. list1의 경우는 level 0 백업 정보에서 세 번째 level 1 백업 정보로 다시 한번 업데이트되었습니다.




차등 백업 복원

level 0 백업 복원

study@study-VirtualBox:~$ tar -xzvp -g /dev/null -f backup0.tar.gz
backup/
tar: `backup/text5' 삭제 중
tar: `backup/subdir4m' 삭제 중
tar: `backup/text6' 삭제 중
tar: `backup/subdir5' 삭제 중
tar: `backup/text4' 삭제 중
tar: `backup/subdir6' 삭제 중
backup/subdir1/
backup/subdir2/
backup/subdir3/
backup/text1
backup/text2
backup/text3
backup/subdir1/subdir1text
backup/subdir2/subdir2text
backup/subdir3/subdir3text
study@study-VirtualBox:~$ 

먼저 level 0의 전체 백업을 복원해줍니다.

이때 복원할 때도 증분 백업 옵션인 -g 옵션은 반드시 포함되어야 하나 복원할 땐 스냅샷 파일 지정은 필요 없으므로 -g 옵션의 인수에 스냅샷 파일 대신 출력 무시 기능을 담당하는 가상 장치 /dev/null을 지정해줍니다.

증분 백업 복원 명령을 수행하면 복원 대상이 되는 디렉터리의 내용물은 level 0의 전체 백업본으로 모두 교체됩니다. level 0의 전체 백업 당시에 없었던 디렉터리와 파일은 삭제되고 백업 내용물이 복원됩니다.


study@study-VirtualBox:~$ ls -F
backup/         backup2.tar.gz  list1      문서/      사진/
backup0.tar.gz  backup3.tar.gz  공개/      바탕화면/  음악/
backup1.tar.gz  list0           다운로드/  비디오/    템플릿/
study@study-VirtualBox:~$ ls -FR backup
backup:
subdir1/  subdir2/  subdir3/  text1  text2  text3

backup/subdir1:
subdir1text

backup/subdir2:
subdir2text

backup/subdir3:
subdir3text
study@study-VirtualBox:~$ tree -F backup
backup
├── subdir1/
│   └── subdir1text
├── subdir2/
│   └── subdir2text
├── subdir3/
│   └── subdir3text
├── text1
├── text2
└── text3

3 directories, 6 files
study@study-VirtualBox:~$ 

ls와 tree 명령어를 이용해 내용물을 확인할 수 있습니다.


마지막 level 1 백업 복원

study@study-VirtualBox:~$ tar -xzvp -g /dev/null -f backup3.tar.gz
backup/
tar: `backup/text2' 삭제 중
tar: `backup/text3' 삭제 중
tar: `backup/subdir3' 삭제 중
tar: `backup/subdir2' 삭제 중
tar: `backup/text1' 삭제 중
tar: `backup/subdir1' 삭제 중
backup/subdir4m/
backup/subdir5/
backup/subdir6/
backup/text4
backup/text5
backup/text6
backup/subdir4m/subdir4text
backup/subdir5/subdir5text
backup/subdir6/subdir6text
study@study-VirtualBox:~$ 

마지막 차등 백업 파일을 동일한 방식으로 복원해줍니다.


study@study-VirtualBox:~$ ls -F
backup/         backup2.tar.gz  list1      문서/      사진/
backup0.tar.gz  backup3.tar.gz  공개/      바탕화면/  음악/
backup1.tar.gz  list0           다운로드/  비디오/    템플릿/
study@study-VirtualBox:~$ ls -FR backup
backup:
subdir4m/  subdir5/  subdir6/  text4  text5  text6

backup/subdir4m:
subdir4text

backup/subdir5:
subdir5text

backup/subdir6:
subdir6text
study@study-VirtualBox:~$ tree -F backup
backup
├── subdir4m/
│   └── subdir4text
├── subdir5/
│   └── subdir5text
├── subdir6/
│   └── subdir6text
├── text4
├── text5
└── text6

3 directories, 6 files
study@study-VirtualBox:~$ 

역시 ls와 tree 명령어를 이용해 내용물을 확인할 수 있습니다.

마지막 백업 당시 상태로 무사히 복원된 것을 확인할 수 있습니다.


study@study-VirtualBox:~$ tar -xzvp -g /dev/null -f backup0.tar.gz && \
> tar -xzvp -g /dev/null -f backup3.tar.gz
backup/
tar: `backup/text5' 삭제 중
tar: `backup/subdir4m' 삭제 중
tar: `backup/text6' 삭제 중
tar: `backup/subdir5' 삭제 중
tar: `backup/text4' 삭제 중
tar: `backup/subdir6' 삭제 중
backup/subdir1/
backup/subdir2/
backup/subdir3/
backup/text1
backup/text2
backup/text3
backup/subdir1/subdir1text
backup/subdir2/subdir2text
backup/subdir3/subdir3text
backup/
tar: `backup/text2' 삭제 중
tar: `backup/text3' 삭제 중
tar: `backup/subdir3' 삭제 중
tar: `backup/subdir2' 삭제 중
tar: `backup/text1' 삭제 중
tar: `backup/subdir1' 삭제 중
backup/subdir4m/
backup/subdir5/
backup/subdir6/
backup/text4
backup/text5
backup/text6
backup/subdir4m/subdir4text
backup/subdir5/subdir5text
backup/subdir6/subdir6text
study@study-VirtualBox:~$ 

위 예시는 level 0 백업과, 가장 마지막 level 1 백업을 한번에 복원한 경우의 터미널 모습입니다.

참고

리눅스 다중 명령어

리눅스는 보통 터미널을 통해 명령을 실행합니다. 그런데 사용하다보면 여러 명령어를 순서대로 실행해야할 필요가 있습니다. 이때 사용하는 기호가 바로 ;, &&, |, ||입니다.

각 기호마다 다음과 같은 기능을 가집니다.

;(세미콜론)

각 명령을 순서대로 실행하되 이전 명령이 실패하더라도 후행 명령을 실행합니다.

&&(더블 엠퍼센드)

각 명령을 순서대로 실행하되 이전 명령이 실패하면 후행 명령을 실행하지 않고 중단합니다.

|(파이프)

이전 명령 결과를 후행 명령에 사용합니다.

||(더블 버티칼 바)

각 명령을 순서대로 실행하되 이전 명령을 성공적으로 후행 명령은 수행하지 않습니다.




증분 아카이브 내용 확인

$ tar --list --incremental --verbose --verbose --file [파일명]


해당 정보에 대한 자세한 설명은 아래 링크 글의 하단부 설명을 참고하시기 바랍니다.



study@study-VirtualBox:~$ tar --list --incremental --verbose --verbose --file backup0.tar.gz
drwxrwxr-x study/study      49 2020-08-16 16:57 backup/
D subdir1
D subdir2
D subdir3
Y text1
Y text2
Y text3

drwxrwxr-x study/study      14 2020-08-16 16:57 backup/subdir1/
Y subdir1text

drwxrwxr-x study/study      14 2020-08-16 16:57 backup/subdir2/
Y subdir2text

drwxrwxr-x study/study      14 2020-08-16 16:57 backup/subdir3/
Y subdir3text

-rw-rw-r-- study/study       0 2020-08-16 16:56 backup/text1
-rw-rw-r-- study/study       0 2020-08-16 16:56 backup/text2
-rw-rw-r-- study/study       0 2020-08-16 16:56 backup/text3
-rw-rw-r-- study/study       0 2020-08-16 16:57 backup/subdir1/subdir1text
-rw-rw-r-- study/study       0 2020-08-16 16:57 backup/subdir2/subdir2text
-rw-rw-r-- study/study       0 2020-08-16 16:57 backup/subdir3/subdir3text
study@study-VirtualBox:~$ 


study@study-VirtualBox:~$ tar --list --incremental --verbose --verbose --file backup1.tar.gz
drwxrwxr-x study/study      83 2020-08-18 18:48 backup/
D subdir2m
D subdir3
D subdir4
Y text2
N text3
Y text4
R backup/subdir2
T backup/subdir2m

drwxrwxr-x study/study      14 2020-08-16 16:57 backup/subdir2m/
N subdir2text

drwxrwxr-x study/study      14 2020-08-16 16:57 backup/subdir3/
N subdir3text

drwxrwxr-x study/study      14 2020-08-18 18:48 backup/subdir4/
Y subdir4text

-rw-rw-r-- study/study      10 2020-08-18 18:49 backup/text2
-rw-rw-r-- study/study       0 2020-08-18 18:48 backup/text4
-rw-rw-r-- study/study       0 2020-08-18 18:48 backup/subdir4/subdir4text
study@study-VirtualBox:~$ 

study@study-VirtualBox:~$ tar --list --incremental --verbose --verbose --file backup2.tar.gz
drwxrwxr-x study/study      83 2020-08-18 19:06 backup/
D subdir3m
D subdir4
D subdir5
Y text3
Y text4
Y text5
R backup/subdir3
T backup/subdir3m

drwxrwxr-x study/study      14 2020-08-16 16:57 backup/subdir3m/
N subdir3text

drwxrwxr-x study/study      14 2020-08-18 18:48 backup/subdir4/
Y subdir4text

drwxrwxr-x study/study      14 2020-08-18 19:06 backup/subdir5/
Y subdir5text

-rw-rw-r-- study/study      10 2020-08-18 19:07 backup/text3
-rw-rw-r-- study/study       0 2020-08-18 18:48 backup/text4
-rw-rw-r-- study/study       0 2020-08-18 19:06 backup/text5
-rw-rw-r-- study/study       0 2020-08-18 18:48 backup/subdir4/subdir4text
-rw-rw-r-- study/study       0 2020-08-18 19:06 backup/subdir5/subdir5text
study@study-VirtualBox:~$ 


study@study-VirtualBox:~$ tar --list --incremental --verbose --verbose --file backup3.tar.gz
drwxrwxr-x study/study      50 2020-08-18 19:18 backup/
D subdir4m
D subdir5
D subdir6
Y text4
Y text5
Y text6

drwxrwxr-x study/study      14 2020-08-18 18:48 backup/subdir4m/
Y subdir4text

drwxrwxr-x study/study      14 2020-08-18 19:06 backup/subdir5/
Y subdir5text

drwxrwxr-x study/study      14 2020-08-18 19:18 backup/subdir6/
Y subdir6text

-rw-rw-r-- study/study      10 2020-08-18 19:21 backup/text4
-rw-rw-r-- study/study       0 2020-08-18 19:06 backup/text5
-rw-rw-r-- study/study       0 2020-08-18 19:18 backup/text6
-rw-rw-r-- study/study       0 2020-08-18 18:48 backup/subdir4m/subdir4text
-rw-rw-r-- study/study       0 2020-08-18 19:06 backup/subdir5/subdir5text
-rw-rw-r-- study/study       0 2020-08-18 19:18 backup/subdir6/subdir6text
study@study-VirtualBox:~$