리눅스의 재미를 느끼게 해준 책 - 알기쉬운 한글리눅스 알짜레드햇 5

책 | 2021.12.13 18:16

오랜만에 리눅스 책을 보던중 오래된 책이 눈에 띄어 찍어보았다.

너무 낡아서 테이프로 붙여 아직까지 가지고 있는 책인데 나에게 리눅스의 재미를 느끼게 해준 책이다.

1999년에 나온책이니 오래되기도 했다. 세월의 무상함이..

언젠가 gzip과 tar 의 조합에서 유닉스의 표준 입출력을 이해했던 적이 있었다.
이만용씨가 지은 " 알기쉬운 한글리눅스 알짜레드햇 5 " 에 기초명령/애프리케이션 부분에 gzip, tar 내용이 나오는데 그 내용이 너무나 훌륭하여 여과없이 수록한다.


6장 명령/애플리케이션 사용하기

1. 기초 명령/애플리케이션

1.1 gzip, gunzip
GNU zip을 의미하는 gzip은 압축률이 매우 뛰어난 프로그램으로서, 기존의 유닉스 compress 명령보다 휠씬 우월하며 리눅스의 기본 압축 명령으로 사용되고 있다.
gzip을 모르고 리눅스를 사용하기란 불가능하다.
거의 모든 소스와 바이너리들이 모두 gzip을 이용하여 압축되어 제공되기 때문이다.

무엇보다도 compress 명령은 특허가 걸려있는 압축루틴을 사용하는데 비해, gzip은 특허가 걸려있지않은 Lempel-Ziv 코딩(LZ77)이라는 기법을 사용하여 압축하고 있다.
명령 사용법은 매우 간단하다.
gzip 명령 다음에 압축할 파일명을 원하는 만큼 적어준다.

$ gzip [-9] file1 file2 ...


만약, gzip이 압축에 성공한다면 기존의 file1, file2는 사라지고 file1.gz, file2.gz과 같이 파일명이 .gz로 끝나는 파일이 만들어진다.
허가권과 모드는 모두 보존된다.
compress 명령은 .Z, 즉 대문자 Z로 끝나는 파일명을 갖는다.

-9 옵션을 주면 시간은 많이 걸리지만, 최대의 압축을 수행한다.
이와 반대로 -l 또는 --fast 옵션을 주면 압축률보다는 속도를 우선한다.

만약, 파일명이 주어지지 않는다면 gzip은 자료가 표준입력으로 들어오기를 기다리며( " - " 가 올때도 마찬가지다), 압축된 자료는 표준출력으로 나아간다.
gzip 압축된 것을 풀고 싶을때는 다음과 같이 명령한다.

$ gunzip file.gz
$ gzip -d file.gz


gzip에 압축해제(decompress)를 뜻하는 -d 옵션을 붙이거나, 또는 편리명령인 gunzip을 사용한다.
압축할때 -9 옵션을 주었는지 여부는 알아서 풀어준다. 또한, compress로 압축한 것도 풀어준다.
압축을 풀때는 반대로 file.gz을 삭제하고 file 만 남긴다.

여기에 -c 옵션을 주면 압축이 풀린 자료가 표준출력으로 나아가게 된다.
파이프를 통해 압축을 푼 자료를 다른 프로그램에 넘길때 빈번하게 사용하는 옵션이다.

gzip은 전형적인 '작은 기능'의 유닉스 철학을 보여주는 명령이다.
도스에서 사용하는 압축 명령과는 달리 gzip은 오로지 압축 기능만을 지원하며, 묶기기능은 지원하지 않는다.
묶기 기능은 tar 에서 지원한다.

1.2 bzip2, bunzip2
최근에 커널소스를 압축하는데 gzip과 같이 사용되고 있어 인기를 끌고 있는 엄청난 압축률의 소유자인 bzip2가 있다.
bzip2는 Burrows-Wheeler 블록정렬 텍스트 압축 알고리즘과 허프만(Huffman) 코딩을 사용하고 있다고 한다.
특히, 텍스트 압축에서 두각을 보인다.

bzip2의 사용법은 gzip과 거의 유사하다고 보면 된다.

$ bzip2 file


압축을 성공적으로 마치면 역시 gzip과 마찬가지로 원래의 파일은 사라지고 file.bz라는 파일이 생긴다.
파일명 뒤에 .bz2가 붙는다.
압축을 풀때는 bzip2 -d 또는 bunzip2를 사용하며, 압축풀린 내용을 파일이 아니라 표준출력으로 보내어 파이프로 연결된 다른 프로그램이 사용하게 하길 원할때는 역시 -c 옵션을 준다.
bzip2로 압축된 파일을 푸는 시간은 gzip 압축된 파일을 푸는 시간보다 훨씬 더 많이 걸린다.
이는 고압축률에 대비되는 피할 수 없는 단점일지 모른다.

교체가능한 작은 기능의 유닉스 개발철학의 장점을 보여주는 명령이다.
기존에 gzip으로 하던일을 다른 기능의 수정없이 그대로 그 자리를 대신할 수 있게 된 명령이다.


1.3 tar
tar 명령은 파일을 묶기만 하는 명령이다.
파일을 묶을때는 소유권과 허가권 등 유닉스/리눅스 파일 고유의 특징을 보존한다는 사실이 중요하다.
tar 명령은 기본적으로 파일묶기모드와 풀기모드를 가진다.

$ tar cf file.tar file1 file2 ... dir1 dir2 ...


tar 명령은 다른 유닉스 명령과는 조금 다른 자기 고유의 명령방식을 사용한다.
tar가 묶기모드일때는 c(create) 명령으로 시작한다.
그 다음 f(file) 명령 다음에 파일명을 적는다. c, 즉 새로운 묶음파일(archive file)을 생성할 때 f 다음에 그 파일명을 적는다.
f 다음에 파일명을 - 로 적으면 묶고있는 내용이 표준출력으로 나아간다.
이를 파이프로 받아 gzip 또는 bzip2 압축하여 또 다시 리다이렉션하여 묶음 + 압축파일로 저장하는 일이 빈번하다.

사실, tar 명령은 Tape ARchiver를 뜻하는 명령으로서, 테잎 백업장치에 백업하고, 백업내용을 다시 복구할 때 사용하는 명령으로서 f 명령다음에 테잎 백업장치를 지정해 줄 수도 있다.
SCSI 테잎장치는 /dev/st0, /dev/st01, /dev/st0m 과 같은 장치명을 사용한다.

파일명을 어떻게 적든 상관없지만, tar로 묶었다는 사실을 분명히 해주기위해 .tar라는 이름으로 끝나는것이 좋다.

뒤에는 자유롭게 파일명과 디렉토리명을 적어나간다.
tar는 디렉토리 구조를 보존하여 묶어주므로, 어떤 파일 시스템을 그대로 보존하여 묶은 다음 다른 곳에서 그 구조를 보존하면서 풀어내는 데 사용한다.
tar는 주로 소스코드를 개발자가 배포할 때 많이 사용한다. 보통 tar는 디렉토리를 묶을때 많이 사용하며, 현재 디렉토리의 파일을 그냥 묶는 일은 별로 없다.
게다가 tar 명령으로 나중에 파일을 풀때 현재 디렉토리에다 풀어버리도록 묶는것은 매우 예의바르지 못한 일이다.

주로 많이 사용하는 명령중 하나가 바로 v이다. cf 대신 cvf라고 적으면 묶음과정을 보여준다.

$ tar xvf file.tar


묶음을 풀어낼 때는 풀어내기(extract)를 의미하는 x 명령이 사용된다. v와 f의 의미는 앞에서와 같다.
묶음을 풀지않고 묶인 내용만 확인하고 싶을때는 x 대신에 t 명령을 사용한다.
마찬가지로 유닉스적인 전통의 명령이다.
tar는 다른 일없이 오로지 묶기만을 실행한다. 언제든 tar보다 잘 묶는 명령이 등장하면 압축 명령들을 건드릴 필요없이 대체될 수 있을 것이다.
tar 명령은 cp -a 명령과 같이 허가권,모드상태를 잘 보존해 주기 때문에 한 디렉토리의 구조를 다른 디렉토리 아래에 똑같이 만들때도 많이 사용한다.
다음 예는 현재 디렉토리의 /root 디렉토리를 /home 디렉토리 밑에 똑같이 만들어 내는 작업을 약간 해커적으로 어렵게 해본 명령이다.

$ tar cf - /root | (cd /home ; tar xf -)


앞의 tar 명령이 /root 디렉토리 이하를 묶어 표준출력으로 보내면 파이프를 통해 괄호로 묶은 명령 집합으로 표준입력을 통해 흘러 들어가게 해준다.
/home 디렉토리로 이동하고 나서 그 자리에서 표준입력으로부터 들어온 자료를 풀어낸다.

1.4 tar+gzip, tar+bzip2
리눅스에서는 거의 모든 소스,바이너리 파일들이 tar와 gzip또는 요즘 들어 bzip2의 인기가 올라가면서 tar와 bzip2명령을 사용하여 묶어서 배포되고 있다.
tar는 여러개의 파일을 묶기만 해주고, gzip, bzip2는 오로지 하나의 파일을 압축하기만 한다는 사실을 기억하고 있는가?

대부분의 파일명이 foo-1.0.tar.gz 또는 foo-1.0.tar.bz2라는 형태를 지니고 있다.
또는, 도스 파일명을 고려한 경우 .tgz와 .tbz 등의 이름을 갖고있는 경우가 있는데, .tgz의 경우에는 그것이 단순히 .tar.gz라는 긴 이름을 적을 수 없기 때문인 경우도 있고, 슬랙웨어(slackware) 배포판의 파일을 나타내기도 한다.
슬랙웨어 배포판인 경우 .tgz 파일에는 전형적으로 install 이라는 디렉토리가 함께 포함되어 슬렉웨어의 setup 또는 pkgtool로 설치할 때 실행될 스크립트가 들어 있으니 어느정도 구별이 가능하다.

tar.gz 파일을 풀때는 다음과 같이 묶고, 압축순서 그 반대로 해주는 방법이 있다.

$ gunzip foo-1.0.tar.gz
$ tar xvf foo-1.0.tar


또는, 이 작업이 매우 빈번한 작업이기 때문에 리눅스에서 쓰는 GNU 버전의 tar는 gzip 작용을 함께 하라는 z 옵션을 제공한다.

$ tar xvzf foo-1.0.tar.gz


마찬가지로, tar로 파일과 디렉토리를 묶을때 z 옵션을 주면 자동으로 gzip 압축까지 해준다.

$ tar cvzf root.tar.gz /root

 


"책" 카테고리의 다른 글

댓글쓰기

"리눅스의 재미를 느끼게 해준 책 - 알기쉬운 한글리눅스 알짜레드햇 5" 의 댓글 (0)