SW 패키지 관리 & 압축

Violet_Evgadn·2023년 4월 27일
0

Linux

목록 보기
17/34

SW 패키지 관리

소프트웨어와 구성을 배포하는 방법

  • .tar.gz, tgz - Slackware
  • .rpm - Red Hat, Fedora, SUSE
  • .deb - Debian, Ubuntu

리눅스 설치 파일 확장자 명은 이 3개 중 한개라고 보면 된다.

일반적으로 리눅스는 설치 패키지 형태에 따라 레드햇 계열과 데비안 계열로 나뉘는데 레드햇 계열은 RPM 형식(.rpm)의 패키지가 배포되며 데비안 계열은 DEB 형식(.deb) 패키지가 배포된다.

하지만 대부분 리눅스는 서로 바이너리 호환이 되며 레드햇 계열에서도 DEB 설치 프로그램을 제공하고 데비안 계열에서도 RPM 설치 프로그램을 제공하므로 큰 문제는 되지 않는다.

tar.gz 파일은 gzip으로 압축된 파일의 tar 저장 파일이라고 말하는데, 단순하게 말하자면 압축 파일이다.

이는 아래에서도 설명할 것이며 일부 프로그램은 압축을 풀어 바로 실행이 가능하지만 대부분 직접 컴파일(Compile)하여야 하기 때문에 설치 프로그램으로썬 좋은 확장자는 아니다.

RPM은 특정 시스템에 최적으로 컴파일 된 소스들을 묶은 뒤 기기에서 그대로 풀어 기기 환경에 최적인 컴파일 소스를 실행할 수 있도록 만든 실행 프로그램이다. 이렇다보니 다양한 시스템에서 활용하기 좋다.

DEB 파일은 32bit와 64bit 파일이 존재하며 주로 우분투에서 많이 활용되는 설치 프로그램 확장자명이다.

Dependency & Meta-package 관리자

설치 프로그램을 통해 SW 패키지를 설치할 떄 문제가 되는 것이 있는데, 바로 "Dependency 문제"이다.

Python을 배워봤다고 가정하고 예시를 들어보겠다.

필자는 "pip install numpy" 명령어를 통해 Numpy 패키지를 설치하고 싶다. 그런데 Python이 깔려 있지 않다면 Numpy 패키지를 설치할 수 있을까?

이처럼 특정 파일이나 패키지를 설치할 떄 어떠한 파일이 미리 설치되어 있어야지만 그에 기반하여 설치 가능한 파일들이 존재한다.

만약 필요한 파일이 사전에 설치되어 있지 않아 새로운 파일을 설치할 수 없다면 Dependency 문제가 발생했다고 말한다.

이러한 Dependency 문제를 해결하기 위해 원하는 파일을 설치하기 전 미리 설치되어야 하는 파일의 존재 여부를 조사하고 없을 경우 자동으로 필요한 파일들을 설치해주는 관리자가 존재하는데 이것이 바로 "Meta-pakcage 관리자"이다.

Meta-package 관리자는 인터넷에서 패키지의 위치를 파악해 다운로드, 인스톨, 패키지 간 의존성을 분석하는데 대표적으로 rpm을 설치할 수 있는 yum과 rpm & deb를 설치할 수 있는 apt-get이 존재한다.

RPM

RPM은 Redhat Package Manger의 약자로써 레드햇에서 사용하는 패키지 관리 도구이다.

CentOS는 레드햇 계열이므로 많이 사용하겠지만 필자가 사용하는 우분투에선 잘 활용하지 않는 명령어이긴 하다.

하지만 알아두면 좋다고 생각하여 간단히 정리하겠다.

RPM을 설명하기에 앞서 RPM의 단점에 대해서 설명하는 것이 좋을 것 같다.

RPM으로 SW를 설치하면 Dependency 문제가 발생할 수 있으며 이 때문에 1개 패키지를 설치하기 위해선 패키지 간 의존성을 모두 파악하여 차근차근 다운로드 해야 한다.

하지만 이런 귀찮은 면이 있더라도 알아둬야 할 필요성은 있는게 yum Repository에 모든 프로그램이 설치되어 있는 것은 아니기 때문이다.

yum 명령어를 통해 SW를 설치할 수 있지만 yum으로 SW를 설치하기 어려운 상황이 있을 수 있고 yum repository에 등록되지 않은 프로그램들도 가끔 있다.

이런 경우 프로그램들을 .rpm 파일로 불러와 다운받아야 하는데 이 때 RPM 명령어를 활용하는 것이다.

rpm 명령어 활용법은 아래와 같다.

명령어 사용법

rpm [옵션] [package_name]

패키지 설치 및 업데이트

rpm -Uvh [package-name]
# U : 없으면 설치하고 있으면 업데이트
# v : 설치과정 확인(Verify)
# h : 진행과정을 화면에 출력

패키지 삭제

rpm -e [package_name]
# e : 패키지를 지움(erase)

패키지 조회

# 설치 패키지 확인
rpm -qa [package_name]

# 설치 파일이 어느 패키지에 포함되어 있는지 확인
rpm -qf [package_name]

# 패키지 내에 포함되어 있는 파일
rpm -ql [package_name]

# 패키지 정보
rpm -qi [package_name]

### Option 설명
# -q : 질문(Question). 패키지 조회 시 무조건 앞에 붙어야 하는 옵션
# -a : 모든 패키지에 대하여 질의 수행
# -f : 파일에 대한 패키지 질의 수행
# -l : 패키지에 포함되어 있는 파일 출력
# -i : 패키지 정보 출력(Information)

apt-get

RPM에 대해서도 알아봤으니 우분투에서 활용하는 Meta-package 관리자인 "apt-get"에 대하여 알아보자.

apt-get에 대해 알아보기 전 apt와 apt-get의 차이점에 대해서 알아보자.

SW를 설치할 때 "apt install"을 활용해도 되고 "apt-get install"을 활용해도 된다. 그렇다면 둘에는 어떤 차이가 있을까?

사실 apt와 apt-get의 내부 동작 과정은 거의 차이가 없다.

오래전부터 존재해왔던 apt-get이다 보니 시간이 지날수록 옵션들이 추가되어 현재는 옵션들이 너무 많아진 상태이다.

이런 문제를 해결하기 위해 자주 사용하는 옵션들을 추출한 뒤 사용자들이 사용할 떄 보기 편하게 만든 것이 apt인 것이다.

apt가 뒤에 만들어졌고 가독성이 증가된 설치 관리자로써 추가적인 정보를 출력해주기도 한다.

apt-get은 많은 옵션들을 가지고 있어 기능 자체는 많으며 오래전부터 존재해왔기 떄문에 안정적이고 호환성이 높다.

따라서 Script를 작성할 때는 호환성이 좋은 apt-get 사용을 추천한다.

하지만 단순 패키지 설치를 위해서라면 apt를 통해 쉽고 가독성이 좋게 설치할 수 있으므로 이를 사용하는 것이 좋을 것이다.

apt-get 동작 방식

apt-get은 위 이미지와 같이 동작한다. 여기에서 중요한 점이 "/etc/apt/sources.list"이다.

apt-get은 인덱스를 가지고 있어 설치할 패키지를 가져 올 수 있는 위치 정보를 담고 있다.

해당 위치에는 여러 가지 패키지(설치 프로그램)가 저장되어 있을 것이며 사용자는 그곳에서 패키지를 다운로드 받은 뒤 실행함으로써 실제 SW를 설치할 수 있는 것이다. 그리고 이 위치 정보를 담고 있는 파일이 바로 "/etc/apt/sources.list"이다.

sources.list를 보면 deb와 deb-src가 존재하는데 이는 Archive 타입을 말한다.

deb는 위에서 말했던 일반적으로 사용되는 데비안 계열로 컴파일된 바이너리 패키지를 말하며 deb-src란 소스 상태의 오리지널 프로그램과 데비안 컨트롤 파일(.dsc)을 말한다.

즉, sources.list를 통해 apt-get이 어디에서 어떻게 패키지를 설치하거나 관리할지 결정하는 것이다.

패키지를 저장하고 있어 apt-get을 통해 다운로드 받을 수 있게 해주는 사이트를 "미러사이트"라고 하며 국내 우분투에서는 카이스트서버, 다음카카오서버, 네오위즈서버가 대표적이다.

apt-get 사용 방법

패키지 인덱스 정보 업데이트

  • /etc/apt/sources.list의 URL에 저장된 SW 패키지 정보를 업데이트 하는 과정
sudo apt-get update

패키지 업그레이드 : 설치되어 있는 패키지를 모두 새 버전으로 업데이트

sudo apt-get upgrade

패키지 설치

sudo apt-get install [package_name]

패키지 삭제

sudo apt-get remove [package_name]

# 설정 파일까지 모두 지움
sudo apt-get --purge remove [package_name]

패키지 검색

sudo apt-cache search [package_name]

패키지 정보 보기

sudo apt-cache show [package_name]

파일 압축

파일 묶기

파일 압축에 앞서 알아야 할 것이 "파일 묶기"라는 개념이다.

리눅스에서는 원칙적으로 파일 압축과 파일 묶기를 별개의 프로그램으로 수행한다.

A, B, C파일을 1개의 압축 파일로 압축시키는 상황을 가정해보자.

윈도우에선 3개 파일을 드래그 한 뒤 "ZIP 파일로 압축하기"를 눌러 압축을 수행할 수 있다.

하지만 이는 윈도우가 GUI를 사용하기 때문에 "3개 파일을 드래그 해서 묶는다"라는 개념을 간단히 생략할 수 있는 것이다.

리눅스는 GUI도 가능하지만 대체로 CUI를 통해 모든 동작을 수행한다.

즉, "드래그를 통해 3개 파일을 1개로 묶는 과정"과 "묶은 파일들을 압축하는 과정"을 별개의 동작으로 수행해야 한다는 것이다.

파일 묶기의 명령어는 "tar"이며 묶인 파일의 확장자 명 또한 ".tar"이다.

tar의 사용법을 알기 위해선 파일 압축까지 공부해야 하므로 파일 압축에 대해 먼저 배워보자.

파일 압축

리눅스에서 압축파일의 확장자명은 xz, bz2, gz, zip, Z 등 여러개가 존재한다.

이 중 압축률이 좋은 것은 xz와 bz2로써 이 둘을 자주 사용한다.

파일 압축 관련 명령도 존재하기는 하지만 리눅스에선 파일 압축 명령어를 단독으로 사용하기 보다는 tar 명령어를 통해 파일 묶기 및 압축을 동시에 진행하는 경우가 더 많다.

그렇다 하더라도 파일 압축 명령어를 알아놔 손해 볼 일은 없기 때문에 간단히 알아보자.

xz 압축

# 파일 압축
xz [압축할 파일명]

# 파일 압축 풀기
xz -d [압축을 풀 파일명].xz
xz를 통해 압축하면 압축 파일의 확장자명은 xz가 된다.

bz2 압축

# 파일 압축
bzip2 [압축할 파일]

# 압축 풀기
bzip2 -d [압축 풀 파일명].bz2
bunzip2 [압축 풀 파일명].bz2

bzip2를 통해 압축하면 압축 파일 확장자명은 bz2가 된다.

tar 명령어 사용

tar 동작 관련 옵션

  • c : Create. 파일 묶기 or 압축을 수행
  • x : Extract. 압축을 해제함
  • t : List. 압축된 파일 리스트 보기

tar 명령 목적 관련 옵션

  • f : File. 압축될 파일명 지정
  • v : Verify. 압축 진행 과정 가시화
  • J : tar + xz. 파일을 묶고 xz 파일로 압축까지 진행
    • 결과물 확장자명 : .tar.xz
  • z : tar + gzip. 파일을 묶고 gz 파일로 압축까지 진행
    • 결과물 확장자명 : .tar.gz
  • j : tar + bzip2. 파일을 묶고 bz2 파일로 압축까지 진행
    • 결과물 확장자명 : .tar.bz2

참고로 위 설명은 c 옵션을 통해 압축을 진행하는 상황에서의 설명이고 만약 x 옵션을 통해 압축을 해제할 경우 반대로 압축 파일의 압축을 해제할 것이다.

또한 tar 같은 경우 다른 Linux 명령처럼 -cvf로도 옵션을 사용할 수 있으나 "tar cvf"처럼 옵션에 "-"를 생략해도 된다.

마지막으로 "vf"는 특수한 경우를 제외하고 무조건 tar 옵션에 붙여주는 것이 좋은데, 진행 과정을 확인함과 동시에 압축 파일명을 지정할 수 있기 때문이다.

tar 명령어 사용법

tar [옵션] [압축하거나 묶은 후의 파일명] [압축하거나 묶을 Target 경로]

tar 명령 사용 예시

일단 현재 디렉토리 및 저장된 파일들의 상황은 아래 이미지와 같다.

tar cvf sample.tar ./test2

cvf이므로 압축 파일을 생성하지는 않고 tar의 본래 역할인 파일 묶기만 실행했다.

tar cvfz sample.tar.gz ./test2

이번엔 cvfz이기 때문에 tar + gzip을 수행하여 압축을 진행할 것이다.

즉, sample.tar.gz는 f1 ~ f5까지 묶은 뒤 압축을 수행한 파일인 것이다.

tar -tvf sample.tar.gz

그렇다면 실제로 f1~f5까지 모든 파일이 묶여 압축되었는지 명령어를 통해 알아보자.

위 사진에서 볼 수 있듯 정상적으로 모든 파일이 묶여 압축되었음을 알 수 있다.

tar xvfz sample.tar.gz

마지막으로 압축을 해제해보자. 그 전에 일단 존재하던 test2 디렉터리를 삭제해 놓고 위 명령어를 입력하자.

압축을 해제하자 test2 디렉토리가 생겼고 그 안에는 f1 ~ f5 까지 모든 파일이 존재함을 볼 수 있다.

profile
혹시 틀린 내용이 있다면 언제든 말씀해주세요!

0개의 댓글