리눅스/공통

GNU Tar를 이용한 증분 백업과 복원의 개념 이해

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


1. 다양한 압축 프로그램간의 비교

우리는 컴퓨터를 사용하다보면 다양한 형식의 압축 파일들을 접하게 됩니다. 그리고 그 파일들을 생성, 관리하기 위해 역시 다양한 프로그램을 사용하게 됩니다.

그것들을 모두 알아볼 수는 없고 아래의 링크에서 압축 프로그램들 간의 특징들을 일목요연하게 비교해볼 수 있으니 참고하시기 바랍니다.


2. 백업 도구로서의 Tar

Unix 시절 1979년부터 개발되기 시작하여 꾸준히 유지 보수되어 와 이제 많은 리눅스 시스템 관리자들이 사용하는 리눅스 시스템의 표준 아카이브 생성 도구입니다.

Tar는 정확히는 디렉토리의 구조와 파일의 속성 등을 그대로 보존한 채 다수의 파일들을 하나의 큰 파일로 '묶는' 아카이브 생성 도구이지, 압축 프로그램은 아닙니다. 단지, gzip 등 다른 압축 프로그램을 매개로 압축해 아카이브를 생성할 수 있는 것이지요.

리눅스의 파일 관리 부분을 처음 공부하게 되면 cp, mv, rm 등과 같은 기초 명령과 함께  tar 사용법을 필수라고도 할 정도로 익히게 됩니다.

$ tar -cf [아카이브 파일명.tar] [아카이브 대상]

$ tar -xf [아카이브 파일명.tar]

위 명령은 Tar로 아카이브 파일을 생성하거나 풀 때 사용하는 가장 기초적인 명령어로, 작업 환경과 목표에 따라 다양한 옵션을 붙여 작업하게 됩니다.

Tar는 일반적인 아카이브 생성 뿐만 아니라 이른바 증분 백업 아카이브 생성도 지원해줍니다.


3. 증분 백업의 개념

증분 백업이란 이전 백업 이후 변경 및 추가되는 내용만을 백업하는 방식을 말합니다. 증분 백업을 포함하여 다양한 백업 전략에 대한 보다 자세한 설명은 아래 링크를 참고하시기 바랍니다.


4. Tar가 지원하는 증분 백업 옵션

Tar는 증분 백업과 관련하여 두 가지 옵션을 제공하고 있는데 -G 옵션(--incremental)과 -g 옵션(--listed-incremental=FILE)입니다.


-G 옵션은 Tar의 manpage에서 아래와 같이 아주 간단하게만 설명하고 있습니다.

Handle old GNU-format incremental backups.

이 -G 옵션은 이전 형식의 증분 백업을 지원합니다. 이 형식은 과거와의 호환을 위해 남겨놓았을 뿐 현재 비표준 아카이브 방식으로 여러 분기의 Level N 증분 백업을 지원하지 않습니다. 따라서 이 옵션을 사용하는 것은 권장하지 않습니다.


이제는 -g 옵션을 권장하고 있으며 현재는 Tar를 이용한 증분 백업을 설명한 대부분의 웹문서들도 이 옵션을 사용해 설명하고 있습니다.

Tar의 manpage에 -g옵션에 대하여 아래와 같이 설명하고 있습니다.

-g, --listed-incremental=FILE

새로운 GNU 형식의 증분 백업을 다룹니다.

FILE은 스냅샷 파일의 이름입니다. tar는 이전 증분 덤프 이후에 변경된 파일을 결정하는 데 사용되는 추가 정보를 파일로 저장합니다. 따라서 재덤프되어야 합니다..

아카이브를 생성할 때 FILE이 없으면 파일이 생성되고 모든 파일이 결과 아카이브(레벨 0 덤프)에 추가됩니다. 0이 아닌 레벨 N의 증분 아카이브를 생성하려면 레벨 N-1에서 생성된 스냅샷 파일의 사본을 생성하고 이를 FILE로 사용합니다.

목록을 나열하거나 내용물을 추출할 때 FILE의 실제 내용은 검사하지 않고 구문상의 요구 사항으로만 필요합니다. 따라서 /dev/null을 대신 사용하는 것이 일반적입니다.

manpage의 해당 내용은 아래 글에서 보다 자세히 알아보독록 하겠습니다.


5. Tar를 이용한 증분 백업의 이해

이하의 증분 백업 내용은 분기가 없는 선형적 증분 백업에 대한 설명입니다.

Tar를 이용한 차등백업은 이 증분 백업을 응용해 수행할 수 있습니다. 해당 방법은 아래 링크를 참고하시기 바랍니다.

차등 백업을 하기 전에 본 글을 먼저 읽고 숙지하시는 것을 권장합니다.


주요 개념

백업 레벨

증분 백업에는 백업 레벨(Backup Level)이라는 개념이 존재합니다. 증분 백업은 이전 증분 백업본을 기반으로, 백업 이후 변경, 추가된 내용만을 백업하는 방식이므로 각 증분 백업본은 연쇄적인 의존성을 띄게 됩니다. ㅍ이러한 특징을 이른바 백업 레벨이라는 개념으로 표현하게 됩니다.

증분 백업 시 이후 증분 백업본의 원시적인 자료가 되는 첫 백업은 이전 증분 백업본이 없으므로 전체 백업(Full backup)이 이루어집니다. 이것을 Level 0 백업이라 일 컫습니다.

Level 0 백업 다음에 이루어 지는 증분 백업은 Level 1 백업이라 칭하며 Level 0 백업 이후 발생한 변경 및 추가 내용만을 담아 백업합니다. 마찬가지로 Level 2는 Level 1 백업 이후 바뀌거가 추가된 내용만을 담아 백업합니다.

즉, Level N은 Level N-1 백업이후 발생한 변경 사항만을 백업에 적용한 것입니다. 바뀐 내용이 없다면 백업에 담지 않습니다.

이러한 증분 백업 시 필요한 파일이 바로 증분 백업 시 생성되거나 업데이트 되는 스냅샷 파일입니다.

스냅샷 파일

Tar에서 스냅샷 파일은 가장 최근 증분 백업(Level N)된 아카이브 내용의 메타 정보를 기록한 것입니다. Tar는 이 파일을 바탕으로 직전 증분 백업 이후 변경, 추가 또는 삭제된 파일을 확인하여 다음 증분 백업에 수정된 파일만 포함되도록 백업을 수행합니다.

Tar의 manpage를 확인하면 증분 백업 옵션과 관련하여 아래와 같은 내용이 설명되어 있습니다.


목록을 나열하거나 내용물을 추출할 때 FILE의 실제 내용은 검사하지 않고 구문상의 요구 사항으로만 필요합니다. 따라서 /dev/null을 대신 사용하는 것이 일반적입니다.


이 내용을 좀 더 풀어서 셜명하면 다음과 같습니다.

스냅샷 파일은 증분 백업 파일을 생성할 때만 요구되며, 그외 증분 백업된 아카이브의 내용을 확인하거나 증분 백업 아카이브 파일을 풀 때는 이 스냅샷 파일이 필요하지 않습니다. 실제로 해당 파일이 존재하지 않더라도 증분 백업 파일을 풀거나 해당 내용을 보는데는 아무 지장이 없습니다.

그러나 증분 백업 관련 작업을 수행할 때 구문상의 요구로 증분 백업 옵션(-g, --listed-incremental=FILE)은 반드시 필요합니다. 그러나 증분 백업 파일을 풀거나 해당 내용을 볼 떄 실제로 해당 스냅샷 파일은 필요하지 않으므로 해당 옵션의 인수로 리눅스의 가상 장치인 /dev/null를 지정하는는 것이 일반적입니다.


증분 백업과 복원 시나리오

백업할 디렉터리 생성
문서 1 생성,     문서 2 생성,     문서 3 생성
서브디렉터리 1 생성 및 그 안에 파일 생성
서브디렉터리 2 생성 및 그 안에 파일 생성
서브디렉터리 3 생성 및 그 안에 파일 생성

증분 백업을 위한 첫 전체 백업 : Level 0 Backup


문서 1 삭제,     문서 2 수정,     문서 3 유지,     문서 4 생성
서브디렉터리 1 및 그 안에 있는 파일 삭제
서브디렉터리 2의 이름 변경
서브디렉터리 3 및 그 안에 있는 파일은 그대로 유지
서브디렉터리 4 및 그 안에 있는 파일 생성

첫 번째 증분 백업 : Level 1 Backup


문서 2 삭제,     문서 3 수정,     문사 4 유지,     문서 5 생성
서브디렉터리 2 및 그 안에 있는 파일 삭제
서브디렉터리 3의 이름 변경
서브디렉터리 4 및 그 안에 있는 파일은 그대로 유지
서브디렉터리 5 및 그 안에 있는 파일 생성

두 번째 증분 백업 :


문서 3 삭제,     문서 4 수정,     문서 5 유지,     문서 6 생성
서브디렉터리 3 및 그 안에 있는 파일 삭제
서브디렉터리 4의 이름 변경
서브디렉터리 5 및 그 안에 있는 파일은 그대로 유지
서브디렉터리 6 및 그 안에 있는 파일 생성

세 번째 증분 백업 :


증분 백업된 백업본 전체 복원

위 표처럼 전체 백업된 백업 대상 디렉터리 안에 있는 내용물이 모두 새로운 것으로 교체되기까지의 과정을 실습으로 알아보도록 하겠습니다.


증분 백업 진행 과정

로그인한 계정의 홈 디렉터리에 백업 디렉터리 생성

study@study-VirtualBox:~$ mkdir backup
study@study-VirtualBox:~$ ls -F
backup/  공개/  다운로드/  문서/  바탕화면/  비디오/  사진/  음악/  템플릿/
study@study-VirtualBox:~$ 

로그인한 계정의 홈 디렉터리(~/)에 mkdir 명령어로 실습할 backup 디렉터리를 만들어 줍니다.

그 다음 ls 명령어를 이용해 디렉터리가 잘 만들어 졌는지 확인합니다.

☞ 참고

위 예시에 사용된 ls 명령의 -F 옵션은 각 항목 오른쪽에 *, /, =, >, @, | 등 일부 특수 기호를 표시해 해당 항목의 성격을 알려줍니다. 예시에 표시된 / 기호는 해당 항목이 파일이 아닌 디렉터리임을 알려주는 것입니다.


백업 디렉터리 하위에 원본 디렉터리와 문서 생성

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

cd 명령어로 backup 디렉터리로 들어간 다음 하위 디렉터리들과 파일들을 생성해줍니다.

☞ 참고

touch 명령어의 본래 기능은 기존 파일의 타임 스탬프를 변경하는 것입니다.

그러나 지정 파일이 존재하지 않는 경우 해당 이름으로 된 내용이 빈 파일을 생성하기도 합니다.


study@study-VirtualBox:~/backup$ ls -F
subdir1/  subdir2/  subdir3/  text1  text2  text3
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$ 

이제 원하는 대로 디렉터리와 파일들이 생성되었는지 확인해봅시다. 보통 리눅스 배포판에 기본적으로 깔려 있는 ls 명령어를 사용하게 될 것입니다.

☞ 참고

ls -R

ls 명령어는 기본적으로 현재 위치 또는 지정 디렉터리의 1단계 항목만 보여줍니다. 하위 디렉터리가 존재하고 그 안에 또 다른 디렉터리와 파일이 존재하더라도 그것들을 모두 보여주지는 않습니다.

하위 디렉터리와 그 안의 내용을 모두 확인하려면 ls 명령에 -R 옵션을 추가하여야 합니다. -R은 --recursive를 대체할 수 있는 짧은 옵션으로 하위 디렉터리를 재귀적으로 나열하거나 적용합니다.


tree

tree는 해당 디렉터리 안의 모든 내용을 트리구조로 일목요연하게 확인할 수 있도록 도와주는 명령어로 각 리눅스 배포판에 기본적으로 설치되어 있지 않아 해당 기능을 사용하려면 사용자가 따로 설치해주어야 합니다.

tree 패키지 설치와 사용법은 위 링크를 참고하시기 바랍니다.


증분 백업을 위한 전체 백업 실행

증분 백업 기본 명령은 아래와 같습니다.

tar --create \
--file=증분백업파일명.tar \
--listed-incremental=증분백업스냅샷파일명.snar \
/백업대상경로


위 링크의 Tar의 증분 백업 공식 설명 문서에 따르면 스냅샷 파일의 확장자를 .snar로 지정하고 있습니다만 확장자에는 신경쓰지 않으셔도 됩니다. 다른 확장자로 지정하셔도 되고 심지어는 확장자를 지정하지 않아도 됩니다. 저는 설명의 편의를 위해 확장자 없는 list 파일로 지정하였습니다.

확장자의 유무는 상관없지만 스냅샷 파일 자체는 지정해주어야 합니다. 만약 지정 파일이 존재하지 않는다면 스스로 지정한 이름으로 스냅샷 파일을 만들고 전체 백업을 실행합니다. 이렇게 실행된 전체 백업을 Level 0 백업이라 칭합니다.

참고로 증분 백업을 위한 전체 백업(Level 0) 백업을 하는 두 가지 방법은 글 하단 내용을 참고하시기 바랍니다.


그런데 위 예시는 사용자에게 유용한 몇 가지 옵션이 빠져 있는데다가 옵션 자체도 입력하기가 번잡합니다. 이것을 유용한 방식으로 바꾸면 아래와 같이 됩니다.

tar -g [스냅샷 파일] -cvzpf [생성할 아카이브 파일] [백업 대상]

굉장히 간소해졌습니다.

각 옵션은 다음과 같은 의미를 지닙니다.

-g(--listed-incremental)

증분 백업 시 사용할 스냅샷 파일을 지정합니다.

-c(--create)

아카이브 파일을 생성합니다.

-v(--verbose)

작업 내용을 자세히 출력합니다.

-z(--gzip, --gunzip, --ungzip)

.gz 아카이브를 .gz 형식으로 압축하거나 압축된 아카이브를 풉니다.

-p(--preserve-permissions, --same-permissions)

퍼미션(권한 설정) 정보를 보존합니다.

-f(--file)

아카이브 파일을 지정합니다.


위 내용을 바탕으로 Level 0 전체 증분 백업을 해봅시다.

study@study-VirtualBox:~/backup$ cd ..
study@study-VirtualBox:~$ tar -g list -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:~$ 

cd .. 명령을 이용해 파일과 디렉터리를 생성한 백업 디렉터리의 상위 디렉터리로 이동해줍니다.

그 다음 증분 백업 명령을 실행해줍니다. Level 0의 증분 백업이므로 모든 파일과 디렉터리가 새로 아카이브에 포함됩니다.

☞ 참고

-v 옵션

참고로 위 예시는 -v 옵션을 추가했기 때문에 작업 내역이 출력된 것입니다. 이 작업 뿐만 아니라 대부분의 명령에는 자세한 작업 내용을 표시해주는 -v 옵션을 지원합니다. 혹시 있을 지도 모를 작업 실수를 빠르게 확인하기 위해서는 -v 옵션을 활용하는 것이 좋습니다.


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

ls  명령어를 이용해 디렉터리 안의 내용을 확인해 봅시다. 전에는 없던 backup0.tar.gz 파일과 list 파일이 생긴 것을 확인할 수 있습니다.

☞ 참고

-g와 -f 옵션의 인수로 파일을  지정할 때 경로를 붙여주지 않았으므로 현재 작업 위치에 파일이 생성된 것입니다.


 study@study-VirtualBox:~$ cat list
GNU tar-1.30-2
159756536876257155201597564651621017092205054788575backup/subdir1Ysubdir1text01597564651621017092205054788576backup/subdir2Ysubdir2text01597564651621017092205054788577backup/subdir3Ysubdir3text01597564629875826814205054788226backupDsubdir1Dsubdir2Dsubdir3Ytext1Ytext2Ytext3study@study-VirtualBox:~$ 

cat 명령어로 스냅샷 파일인 list 파일의 내용을 확인하니 위와 같이 출력됩니다. 숫자와 영어 그리고 파일 또는 디렉터리의 경로가 반복해서 나오는 것 같습니다. 


GNU tar-1.30-2
1597565368#762571552#0#1597564651#621017092#2050#54788575#backup/subdir1#Ysubdir1text###0#1597564651#621017092#2050#54788576#backup/subdir2#Ysubdir2text###0#1597564651#621017092#2050#54788577#backup/subdir3#Ysubdir3text###0#1597564629#875826814#2050#54788226#backup#Dsubdir1#Dsubdir2#Dsubdir3#Ytext1#Ytext2#Ytext3###

해당 파일을 LibreOffice의 Writer로 열어보면 어떠한 규칙으로 # 기호가 붙어 항목을 나누고 있는 것 같습니다. 이것들을 보기 편하게 편집해보도록 합시다.


GNU tar-1.30-2

1597565368#762571552

#0#1597564651#621017092#2050#54788575
#backup/subdir1
#Ysubdir1text##

#0#1597564651#621017092#2050#54788576
#backup/subdir2
#Ysubdir2text##

#0#1597564651#621017092#2050#54788577
#backup/subdir3
#Ysubdir3text##

#0#1597564629#875826814#2050#54788226
#backup
#Dsubdir1
#Dsubdir2
#Dsubdir3
#Ytext1
#Ytext2
#Ytext3###

맨 첫 줄은 사용된 Tar의 정확한 버전이 나옵니다. 여기서는 1.30.2가 쓰였음을 알 수 있습니다.


두번 째 줄의 두 레코드는 마지막(가장 최근) 증분 백업 시간을 표시하는 10자리 정수입니다. 이 숫자는 유닉스 타임스탬프로 시각을 표시한 것으로 첫 레코드는 초수이고 두 번째 레코드는 나노초수입니다.

이것을 우리가 알기 쉽게 변환하면 다음과 같습니다.(나노초수는 설명에서 제외하였습니다.)

1597565368

2020년 8월 16일 일요일, 17시 09분 28초, UTC+0900 (대한민국 표준시)

타임스탬프에 대해 궁금하신 분들은 아래 링크를 참고하시기 바랍니다.



다음부터가 각 백업 디렉터리별 메타 정보입니다.

메타 정보들 중 숫자로 이루어진 레코드들은 아래와 같은 의미를 가집니다.

#NFS 여부#수정 시각 타임스탬프 초수#수정 시각 타임스탬프 나노초수#장치 번호#I-node번호

숫자 레코드 다음에는 백업 대상이 된 디렉터리입니다.

디렉터리 아래에는 해당 디렉터리에 포함된 하위 디렉터리와 파일 정보를 담고 있습니다. 해당 디렉터리와 파일 앞에는 영어 대문자 하나가 부가되어 있는데 해당 항목의 성격을 문자로 표시한 것입니다.

이에 대한 자세한 정보는 하단부에 상술하도록 하겠습니다.


위의 스냅샷 정보(백업 대상에 대한 메타 정보)는 증분 백업이 이루어질 때마다 최신 정보로 업데이트됩니다.


스냅샷 파일에 대한 보다 자세한 정보는 아래 링크를 참고하시기 바랍니다.


이제부터는 데이터의 수정과 증분 백업 과정의 반복입니다.


Level 0 백업 이후 문서 파일 삭제, 수정, 생성 작업

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

./subdir1:
subdir1text

./subdir2:
subdir2text

./subdir3:
subdir3text
study@study-VirtualBox:~/backup$ rm text1
study@study-VirtualBox:~/backup$ cat >> text2
modified

study@study-VirtualBox:~/backup$ touch text4
study@study-VirtualBox:~/backup$ rm -r subdir1
study@study-VirtualBox:~/backup$ mv subdir2 subdir2m
study@study-VirtualBox:~/backup$ mkdir subdir4
study@study-VirtualBox:~/backup$ touch subdir4/subdir4text


수정 내역은 아래와 같습니다.

text1 파일 삭제

text2 파일 내용 수정 <- 내용 추가

text3 파일은 수정 없이 유지

text4 파일 새로 생성

하위 디렉터리인 subdir1과 그 안의 내용 모두 삭제

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

하위 디렉터리인 subdir3과 그 안의 파일은 수정 없이 유지

새로운 하위 디렉터리인 subdir4 생성

새로 생성한 디렉터리 subdir4 안에 subdir4text 파일 새로 생성


☞ 사용된 명령

rm

파일이나 디렉터리를 삭제할 때 사용합니다. 단 디렉터리를 삭제할 땐 재귀 옵션인 -r을 사용해야 하며, 권한 문제로 삭제되지 않는 경우가 있는데 그때는 강제 수행 옵션인 -f를 붙여 실행합니다.

따라서 rm -rf를 하나의 세트로 실행하는 경우가 많으며 이때 rm -rf /를 실행하지 않도록 조심합니다.

cat

해당 파일의 내용을 터미널에서 확인할 때 사용합니다.

'cat > 파일명'을 사용하면 파일을 생성해  터미널에서내용을 입력하고 저장할 수 있습니다. 저장하고 끝낼 땐 Ctrl+d를 누르면 됩니다.

touch

지정 파일의 타임스탬프를 찍는 데 사용합니다. 만약 지정 파일이 지정 경로에 없다면 동명의 빈 파일을 생성합니다.

mkdir

디렉터리를 생성할 때 사용합니다. 이때 주의할 것은 생성하고자하는 위치에 같은 이름의 디렉터리나 파일이 존재해서는 안됩니다.


study@study-VirtualBox:~/backup$ ls -FR
.:
subdir2m/  subdir3/  subdir4/  text2  text3  text4

./subdir2m:
subdir2text

./subdir3:
subdir3text

./subdir4:
subdir4text
study@study-VirtualBox:~/backup$ tree -F
.
├── subdir2m/
│   └── subdir2text
├── subdir3/
│   └── subdir3text
├── subdir4/
│   └── subdir4text
├── text2
├── text3
└── text4

3 directories, 6 files
study@study-VirtualBox:~/backup$ 
이제 ls 명령어, tree 패키지가 설치되어 있다면 tree 명령어로 제대로 수정되었는지 확인해봅니다.

보다 자세한 내용은 ls -l 명령으로 확인할 수 있습니다.


Level 0 백업 이후의 첫 번째 증분 백업(Level 1 증분 백업)

study@study-VirtualBox:~/backup$ cd ..
study@study-VirtualBox:~$ tar -g list -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:~$ 

백업 디렉터리에서 내용을 수정하고 상위 디렉터리로 이동한 다음 스냅샷 파일은 기존과 동일하게 list로 지정하고 새로운 증분 백업 파일명을 지정하여 백업 명령을 실행해줍니다. 이때 백업 대상도 동일해야 합니다.

-v 옵션을 사용하여 실행하면 위처럼 작업 과정이 출력됩니다.

subdir2 디렉터리 이름이 subdir2m으로 바뀌고  새로운 디렉터리 subdir4와 역시 새로운 파일 text4와 subdir4text가 생긴 것을 알 수 있으며 수정된 파일 text2도 작업 내역에 출력된 것을 확인할 수 있습니다.

 subdir3 디렉터리와, text3, subdir3text 두 파일은 변화가 없었으니 증분 백업 작업 내역에서 빠지는 것은 이해할 수 있는데 삭제한 subdir1 디렉터리와, text1, subdir1text 두 파일에 대한 정보는 출력되지 않았습니다. 왜 그럴까요?

증분 백업이 다시 한번 이루어지면셔 내용이 업데이트되었을 list 파일을 확인해봅시다.

GNU tar-1.30-2
1597567656#210035562

#0#1597564651#621017092#2050#54788577
#backup/subdir3
#Nsubdir3text##

#0#1597566452#672604920#2050#54788572
#backup/subdir4
#Ysubdir4text##

#0#1597564651#621017092#2050#54788576
#backup/subdir2m
#Nsubdir2text##

#0#1597566417#987670929#2050#54788226
#backup
#Dsubdir2m#Dsubdir3#Dsubdir4
#Ytext2#Ntext3#Ytext4###

삭제한 디렉터리와 파일에 대한 메타정보가 전혀 없음을 확인할 수 있습니다. 추후에 증분 백업을 복원할 때 Tar는 이 정보를 바탕으로 기록되지 않은 디렉터리와 파일을 삭제합니다.


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

ls 명령어를 실행합니다. Level 1 증분 백업 파일인 backup 파일이 새로 생긴 것을 확인할 수 있습니다.

그리고 여기서는 확인할 수 없지만  바로 앞에서 list 파일도 내용이 업데이트되었음을 확인할 수 있었습니다.


level 1 증분 백업 이후 문서 파일 삭제, 수정, 생성 작업

study@study-VirtualBox:~$ cd backup study@study-VirtualBox:~/backup$ ls -F subdir2m/ subdir3/ subdir4/ text2 text3 text4 study@study-VirtualBox:~/backup$ ls -FR .: subdir2m/ subdir3/ subdir4/ text2 text3 text4 ./subdir2m: subdir2text ./subdir3: subdir3text ./subdir4: subdir4text study@study-VirtualBox:~/backup$ rm -r text2 subdir2m study@study-VirtualBox:~/backup$ mv subdir3 subdir3m study@study-VirtualBox:~/backup$ mkdir subdir5 study@study-VirtualBox:~/backup$ touch text5 subdir5/subdir5text study@study-VirtualBox:~/backup$ cat >> text3 modified study@study-VirtualBox:~/backup$

ls 명령을 이용해 수정하기 전 디렉터리와 파일 정보를 확인합니다. 그리고 동일한 방식으로 수정합니다.

수정 내용은 아래와 같습니다.

text2 파일, subdir2와 그 안의 파일 삭제

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

새로운 하위 디렉터리인 subdir5 생성

text5와 subdir5/subdir5text 파일 새로 생성

text4 파일 그리고 하위 디렉터리인 subdir4과 그 안의 파일은 수정 없이 유지

text3 파일 내용 수정 <- 내용 추가

이번에는 각 항목별로 일일이 명령을 치지 않고 동일 명령을 사용할 수 있는 항목을 모아 한번에 실행했습니다. 훨씬 간편해졌습니다.


study@study-VirtualBox:~/backup$ ls -FR
.:
subdir3m/  subdir4/  subdir5/  text3  text4  text5

./subdir3m:
subdir3text

./subdir4:
subdir4text

./subdir5:
subdir5text
study@study-VirtualBox:~/backup$ tree -F
.
├── subdir3m/
│   └── subdir3text
├── subdir4/
│   └── subdir4text
├── subdir5/
│   └── subdir5text
├── text3
├── text4
└── text5

3 directories, 6 files
study@study-VirtualBox:~/backup$ 
수정 후 제대로 변경했는지 확인해봅시다.


Level 2 증분 백업

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

증분 백업과 확인 과정은 동일합니다.


Level 2 증분 백업 이후 문서 파일 삭제, 수정, 생성 작업

study@study-VirtualBox:~$ cd backup
study@study-VirtualBox:~/backup$ ls -F
subdir3m/  subdir4/  subdir5/  text3  text4  text5
study@study-VirtualBox:~/backup$ ls -FR
.:
subdir3m/  subdir4/  subdir5/  text3  text4  text5

./subdir3m:
subdir3text

./subdir4:
subdir4text

./subdir5:
subdir5text
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으로 수정

새로운 하위 디렉터리인 subdir6 생성

text6와 subdir6/subdir6text 파일 새로 생성

text5 파일 그리고 하위 디렉터리인 subdir5과 그 안의 파일은 수정 없이 유지

text4 파일 내용 수정 <- 내용 추가

이번에는 하나의 프롬프프에 여러 명령을 한 번에 실행하는 명령을 사용했습니다. 단, 한 줄에 모두 늘어 놓으면 가독성이 떨어져 사람이 이해하기 쉽게 \ 기호를 사용하여 개별 명령 별로 강제 개행했습니다.

☞ 참고

터미널에서 강제 개행

여기서는 \ 기호로 표시했지만 리눅스 터미널에서는 \(역슬래시)로 표시됩니다.

즉 일반 키보드의 백스페이스 키 바로 왼쪽에 \키가 있는데 해당 키가 리눅스의 터미널에서는 \로 입력됩니다.


study@study-VirtualBox:~/backup$ ls -FR
.:
subdir4m/  subdir5/  subdir6/  text4  text5  text6

./subdir4m:
subdir4text

./subdir5:
subdir5text

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

3 directories, 6 files
study@study-VirtualBox:~/backup$ 
정상적으로 수정되었음을 확인할 수 있습니다.


Level3 증분 백업

study@study-VirtualBox:~/backup$ cd ..
study@study-VirtualBox:~$ ls -F
backup/         backup1.tar.gz  list   다운로드/  바탕화면/  사진/  템플릿/
backup0.tar.gz  backup2.tar.gz  공개/  문서/      비디오/    음악/
study@study-VirtualBox:~$ tar -g list -cvzpf backup3.tar.gz backup
tar: backup/subdir4m: 디렉터리 이름이 이전 `backup/subdir4' 디렉터리 이름에서 바뀌었습니다
tar: backup/subdir6: 새 디렉터리입니다
backup/
backup/subdir4m/
backup/subdir5/
backup/subdir6/
backup/text4
backup/text6
backup/subdir6/subdir6text
study@study-VirtualBox:~$ ls -F
backup/         backup2.tar.gz  공개/      바탕화면/  음악/
backup0.tar.gz  backup3.tar.gz  다운로드/  비디오/    템플릿/
backup1.tar.gz  list            문서/      사진/
study@study-VirtualBox:~$ 

이전과 동일한 방식으로 증분 백업을 수행합니다.

Level 0에서 level 3까지 정상적으로 증분 백업되었습니다.




증분 백업의 복원 방법

디렉터리와 파일 목록 확인

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


복원 방법

가장 먼저 최초의 증분 백업 즉, Level 0의 증분 백업(Full Backup) 파일을 풉니다. 그 이후 오래된 것부터 최근의 것까지 증분 백업본을 시간 순서대로 풀어 줍니다.

이것을 한번의 입력으로 자동으로 실행시키되, 강제개행을 이용해 명령 입력의 가독성을 높인 명령어는 다음과 같습니다.

tar -xzvp -g /dev/null -f backup0.tar.gz && \
tar -xzvp -g /dev/null -f backup1.tar.gz && \
tar -xzvp -g /dev/null -f backup2.tar.gz && \
tar -xzvp -g /dev/null -f backup3.tar.gz

증분 백업본을 복원할 땐 스냅샷 파일이 필요하지 않습니다. 그러나 증분 백업 파일을 가지고 작업을 할 땐 그것이 백업이든 복원이든 -g 옵션은 반드시 필요합니다.

스냅샷 파일의 지정은 필요 없지만 구문상 -g 옵션 자체는 필요하므로 스냅샷 파일 자리에 리눅스의 가상 장치 중 하나인 /dev/null를 지정하여 리다이렉트해줍니다.

☞ 참고

/dev/null

리눅스에서 사용하는 일종의 가상 장치로, 불필요한 출력을 버리는 일종의 쓰레기통으로 이해하면 쉽습니다.

예를 들어 셸스크립트 등에서 표준 오류(stderr) 정보를 /dev/null로 리다이렉트하여 오류 정보를 출력하지 않도록 합니다.


study@study-VirtualBox:~$ ls -F
backup/         backup2.tar.gz  공개/      바탕화면/  음악/
backup0.tar.gz  backup3.tar.gz  다운로드/  비디오/    템플릿/
backup1.tar.gz  list            문서/      사진/
study@study-VirtualBox:~$ tar -xzvp -g /dev/null -f backup0.tar.gz && \
> tar -xzvp -g /dev/null -f backup1.tar.gz && \
> tar -xzvp -g /dev/null -f backup2.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/text1' 삭제 중
tar: `backup/subdir1' 삭제 중
backup/subdir2m/
backup/subdir3/
backup/subdir4/
backup/text2
backup/text4
backup/subdir4/subdir4text
backup/
tar: `backup/text2' 삭제 중
tar: `backup/subdir2m' 삭제 중
backup/subdir3m/
backup/subdir4/
backup/subdir5/
backup/text3
backup/text5
backup/subdir5/subdir5text
backup/
tar: `backup/subdir3m' 삭제 중
tar: `backup/text3' 삭제 중
backup/subdir4m/
backup/subdir5/
backup/subdir6/
backup/text4
backup/text6
backup/subdir6/subdir6text
study@study-VirtualBox:~$ 

-v 옵션을 사용해 복원 과정을 확인할 수 있습니다.

이때 중요한 것은 Level 0의 전체 증분 백업부터 가장 최근의 마지막 Level N 증분 백업까지 시간 순서대로 하나도 빠짐 없이 풀어주어야 한다는 점입니다.

만약 복원 순서를 뒤바꾼다거나 일부 증분 백업을 빠뜨리면 정상적으로 복원되지 않습니다.

☞ 참고

Tar를 이용한 증분 백업의 복원 과정을 설명한 일부 블로그 글에서 잘못된 명령을 사용해 최초의 전체 백업과 마지막 증분 백업만 복원하면 된다고 설명하고 있는 경우가 있는데 그것은 증분 백업 개념에 대한 오해에서 비롯된 오류입니다. 증분 백업은 직전 증분 백업을 기반으로 달라진 부분만을 다음 증분 백업에 적용하는 것입니다. 따라서 증분 백업을 이용해 복원하려면 모든 증분 백업본을 순서대로 빠짐없이 복원해주어야 합니다.

최초의 전체 백업과 마지막 증분 백업만 복원하는 것만으로 온전히 복원하는 것은 따로 차등 백업이라 일걸으며 기본 증분 백업을 응용해야 합니다.


증분 백업과 차등 백업의 차이와 Tar를 ㅣㅇ용한 차등 백업과 복원 방법은 위 링크들을 참고하시기 바랍니다.


복원 확인

study@study-VirtualBox:~$ cd backup
study@study-VirtualBox:~/backup$ ls -FR
.:
subdir4m/  subdir5/  subdir6/  text4  text5  text6

./subdir4m:
subdir4text

./subdir5:
subdir5text

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

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

여러 과정을 거쳐 다시 마지막 증분 백업 당시의 상태로 되돌아 온 것을 확인할 수 있습니다.




증분 백업 복원 과정의 흐름

전체 백업 복원

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:~$ 


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:~$ 

1차 증분 백업 복원

study@study-VirtualBox:~$ tar -xzvp -g /dev/null -f backup1.tar.gz
backup/
tar: `backup/text1' 삭제 중
tar: `backup/subdir1' 삭제 중
backup/subdir2m/
backup/subdir3/
backup/subdir4/
backup/text2
backup/text4
backup/subdir4/subdir4text
study@study-VirtualBox:~$ 


study@study-VirtualBox:~$ ls -FR backup
backup:
subdir2m/  subdir3/  subdir4/  text2  text3  text4

backup/subdir2m:
subdir2text

backup/subdir3:
subdir3text

backup/subdir4:
subdir4text
study@study-VirtualBox:~$ tree -F backup
backup
├── subdir2m/
│   └── subdir2text
├── subdir3/
│   └── subdir3text
├── subdir4/
│   └── subdir4text
├── text2
├── text3
└── text4

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

2차 증분 백업 복원

study@study-VirtualBox:~$ tar -xzvp -g /dev/null -f backup2.tar.gz
backup/
tar: `backup/text2' 삭제 중
tar: `backup/subdir2m' 삭제 중
backup/subdir3m/
backup/subdir4/
backup/subdir5/
backup/text3
backup/text5
backup/subdir5/subdirtext5
study@study-VirtualBox:~$ 


study@study-VirtualBox:~$ ls -FR backup
backup:
subdir3m/  subdir4/  subdir5/  text3  text4  text5

backup/subdir3m:
subdir3text

backup/subdir4:
subdir4text

backup/subdir5:
subdir5text
study@study-VirtualBox:~$ tree -F backup
backup
├── subdir3m/
│   └── subdir3text
├── subdir4/
│   └── subdir4text
├── subdir5/
│   └── subdir5text
├── text3
├── text4
└── text5

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


3차 증분 백업 복원

study@study-VirtualBox:~$ tar -xzvp -g /dev/null -f backup3.tar.gz
backup/
tar: `backup/subdir3m' 삭제 중
tar: `backup/text3' 삭제 중
backup/subdir4m/
backup/subdir5/
backup/subdir6/
backup/text4
backup/text6
backup/subdir6/subdirtext6
study@study-VirtualBox:~$ 


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:~$ 


증분 아카이브 내용 확인

tar --list --incremental --verbose --verbose --file [증분 백업 아카이브 파일명]

증분 백업된 아카이브 파일의 내용을 자세히 확인하려면 위와 같은 명령을 실행해주면 됩니다. 아래는 그 예시입니다.


study@study-VirtualBox:~$ tar --list --incremental --verbose --verbose --file backup1.tar.gz
drwxrwxr-x study/study      83 2020-08-16 17:26 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-16 17:27 backup/subdir4/
Y subdir4text

-rw-rw-r-- study/study      10 2020-08-16 17:24 backup/text2
-rw-rw-r-- study/study       0 2020-08-16 17:25 backup/text4
-rw-rw-r-- study/study       0 2020-08-16 17:27 backup/subdir4/subdir4text
study@study-VirtualBox:~$ 

디렉터리 별로 안에 포함된 항목들을 확인할 수 있으며 각 항목 앞에는 해당 항목의 성격을 알 수 있는 영어 대문자가 표시되어 있습니다.

D : 해당 항목이 디렉터리임을 표시합니다.

Y : 해당 항목이 증분 백업 파일에 포함되어 있음을 표시합니다. 해당 항목은 이전 증분 백업과 비교하여 새로 생성된 것이거나 수정된 것임을 의미합니다.

N : 해당 항목은 이번 증분 백업본에 포함되어 있지 않았음을 표시합니다. 즉 이전 증분 백업본과 비교하여 달라지지 않았음을 의미합니다.

R : 해당 항목의 이름이 바뀌었음을 의미하며, 바뀐 이름은 T에 기록되어 있스니다.

T : R 항목이 바뀐 새로운 이름입니다.


이에 대한 보다 자세한 설명은 아래 링크에 있습니다.




Tar 증분 백업/복원 시 알면 유용한 내용

기본 동작

☞ 아카이브 해제 경로 지정

아카이브 파일을 풀 경로를 따로 지정할 필요가 있을 것입니다. 이땐 -C 옵션을 사용해 경로를 지정해주시면 됩니다.


☞ 백업 대상에서 제외

백업에서 제외할 대상은 --exclude= 옵션을 사용하여 지정해줍니다.

증분 백업 관련 동작

☞ 증분 백업을 위한 전체 백업(Level 0) 백업

증분 백업을 위한 전체 백업(Level 0) 백업을 실행하는 방법에는 두 가지가 있습니다.

첫 번째는 앞서 언급한 바와 같이  -g(= --listed-incremental) 옵션에 지정한 파일이 존재하지 않는 것입니다. 그러면 새로운 스냅샷 파일을 만들며 백업 대상의 현재 상태를 전체 백업합니다. 따라서 기존 스냅샷 파일을 삭제하면 자동으로 전체 백업을 할 수 있습니다.


두 번째는 --level=0 옵션을 추가하는 것입니다. 그러면 기존 스냅샷 파일의 정보는 무시하고 전체 백업을 하게 됩니다.

study@study-VirtualBox:~$ ls -F
backup/         backup1.tar.gz  공개/      문서/      비디오/  음악/
backup0.tar.gz  list            다운로드/  바탕화면/  사진/    템플릿/
study@study-VirtualBox:~$ tree -F backup
backup
├── subdir2m/
│   └── subdir2text
├── subdir3/
│   └── subdir3text
├── subdir4/
│   └── subdir4text
├── text2
├── text3
└── text4

3 directories, 6 files
study@study-VirtualBox:~$ 
위 터미널 모습은 level 0 백업 이후 수정된 상태의 상태의 모습니다. 이 상태를 level 1 증분 백업을 실행했습니다.


study@study-VirtualBox:~$ tar --list --incremental --verbose --verbose --file backup1.tar.gz
drwxrwxr-x study/study      83 2020-08-16 17:26 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-16 17:27 backup/subdir4/
Y subdir4text

-rw-rw-r-- study/study      10 2020-08-16 17:24 backup/text2
-rw-rw-r-- study/study       0 2020-08-16 17:25 backup/text4
-rw-rw-r-- study/study       0 2020-08-16 17:27 backup/subdir4/subdir4text
study@study-VirtualBox:~$ 

그리고 위는 backup1.tar.gz의 증분 백업 정보입니다.

이 상태에서 --level=0 옵션을 붙여 증분 백업을 하면 어떻게 되는지 확인해봅시다.


study@study-VirtualBox:~$ tar -g list --level=0 -cvzpf backup1full.tar.gz backup
tar: backup: 새 디렉터리입니다
tar: backup/subdir2m: 새 디렉터리입니다
tar: backup/subdir3: 새 디렉터리입니다
tar: backup/subdir4: 새 디렉터리입니다
backup/
backup/subdir2m/
backup/subdir3/
backup/subdir4/
backup/text2
backup/text3
backup/text4
backup/subdir2m/subdir2text
backup/subdir3/subdir3text
backup/subdir4/subdir4text
study@study-VirtualBox:~$ 
분명 기존의 디렉터리들임에도 불구하고 새 디렉터리라고 나옵니다.

이번에는 증분 백업 파일 정보를 확인해봅시다.

study@study-VirtualBox:~$ ls -F
backup/         backup1.tar.gz      list   다운로드/  바탕화면/  사진/  템플릿/
backup0.tar.gz  backup1full.tar.gz  공개/  문서/      비디오/    음악/
study@study-VirtualBox:~$ tar --list --incremental --verbose --verbose --file backup1full.tar.g
tar: backup1full.tar.g: open할 수 없습니다: 그런 파일이나 디렉터리가 없습니다
tar: Error is not recoverable: exiting now
study@study-VirtualBox:~$ tar --list --incremental --verbose --verbose --file backup1full.tar.gz
drwxrwxr-x study/study      50 2020-08-16 17:26 backup/
D subdir2m
D subdir3
D subdir4
Y text2
Y text3
Y text4

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

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

drwxrwxr-x study/study      14 2020-08-16 17:27 backup/subdir4/
Y subdir4text

-rw-rw-r-- study/study      10 2020-08-16 17:24 backup/text2
-rw-rw-r-- study/study       0 2020-08-16 16:56 backup/text3
-rw-rw-r-- study/study       0 2020-08-16 17:25 backup/text4
-rw-rw-r-- study/study       0 2020-08-16 16:57 backup/subdir2m/subdir2text
-rw-rw-r-- study/study       0 2020-08-16 16:57 backup/subdir3/subdir3text
-rw-rw-r-- study/study       0 2020-08-16 17:27 backup/subdir4/subdir4text
study@study-VirtualBox:~$ 

모든 디렉터리와 파일들도 새로 추가했다는 의미의 Y가 붙어 있습니다.

의심쩍으니 해당 파일에 아카이브딘 항목을 확인해보도록 합시다.

study@study-VirtualBox:~$ tar -tf backup1full.tar.gz
backup/
backup/subdir2m/
backup/subdir3/
backup/subdir4/
backup/text2
backup/text3
backup/text4
backup/subdir2m/subdir2text
backup/subdir3/subdir3text
backup/subdir4/subdir4text
study@study-VirtualBox:~$ 
확인해보니 증분 백업임에도 불구하고 누락 없이 모든 항목이 포함되어 있습니다.

이것으로 --level=0 옵션은 level 0의 전체 백업을 해줌을 알 수 있습니다.


☞ 복원 시에도 -g 옵션 붙일 것

study@study-VirtualBox:~$ tar -xzvp -f backup0.tar.gz && \
> tar -xzvp -f backup1.tar.gz && \
> tar -xzvp -f backup2.tar.gz && \
> tar -xzvp -f backup3.tar.gz
backup/
backup/subdir1/
backup/subdir2/
backup/subdir3/
backup/text1
backup/text2
backup/text3
backup/subdir1/subdir1text
backup/subdir2/subdir2text
backup/subdir3/subdir3text
backup/
backup/subdir2m/
backup/subdir3/
backup/subdir4/
backup/text2
backup/text4
backup/subdir4/subdir4text
backup/
backup/subdir3m/
backup/subdir4/
backup/subdir5/
backup/text3
backup/text5
backup/subdir5/subdir5text
backup/
backup/subdir4m/
backup/subdir5/
backup/subdir6/
backup/text4
backup/text6
backup/subdir6/subdir6text
study@study-VirtualBox:~$ 

증분 백업을 복운할 때 -g(= --listed-incremental) 옵션을 사용하지 않으면 위와 같이 진행됩니다. 아까 알아본 정상적인 증분 백업 복원 과정과는 다르다는 것을 알 수 있습니다.


study@study-VirtualBox:~$ ls -FR backup
backup:
subdir1/  subdir2m/  subdir3m/  subdir4m/  subdir6/  text2  text4  text6
subdir2/  subdir3/   subdir4/   subdir5/   text1     text3  text5

backup/subdir1:
subdir1text

backup/subdir2:
subdir2text

backup/subdir2m:

backup/subdir3:
subdir3text

backup/subdir3m:

backup/subdir4:
subdir4text

backup/subdir4m:
subdir4text

backup/subdir5:
subdir5text

backup/subdir6:
subdir6text
study@study-VirtualBox:~$ tree -F backup
backup
├── subdir1/
│   └── subdir1text
├── subdir2/
│   └── subdir2text
├── subdir2m/
├── subdir3/
│   └── subdir3text
├── subdir3m/
├── subdir4/
│   └── subdir4text
├── subdir4m/
│   └── subdir4text
├── subdir5/
│   └── subdir5text
├── subdir6/
│   └── subdir6text
├── text1
├── text2
├── text3
├── text4
├── text5
└── text6

9 directories, 13 files
study@study-VirtualBox:~$ 
복원된 디렉터리를 확인해봅시다. 삭제된 디렉터리 및 파일들이 그대로 유지되었음을 확인할 수 있습니다. 이 뿐만 아니라 파일의 내용도 타임스탬프를 기준으로 최신 정보로 수정됨을 알 수 있습니다.


☞ 타임스탬프 변경 금지

Tar 증분 백업 덤프는 타임 스탬프에 의존하므로 덤프 중에 파일의 타임 스탬프를 수정하거나 (예 :`--atime-preserve=replace' 옵션을 사용) 시스템의 시계를 거꾸로 설정하면 결과를 신뢰할 수 없습니다.


☞ 장치 번호 인식

Tar는 --check-device가 기본값으로 설정되어 있어 증분 덤프를 위해 변경된 파일 목록(스냅샷) 파일을 작성할 때 장치 번호도 기록하여 복원 시 사용 장치 번호를 확인하도록 되어 있습니다.

그러나 여러 이유로 덤프시 사용했던 장치 번호와 현재 복원하곶 할 때 장치 번호가 일치하지 않을 수 있습니다. 이땐 `--no-check-device' 옵션을 사용하여 무시합니다.


☞ 접근 시각(access time - atime) 보존

접근 시각 또는 액세스 타임(access time)은 해당 파일에 대한 최종 시각을 의미합니다. 시스템이나 어떤 프로그램이 해당 파일을 읽은 시각을 의미합니다.

Tar를 이용해 압축, 백업을 하게 되면 해당 작업을 위해선 백업 대상이 되는 파일에 접근해야하고 당연히 atime이 변경됩니다.

일반적으로 백업 시 atime이 변경된다고 해서 큰 문제를 야기하지는 않습니다. 그러나 증분 백업 시에는 타임 스탬프가 굉장히 중요한 요소로 작용하게 됩니다. 예를 들어 Tar가 증분 백업 중 다른 프로그램 등이 백업 대상 파일에 접근하여 atime와 mtime 등이 변경되면 그를 기반으로 백업이 수행되므로 문제가 발생할 수 있습니다.

따라서 atime 조차 보존의 대상이 될 필요가 있을 수도 있습니다. --atime-preserve=system을 추가해주시면 됩니다. --atime-preserve만 붙이면 --atime-preserve=replace로 작동합니다. 그러나 이 옵션은 증분 백업과 어울리지 않습니다. 따라서 --atime-preserve=system로 콕 집어 지정해주어야 합니다.

위 링크에 의하면 현재는 Tar에서 --atime-preserve의 기본값이 --atime-preserve=replace로 설정되어 있지만 추후 리눅스가 --atime-preserve=system를 보다 잘 지원하게 되면 기본값을 --atime-preserve=system으로 설정할 계획이 있다고 밝히고 있습니다.