home search
OS
Linux
[Linux] Linux Admin (1): 패키지 매니저
2022. 02. 24

Package manager

Package

패키지는 시스템을 구성하는 파일의 묶음으로, 패키지 관리자나 설치 프로그램에 의해 읽어지는 pre-built 파일들이다. 미리 컴파일 된 파일들이다. 설치나 삭제, 업그레이드 등 관리가 편리하다.

리눅스의 패키지 방식(시스템)은 RH계열과 Debian 계열이 서로 다르다. RH 계열은 RPM을 기준으로 만들어져 rpm(Red Hat Package Manager)(기본 명령) 혹은 yum(yello-dog updater modifier)(네트워크, 의존성 설치 지원 툴)이라는 명령어로 주로 사용한다. 둘 중에는 yum을 더 많이 쓴다. Debian 계열은 DEB 방식을 사용해 dpkg(Debian Package Manager)(기본 명령), apt(Advanced Package Tools)(네트워크, 의존성 설치 지원 툴)의 명령어로 사용된다. apt-get도 있으나 apt가 더 많이 쓰인다.

Debian 계열 패키지 매니저 중 dpkg와 apt를 순서대로 보자.

dpkg

① 개요

유닉스의 pkg에서 유래했으며, 초기 Debian부터 있었다. 초반엔 의존성, 검색, 네트워크 설치 등의 문제가 발생하여 apt가 나왔다. 따라서 현재는 dpkg보단 apt를 사용하고, apt에서 지원하지 않는 몇가지만 일단 알아둔다.

Debian 계열의 패키지 이름은 아래와 같은 구성을 갖는다.

strace_4.5.20_2.3_amd64.deb

dpkg는 확장자가 *.deb로 끝난다. 또한 strace는 패키지의 이름, 4.5.20_2.3_를 기준으로 버전과 release를 나타내는 값이다. amd64 부분은 아키텍쳐(arch.)를 말하며, 이는 인텔 계열의 x86 64bit(x86_64)이다.

② 패키지 리스트 확인 옵션

# dpkg -l <Package> → list의 약자
# dpkg -l strace

Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name           Version      Architecture Description
+++-==============-============-============-=================================
ii  strace         4.21-1ubuntu amd64        System call tracer

③ 패키지 상태 확인 옵션

# dpkg -s <Package_pattern ...> → status의 약자
# dpkg -s strace

Package: strace
Status: install ok installed → 'install ok unpacked'라면 완전히 설치된 것이 아님
Priority: optional
Section: utils
Installed-Size: 1408
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Architecture: amd64
Version: 4.21-1ubuntu1
Depends: libc6 (>= 2.15), libunwind8
Description: System call tracer
(이하 생략)

④ 특정 파일이 속한 패키지

어떤 파일이 어떤 패키지에 있는지 역추적할 때 사용한다.

# dpkg -S <pattern ...> → Search의 약자
# dpkg -S /bin/ls → 경로를 입력하면 어떤 패키지에 해당하는지 나온다.
coreutils: /bin/ls

# dpkg -S '*trace' → 와일드카드도 이용할 수 있다
linux-hwe-5.4-headers-5.4.0-42: /usr/src/linux-hwe-5.4-headers-5.4.0-42/arch/s390/include/asm/trace
linux-hwe-5.4-headers-5.4.0-100: /usr/src/linux-hwe-5.4-headers-5.4.0-100/arch/powerpc/kernel/trace
linux-hwe-5.4-headers-5.4.0-99: /usr/src/linux-hwe-5.4-headers-5.4.0-99/arch/s390/include/asm/trace
linux-hwe-5.4-headers-5.4.0-100: /usr/src/linux-hwe-5.4-headers-5.4.0-100/tools/testing/selftests/ftrace
(이하 생략)

⑤ 에러 해결

dpkg를 쓰다가 에러가 나는 등의 경우에 해결할 때 dpkg --audit를 사용한다.

apt

apt의 개요

Advanced Package Tool의 약어로, 데비안 계열의 패키지 관리자 중 하나이다. 기존에 있던 dpkg가 의존성 문제, 잘 작동하지 않는 등의 문제가 있어 dpkg를 랩핑한 front-end tool이다. 따라서 APT는 네트워크 설치를 지원하고(mirror 탐색 가능), 의존성(dependency)을 탐색하고 설치하는 것이 가능해졌다.

기존에는 apt-get, apt-cache, apt-file등의 명령어가 나뉘어 존재했다. 그러나 이 모든 것을 합쳐 apt로 새 명령어가 나왔다. 따라서 요즘은 apt를 사용하는 것이 좋다.

source list

① 개요

apt를 쓰려면 source list를 만들어줘야 한다. apt는 원격으로 패키지를 다운로드 하는데, 패키지 파일을 다운 받는 곳의 정보, 즉 패키지의 위치(소스가 있는 곳)을 지정하는 것이 source list이다. 내용은 /etc/apt/sources.list에 있으며, 해당 파일을 직접 편집하는 것은 권장하지 않고, 만약 추가할 때는 /etc/apt/sources.list.d/디렉토리 밑에 *.list 파일명으로 추가하는 것이 좋다. 또한 이렇게 파일을 직접 추가할 수도 있지만, 편집 시에는 apt edit-sources 명령어를 더욱 추천한다.

#는 주석문이다.

② sources.list 구조

/etc/apt/sources.list 파일은 아래 두 개의 구조를 가진다.

(1) deb [ option1=value1 option2=value2 ] uri suite [component1] [component2] [...]
(2) deb-src [ option1=value1 option2=value2 ] uri suite [component1] [component2] [...]

deb으로 시작하는 것은 데비안 패키지를 받아오는 곳이고, deb-src는 소스코드(소스패키지)를 받아오는 곳이다. 바로 뒤에 붙는 []은 선택사항이다. uri는 DEB 패키지를 제공하는 사이트의 URI이다. suite는 패키지를 가져올 때 어떤 버전으로 가져올지 정하는 코드네임이다. 자세히는 distribution codename 디렉터리의 이름(dist. version)으로, 16.04xenial, 18.04bionic으로 나온다. component는 suite의 구성요소 및 라이선스 종류별 분류이다. 최소 1개 이상의 컴포넌트를 지정해야 한다. 가장 많이 쓰는 컴포넌트의 종류는 아래와 같다.

component 설명
main 우분투에서 직접 패키징을 하는 메인 패키지들
restricted 제한된 free license인 소프트웨어
universe 커뮤니티에서 유지를 담당하는 경우, 대부분이 여기 속하기도 한다.

③ sources.list 에 URL 추가하기

/etc/apt/sources.list.d/디렉토리 밑에 *.list 파일명으로 추가하는 방법이 있다. 일례로 /etc/apt/sources.list.d/google-chorme.list를 보면 아래와 같이 되어 있다.

deb [arch=amd64] https://dl.google.com/linux/chrome/deb/ stable main

우분투 미러를 제공하는 카카오를 보자. http://mirror.kakao.com/ubuntu/ 경로로 가본다.

위 사진의 목록을 참고하면

deb http://mirror.kakao.com/ubuntu/ bionic main restricted universe

처럼 적을 수 있다.

그러나 파일을 직접 추가하기보단 명령어 apt edit-sources를 쓰는 편이 좋다. 이 방법으로 kakao mirror를 설정하는 실습을 해보자.

최종적으로 편집할 파일은 /etc/apt/sources.list.d/kakao.list이다.

가장 먼저, 기본 에디터를 vim으로 변경한다. 이렇게 설정해야지 apt 에서 편집할 때 vim을 사용할 수 있다.

$ sudo select-editor

다음으로는 kakao mirror를 설정한다.

$ sudo apt edit-sources kakao.list

빔 편집기에서 아래의 deb 설정을 입력 후 저장하고 나온다.

다음으로는 source list를 갱신해야 한다.

$ sudo apt update 

위 명령어를 입력하면 kakao에 연결해 갱신 작업을 수행한다.

apt의 기능

원래는 밑에 나올 명령어들은 앞에 sudo라고 붙여야 하나, 일일히 치기 귀찮으니 su -로 루트 유저로 로그인한 뒤 실습했다.

① 패키지 목록 출력

apt list [옵션] [Package pattern]

패키지의 목록을 출력한다. 옵션이 지정되지 않으면 해당 버전 제공 패키지의 최신 목록을 출력한다. 옵션 중 --installed는 설치된 패키지의 리스트를, --upgradable은 업그레이드가 가능한 패키지 리스트를, --all-versions는 모든 버전의 패키지 리스트를 보여주는 옵션이다.

# apt list
# apt list --installed
# apt list bash*

② 패키지 검색 (키워드)

apt search [-n] <regex>

패키지를 키워드로 검색하며, 키워드는 REGEX로 입력한다. 옵션인 -n은 검색 대상을 name 필드로 한정한다는 것이다.

# apt search bash → name 뿐만 아니라 Description에까지 bash가 들어갔다면 검색한다.
# apt search -n bash → name의 중간에 bash가 들어갔어도 검색한다.
# apt search -n '^bash' → name의 시작에 bash가 있는 경우에만 검색한다

③ 패키지의 정보 출력</span> 패키지 개별로 그 정보를 출력한다.

apt show <패키지 이름>[=version]
# apt show bash
# apt list --all-versions bash
# apt show bash=4.4.18-2ubuntu1

④ 삭제

apt <remove|purge|autoremove> <Package>[=version]

remove는 패키지만 삭제하고 config 파일은 남겨놓지만, purge는 config 파일까지 삭제한다. 설정이 꼬이거나 재설치를 해도 config가 남아 문제가 되는 경우가 있는데, 이 때문에 purge로 삭제하고 재설치하는 것을 권장한다. autoremove는 의존성이 깨지거나 버전 관리로 인해 쓰이지 않는 패키지를 자동제거해준다. 가끔 무언가를 설치할 때 autoremove를 하라는 메시지가 뜨기도 한다.

# apt -y install htop → htop을 일단 설치한다. -y는 [Y/n]를 묻지 않고 그대로 진행하라는 뜻이다.
# apt show htop → htop 정보를 출력한다.
# apt purge htop → htop을 제거한다

pcp 패키지를 검색하고 설치하는 실습을 하나 더 해보자.

# apt search -n '^pcp*' → 매우 긴 정보들이 나온다.

Sorting... Done
Full Text Search... Done
pcal/bionic 4.11.0-3build1 amd64
  generate Postscript calendars without X

pcalendar/bionic,bionic 3.4.1-2 all
  track menstrual cycles and predict fertility periods
(이하 생략)

# apt-cache pkgnames pcp
	→ 패키지 이름만 필요하므로 이 명령어를 써도 좋다. pcp로 시작하는 패키지명만 보인다

pcp-doc
pcp-manager
pcp-import-sar2pcp
pcp-gui
(이하 생략)

# apt install pcp -y

⑤ unmet dependency apt 설치 중 충족되지 않은 의존성 때문에 생기는 에러이다. 일반적으로 apt의 sources.list 설정에서 components에 universe를 빼먹는 경우가 있다. 커뮤니티에서 버전을 관리할 경우 universe를 빼먹으면 의존성 문제가 생길 수 있다. universe를 추가할 수도 있고, 본인이 가지고 있는 버전이 패키지에서 지원하는 버전보다 높을 경우 downgrade 할 수도 있다. downgrade 시 시스템에 설치 가능한 all-versions를 확인 후 같이 설치해야 한다.

# apt install curl libcurl3-gnutls=7.47.0-1ubuntu2
→ 조회한 결과를 가지고 내가 가진 버전보다 더 낮은 버전을 넣어준다

aptitude: TUI 방식의 apt

apt를 조금 더 보기 좋게 만든 것으로, ncurses 기반의 툴로서 apt-cache, apt-get 명령을 포함한다. 메뉴도 있고 기능도 많으나 쓰는 사람이 적다.

arrow_upward arrow_downward
loading