리눅스 패키지(Linux Package)에 대한 이해
서론
여러분이 해보고 싶은 게임이 생겼다. 어떻게 할 것인가?
당연히 해당 게임을 설치할 수 있는 홈페이지에 가서 파일을 다운로드를 하고 실행할 것이다.
그럼 이때 다운로드한 파일의 포맷은 무엇일까?
예상했다시피 대부분 왼쪽 그림처럼 압축 파일(.zip
)이거나 오른쪽 그림처럼 윈도우 인스톨러(.msi
) 파일이다.
압축 파일의 압축을 해제하고 프로그램을 실행하거나 윈도우 인스톨러를 클릭하여 프로그램을 설치하고 실행하는 방식은 우리가 윈도우 운영체제(Windows OS)에 익숙하다면 흔히 접할 수 있는 상황이다.
그럼 리눅스(Linux)에서 우리가 원하는 프로그램을 설치하고 싶으면 어떤 파일을 다운로드하여야 할까?
리눅스도 윈도우와 크게 다르지 않다.
리눅스도 압축 파일을 다운로드하거나 윈도우 인스톨러처럼 설치를 도와주는 파일을 다운로드한다.
리눅스에서는 이러한 파일들을 통틀어 패키지(Package)라고 부른다.
그러면 리눅스 패키지와 리눅스 패키지를 관리하는 방식에 대해 자세히 알아보자.
리눅스 패키지(Linux Package)
리눅스 패키지(Linux Package)란 리눅스 시스템에서 소프트웨어를 실행하는데 필요한 파일들(실행 파일, 설정 파일, 라이브러리 등)이 담겨 있는 설치 파일 묶음이다.
패키지는 종류는 소스 패키지(Source Package)와 바이너리 패키지(Binary Package)가 있다.
소스 패키지(Source Package) vs 바이너리 패키지(Binary Package)
소스 패키지(Source Package)는 말 그대로 소스 코드가 들어 있는 패키지로 컴파일 과정을 통해 바이너리 파일로 만들어야 실행할 수 있다.
즉, 소스 패키지는 설치할 때 컴파일 작업도 진행되므로 설치 시간이 길고 컴파일 작업 과정에서 오류가 발생할 수 있다.
바이너리 패키지(Binary Package)는 성공적으로 컴파일된 바이너리 파일이 들어있는 패키지이다.
이미 컴파일이 되어 있으니 소스 패키지에 비해 설치 시간도 짧고 오류가 발생할 가능성도 적다.
따라서 리눅스의 기본 설치 패키지들은 대부분 바이너리 패키지이다.
이렇게만 보면 바이너리 패키지가 소스 패키지보다 장점만 많은 거 같은데 왜 소스 패키지도 사용하는 것일까?
소스 패키지를 사용하는 이유
그 이유는 내가 원하는 대로 소프트웨어를 수정해서 사용할 수 있기 때문이다.
리눅스에서는 많은 소프트웨어 패키지가 있으며 대부분 GPL 라이선스가 있는 무료 및 오픈 소스이다.
따라서 원한다면 소프트웨어를 맘대로 수정해서 사용할 수 있는데 그러려면 당연히 소스 패키지를 다운로드하여 소스 코드를 수정하거나 컴파일 옵션을 변경하여 사용해야 한다.
또한, 바이너리 패키지는 중요한 문제가 있다.
바이너리 패키지의 문제점
바이너리 패키지는 이미 컴파일되어 있어서 바로 설치할 수 있다는 장점이 있지만 내 컴퓨터 환경과 바이너리 패키지가 컴파일된 환경이 달라서 문제가 발생할 수 있다.
즉, 내가 설치한 바이너리 패키지를 실행하기 위해서 특정 버전의 라이브러리들이 필요하다면 내가 그 라이브러리들을 가지고 있지 않을 경우 제대로 프로그램을 실행할 수 없다.
이렇게 바이너리 패키지를 제대로 실행하기 위해서는 특정 라이브러리나 다른 패키지가 필요할 수 있는데 이러한 패키지 간의 의존성을 패키지 의존성(Package Dependencies)이라 부른다.
리눅스 패키징 방식(Linux Packaging System)
리눅스 배포판 별로 다양한 패키징 방식이 존재하지만 대표적으로 두 가지 방식이 있다.
-
Debian 계열(Debain, Ubuntu, Linux Mint 등)에서 사용하는 패키징 방식 : DEB
-
Red Hat 계열(Red hat, Fedora, CentOS 등)에서 사용하는 패키징 방식 : RPM
DEB 패키지 파일의 확장자는 *.deb
이고 RPM 패키지 파일의 확장자는 *rpm
이다.
리눅스 패키지 관리 방식(Linux Package Management System)
리눅스에서는 패키지를 관리하기 위해 패키지 관리 도구(Package Management Tool)를 사용한다.
패키지 관리 도구는 저수준 패키지 도구(Low Level Package Tool)와 고수준 패키지 도구(Hight Level Package Tool)로 구성된다.
저수준 패키지 도구(Low Level Package Tool)
저수준 패키지 도구는 패키지 파일을 설치하거나 제거할 때 사용하는 도구이다.
저수준 패키지 도구는 각 패키지의 파일을 설치하고 제거할 수는 있어도 패키지 간의 의존성은 알지 못한다.
Debian 계열에서 사용하는 저수준 패키지 도구는 dpkg이고 Red Hat 계열에서 사용하는 저수준 패키지 도구는 rpm이다.
고수준 패키지 도구(Hight Level Package Tool)
고수준 패키지 도구는 패키지 파일을 설치하고 제거할 뿐만 아니라 다운로드 가능한 패키지들을 검색하고 패키지 의존성(Package Dependencies)을 해결하는 도구이다.
패키지 의존성을 해결한다는 의미는 해당 패키지가 가지고 있는 패키지 간의 의존성을 파악하고 필요하다면 자동으로 설치해준다는 뜻이다.
Debian 계열에서 사용하는 고수준 패키지 도구는 apt-get, apt, aptitude이고 Red Hat 계열에서 사용하는 고수준 패키지 도구는 yum, dnf이다.
각 패키지 도구들의 명령어는 생략하겠다. 자세한 내용은 각 패키지 도구에 맞게 검색해보자.
리눅스 패키지 저장소(Linux Package Repository)
리눅스 패키지 도구를 사용하면 우리가 원하는 소프트웨어를 다운로드할 수 있다.
예를 들어 Debian에서 APT 도구를 사용해서 python3 패키지를 설치한다고 생각해보자
sudo apt install python3
이때 APT는 python3 패키지가 뭔지 어떻게 알고 설치할 수 있는 것일까?
그것은 바로 APT가 인터넷에 있는 특정 주소로부터 필요한 패키지를 가져오기 때문이다.
이렇게 패키지들을 가지고 있는 인터넷 주소들을 리눅스 패키지 저장소(Linux Package Repository)라 부른다.
리눅스 패키지 저장소는 패키지에 대한 정보(패키지들의 이름, 버전 번호, 패키지 설명 등)가 포함된 메타 정보(Metadata)를 가지고 있다. 이를 통해 우리는 언제든지 패키지 도구를 이용해 저장소가 가지고 있는 패키지 정보를 확인할 수 있다.
apt list
리눅스는 패키지 저장소 사이트들을 특정 파일에 저장하고 있는데 Debian의 경우 etc/apt/source.list
파일에 저장되어 있다.
source.list 정보
source.list
에 적혀있는 정보들은 다음과 같다.
deb http://www.deb-multimedia.org buster main none-free
[deb or deb-src] [repository url] [distribution] [component]
- deb or deb-src : 바이너리 패키지 저장소(Binary Package Repositories)와 소스 패키지 저장소(Source Package Repositories) 중 어떤 저장소를 사용하는지를 의미
- repository url : 해당 저장소의 주소를 의미
- distribution : 릴리즈하는 리눅스 버전 이름을 의미
- component : main(표준으로 제공되는 무료 오픈소스 소프트웨어), restricted(공식적으로 지원하는 사유 소프트웨어), universe(커뮤니티에 의해 유지되고 지원되는 오픈소스 소프트웨어), multiverse(공식적으로 지원되지 않는 사유 소프트웨어)를 의미
Debian 계열이 아닌 리눅스 패키지 저장소도 비슷한 형태를 하고 있다.
리눅스 패키지 설치 과정
출처 : https://itsfoss.com/package-manager/ |
지금까지 이해한 내용을 바탕으로 리눅스 패키지가 어떻게 설치되는지 알아보자.
먼저 리눅스 시스템의 패키지 관리자(Package Manager)는 패키지 저장소(Package Repository)로부터 설치할 수 있는 패키지 정보들을 가진 패키지 메타 정보(Package Metadata)를 로컬 캐시에 저장한다.
패키지 관리자(Package Manager)가 특정 패키지의 설치를 명령하면 로컬 캐시를 참조하여 패키지 정보를 찾고 패키지 저장소(Package Repository)를 통해 패키지를 다운로드한다.
이때 패키지는 패키지 종속성(Package Dependencies)이 있을 수 있다. 패키지 관리자(Package Manager)는 종속성을 처리하고 필요한 패키지들을 자동으로 설치한다.
이 과정을 통해 우린 원하는 패키지들을 쉽게 설치하고 관리할 수 있다.
결론
지금까지 리눅스 패키지와 리눅스 패키지를 관리하는 방식에 대해 알아보았다.
자세한 활용법은 각 패키지 도구들의 명령어를 사용하면서 자연스럽게 익힐 수 있다.