[LFCS] Linux Archiving and Compression 기초

2022. 7. 24. 17:26[ 자격증 ]/[ LFCS ]

사전적 의미

- Archiving: 파일로 보관, 보존, 백업 (Archive: 보관소)

- Compression: 압축

 

리눅스에서 Archiving이란 '원본의 속성을 그대로 보존하면서' 여러 개의 파일(디렉토리)를 묶어서 보존(백업)하는 것을 의미한다. Compression은 큰 사이즈의 파일을 작은 사이즈로 압축하는 것을 의미한다.

 

왜 하는가?

- 여러 개의 파일들을 묶은 뒤(Archiving) 하나로 압축하여 다른 곳으로 전송하거나 보관하기 위함이다.

- 보통 하나의 디렉토리와 그 하위 디렉토리를 함께 묶을 때 사용한다. 또는 묶어 보존할 때 사용한다.

 

Archiving, Compression 종류

[Archiving util]

- tar, cpio

 

[Compression util]

- gzip, bz2, xz

- 위 3가지 압축 유틸은 파일 단위로 압축하는 역할만 진행함

- 따라서 압축된 여러 개의 파일들을 묶어주는 역할인 'Archiving'이 필요함

 

cf. 각 파일을 압축한 뒤 아카이빙하는 것도 가능하지만 'Archiving -> Compress -> 전달 또는 보존' 하는 순서가 더 적은 용량의 파일을 만들 수 있다.

 

 


 

Archiving (tar, Tape Archive)

- 리눅스에서 '아카이브 파일을 만든다'는 하나의 파일로 묶어 보관(백업)한다는 의미이다.

- 만약 /home을 tar로 아카이브 하면 home.tar가 생성되고 해당 백업 파일은 원본 파일의 상태(permission, 생성시기 등)를 그대로 보존하는 상태로 생성된다.

- home.tar를 압축하는 것도 가능하다.

- 묶은 파일을 원래대로 복원(restore)할 수 있다. (x 옵션)

 

 

사용법

사용법: tar [options] [file(directory)]

 

tar --help

Options

-c, —create : create a new archive(기존 아카이브는 덮어 쓰임, 명령어 뒤에 명시한 파일을 기준으로 아카이빙함)
-v, —verbose : verbosely list files processed(자세하게 나열)
-f, —file=ARCHIVE : use archive file or device ARCHIVE(필수옵션)
-t, —list : list the contents of an archive
-x, —extract, —get : extract files from an archive(원복 시 사용)

-r : 기존의 tar 파일에 추가할 파일을 지정할 때 사용

 

-z, —gzip, —gunzip, —ungzip : filter the archive through 'gzip'
-j, —bzip2 : filter the archive through 'bzip2'
-J, —xz : filter the archive through 'xz'

 

cf. x, j, J는 tar + 압축을 한 번에 할 때 사용함. 글 아래에서 설명할 것.

cf. tar 명령어 뒤에 파일을 명시할 때에는(결국 모든 경우에서) f 옵션을 필수로 넣어줘야 함.

 

실습

1) 실습 환경 구성

실습 진행을 위해 /etc에서 h로 시작하는 파일과 /usr/bin에서 a로 시작하는 파일을 복사해 임시파일로 사용할 것이다. 그리고 datadir을 만들고 해당 디렉토리로 모든 파일들을 옮긴다.

mkdir lfcs-exam
cd lfcs-exam/
cp /etc/h* .
cp /usr/bin/a* .
ls

mkdir datadir
mv * datadir/

 

2) datadir 파일을 아카이브 하기 (== datadir 파일을 tar파일로 백업한다)

tar -cf datadir.tar ./datadir/

- cf : c는 생성한다는 옵션, f는 datadir.tar라는 파일명으로 만들겠다고 지정하는 옵션

- datadir.tar : 아카이브(백업)할 파일명을 명시

- ./datadir/ : 현재 디렉토리의 datadir이라는 디렉토리 안에 있는 모든 파일들을 대상으로 함 (뒤에 공백을 기준으로 여러 파일들을 나열할 수도 있음)

 

cf. 옵션 사용 시 - 는 생략 가능하지만 "-옵션1 [옵션 값1] -옵션2 [옵션 값2]"와 같이 사용할 때에는 -를 붙여줘야 한다. 헷갈리지 않게 사용하기 위해 -를 사용하는 걸 추천한다.

 

[생성된 datadir.tar 파일 확인]

 

아카이브 된 파일은 원본 파일보다 더 큰 용량을 가지고 있음을 확인할 수 있다.

 

 

[백업 파일(tar파일) 컨텐츠 확인하기]

tar -tvf datadir.tar

 

확인 결과 파일의 소유자, Permission, 수정된 날짜 등 속성정보를 그대로 보존하면서 보관하고 있음을 알 수 있다.

 

 

5) 원본 파일 삭제하고 datadir.tar를 이용하여 원래대로 복원하기(restore)

 

명령어 rm -rf datadir로 기존 원본 파일을 삭제한 뒤, x 옵션 활용하여 복원하면 삭제한 datadir이 다시 생성되었음을 확인할 수 있다. 또한 원래 datadir을 생성한 날짜 등과 같은 상태 정보도 기존의 아카이빙한 상태정보 그대로 복원되었음을 확인할 수 있다.

 

 


Compression

압축과 관련된 잘 알려진 utility는 gzip(GNU zip), bzip2, xz 3가지 있으며 약간 다른 성격을 보이는 zip 유틸도 있다. 이중에서도 gzip은 가장 많이 사용되어 거의 표준에 가까운 압축 유틸이다.

 

사용법

https://youtu.be/iLDwma6dDqk

 

 

공통된 특징

- file 단위로 압축할 수 있다.

- 압축을 하면 원본 파일은 삭제되고 압축파일만 남겨진다.

 

 

 

실습

1) gzip으로 압축하기

 

 

압축 결과, 원본 파일은 삭제되고 압축파일만 남게 됨을 확인할 수 있다.

 

 

 

2) 압축률 확인

cp /etc/passwd .
cp /etc/hosts .
bzip2 hosts
xz passwd

 

3가지 압축 유틸의 압축률을 확인하기 위해 bzip2, xz도 압축을 진행한다. 그리고 각 압축파일의 용량을 확인해보면 xz는 압축률이 가장 큰 것을 확인할 수 있다.

(압축률 비교 xz > bzio2 > gzip)

 

cf. 압축은 텍스트에서 해당 글자가 어느 위치에 존재했는지를 기록하는 식으로 이루어진다. (위치정보를 기록하는 방식)

 

 

3) 압축 풀고 내용 보기

아스키 텍스트 파일 내용 보기

xzcat [압축파일명].xz
bzcat [압축파일명].bz2
zcat [압축파일명].gz

 

 

4) 압축 해제하기

gunzip [파일명].gz (또는 gzip -d [파일명].gz)
bunzip [파일명].bz2 (또는 bzip2 -d [파일명].bz2)
unxz [파일명].xz (또는 xz -d [파일명].xz)

 

* 압축할 때와 마찬가지로 압축을 해제하면 압축파일은 삭제되고 원본 파일만 남게 된다!

* d옵션을 통해 압축할 때와 같은 명령어로 압축 해제할 수 있다.

 

 

 

참고) zip 명령어

- zip은 gzip, bzip2, xz와 다르게 원본을 삭제하지 않고 압축한다.

- 디렉토리도 압축 가능하다.

- zip은 압축 시, unzip은 압축해제 시 사용한다.

 

 

실습

확인 결과 원본 파일도 삭제되지 않고 남아있음을 확인할 수 있다.

 

 

 

ZIp으로 디렉토리 통째로 압축하기

zip -r datadir.zip datadir

 

-r 옵션 : recursive 하게 하위 디렉토리까지 모두를 포함한다는 옵션이다.

 

 

 

unzip으로 압축 풀기

unzip datadir.zip

 

압축을 풀어도 기존 파일에 대한 속성(만든 시간, 권한 등)도 그대로 보존된다.

 

 


 

Archiving과 Compression 한 번에 하기

아카이브(백업) 명령어인 tar는 압축 utility 명령어와 한번에 사용할 수 있도록 옵션을 지원한다. 위 tar 명령의 Option 설명에서 가장 아래 있던 3가지 옵션이 이에 해당한다.

 

Option

-z: 아카이브 후 gzip으로 압축

-j: 아카이브 후 bz2로 압축

-J: 아카이브 후 xz로 압축

 

 

실습: /home 디렉토리를 백업하고 압축하기

1) tar + gzip 활용

sudo tar -czvf /home.tar.gz /home

- czvf: '생성, 압축까지(단 gzip으로), 자세하게 보여줘라, 파일명을 명시하겠다' 순

- /home.tar.gz: 생성할 아카이브와 압축된 파일의 절대 경로와 이름

- /home: 아카이브와 압축할 디렉토리

 

cf. .tar.gz를 .tgz로 압축할 수 있음.

 

* 위 명령어를 수행하면 최상위 디렉토리(/) 아래 home.tar.gz 파일이 생성된다.

 

 

생성된 파일 정보 확인

 

 

 

아카이브+압축 파일 내용 확인

tar -tvf /home.tar.gz

- t 옵션은 아카이브 파일의 contents를 보여주는 옵션이다. 압축파일이지만 tar로 아카이빙 되었기 때문이다.

- f 옵션은 뒤에 파일을 명시할 경우 필수로 넣어줘야 한다.

 

 

2) tar + bz2 활용

sudo tar -cjvf /home.tar.bz2 /home

gzip으로 압축과정을 포함한다는 j 옵션을 넣어주면 된다. (소문자 j)

 

 

3) tar + xz 활용

sudo tar -cJvf /home.tar.bz2 /home

대문자 J옵션은 xz 압축 과정을 아카이빙에 포함한다.

 

 

 

tar + 압축 정리

1) tar + gzip (z옵션)

sudo tar -czvf /file.tar.gz /dir
file /file.tar.gz
tar -ztvf /file.tar.gz

 

2) tar + bzip2 (j옵션)

sudo tar -cjvf /file.tar.bz2 /dir
ls -l /file.tar.bz2
tar -jtvf /file.tar.bz2

 

3) tar + xz (J옵션)

sudo tar -cJvf /file.tar.xz /dir
ls -l /file*
tar -Jtvf /file.tar.xz

 

 

 

 

비교해보기

1) 성능 비교

대략적인 성능 비교는 다음과 같다. tar와 xz를 같이 사용했을 때 가장 오랜 시간이 걸리고 tar와 gzip을 사용했을 때 가장 빠른 처리를 보여줌을 확인할 수 있다.

 

 

cf. time 커맨드

- real: 실제 경과 시간으로 I/O 작업 중에 프로세스가 블락된 시간까지 모두 포함된다.

- user: 프로세스 코드에서 user mode 코드가 실행되는데 걸린 CPU 시간이다.

- sys: 프로세스 코드에서 kernel mode 코드가 실행되는데 걸린 CPU 시간이다.

 

 

* 압축할 파일에 따라 성능 차이는 달라질 수 있음

 

2) 압축률(용량) 비교

xz < bzip2 < gzip 순으로 용량을 나타냈다. 즉, 압축률은 xz가 가장 좋다.

 

결론적으로 xz의 압축률이 가장 좋지만 성능적인 측면에서는 가장 느리다는 것을 알 수 있다.

 

 

* tar + zip에 대한 고찰

tar 커맨드에서 zip 명령어와 함께 사용할 수 없다. tar할 파일들을 하나씩 zip한 뒤 tar를 해본 결과 가장 큰 용량을 가지게 되었음을 알 수 있었다. 결국 아카이브 할 파일들을 압축한 뒤 아카이브하는 것보다 각 파일들을 아카이브 한 뒤 압축하는 것이 더 효율적일 것이라는 잠정적인 결론을 낼 수 있다. 단, 아카이브 후 압축한 결과에서는 일부 파일만을 압축 해제할 수 없다는 단점이 있다.

 

 

 

복원(restore) 하기

sudo tar -zxf /home.tar.gz

 

-z 옵션: gzip으로 압축된 것을 풀어라

-x 옵션: 아카이브를 해제해라 (원복 해라)

 

즉, 아카이브를 해제하는데 압축까지 풀어서 진행하라는 옵션이다.

 

 

 

Restore 정리

1) tar + gzip 파일 복원하기 (z, x옵션)

sudo tar -xzvf /file.tar.gz

 

2) tar + bzip2 파일 복원하기 (j, x옵션)

sudo tar -xjvf /file.tar.bz2

 

3) tar + xz 파일 복원하기 (J, x옵션)

sudo tar -xJvf /file.tar.xz

 

 

Reference

- https://youtu.be/dAmxwX0LyZ0

- https://mamu2830.blogspot.com/p/blog-page_23.html