패키지 = 실행 파일 + 설정 파일 + 문서 + 설치 정보(의존성 목록)
예전에는 소스를 내려받아 직접 컴파일해야 했다. 그 과정을 미리 해 두고 묶어서 배포 하는 것이 패키지다.
의존성(dependency) — 어떤 프로그램이 동작하려면 다른 라이브러리가 먼저 있어야 한다. 이 관계를 패키지가 기록해 둔다.
문제 뜻 의존성 문제 필요한 다른 패키지가 없어 설치가 막히는 상황 의존성 지옥 A를 깔려면 B, B를 깔려면 C… 가 끝없이 이어지는 상황
구분 RPM 계열 DEB 계열 확장자 .rpm.deb배포판 레드햇, CentOS, 페도라, SUSE 데비안, 우분투, 민트 저수준 도구 rpmdpkg고수준 도구 yum, dnfapt, apt-get
어느 배포판이 어느 계열인지 를 그대로 묻는 문제가 나온다. 우분투는 데비안 계열 이라 .deb을 쓴다는 점이 출제 범위에 든다.
RPM은 원래 Red Hat Package Manager 의 줄임말이었고, 지금은 RPM Package Manager로 풀이한다.
고수준 (yum · dnf · apt)
│ 저장소에서 내려받고 의존성을 자동으로 풀어 준다
▼
저수준 (rpm · dpkg)
│ 주어진 파일 하나를 설치·삭제할 뿐
▼
시스템
구분 저수준 고수준 다루는 것 파일 하나 저장소(repository) 의존성 스스로 해결하지 못한다 자동으로 해결한다 예 rpm, dpkgyum, dnf, apt
이 구분이 이 단원의 핵심 이다. "의존성을 자동으로 해결해 주는 도구는?"이라고 물으면 답은 고수준 도구(yum·apt) 다.
rpm -ivh 패키지.rpm # 설치 (install, verbose, hash)
rpm -Uvh 패키지.rpm # 업그레이드 (없으면 설치)
rpm -e 패키지명 # 삭제 (erase)
rpm -qa # 설치된 패키지 전부 (query all)
rpm -q 패키지명 # 그 패키지가 깔려 있나
rpm -ql 패키지명 # 그 패키지가 설치한 파일 목록 (list)
rpm -qi 패키지명 # 패키지 정보 (info)
rpm -qf /경로/파일 # 이 파일이 어느 패키지 것인가 (file)
rpm -V 패키지명 # 변조 검증 (verify)
옵션 뜻 -i설치 (install)-U업그레이드 — 없으면 설치까지-F업그레이드 — 이미 있을 때만 (freshen) -e삭제 (erase)-q질의 (query)-v / -h자세히 / 진행 표시(#) --nodeps의존성 무시하고 강행
-i와 -U의 차이 — -U는 없으면 새로 설치하지만 -F는 이미 있을 때만 갱신한다.
rpm은 의존성을 해결해 주지 않는다. 필요한 패키지가 없으면 오류를 내고 멈춘다.
-v와 -h는 보여 주는 방식 일 뿐 동작을 바꾸지 않는다. -ivh·-Uvh처럼 세 글자를 묶어 쓰는 것이 관례다.
커널 패키지는 -U가 아니라 -i로 설치하는 것이 관례다. -U는 옛 버전을 지우므로, 새 커널이 부팅되지 않을 때 돌아갈 옛 커널이 사라진다.
# rpm -ivh httpd-2.4.6-97.el7.x86_64.rpm
error: Failed dependencies:
httpd-tools = 2.4.6-97.el7 is needed by httpd-2.4.6-97.el7.x86_64
/etc/mime.types is needed by httpd-2.4.6-97.el7.x86_64
rpm은 무엇이 모자란지 알려 주기만 하고 가져오지는 않는다. 위에서는 httpd-tools 패키지와 /etc/mime.types 파일을 가진 패키지가 먼저 있어야 한다.
지울 때도 똑같이 막힌다. 다른 패키지가 기대고 있는 것을 rpm -e로 지우려 하면 is needed by (installed) … 오류가 난다.
대처 명령 평가 모자란 패키지를 먼저 설치 rpm -ivh httpd-tools-….rpm정석이지만 그 패키지가 또 다른 것을 요구할 수 있다 고수준 도구에 맡김 yum install httpd권장 — 필요한 것을 저장소에서 함께 받아 온다무시하고 강행 rpm -ivh --nodeps 파일.rpm설치는 되지만 실행이 안 될 수 있다
강제 옵션 뜻 --nodeps의존성 검사를 건너뛴다 (설치·삭제 모두)--force이미 설치된 패키지나 파일이 있어도 덮어써서 설치 --test실제로 설치하지 않고 문제가 없는지만 점검
# rpm -q httpd
httpd-2.4.6-97.el7.x86_64
# rpm -e httpd-2.4.6-97.el7.x86_64.rpm
error: package httpd-2.4.6-97.el7.x86_64.rpm is not installed
# rpm -e httpd
# rpm -q httpd
package httpd is not installed
작업 인자로 주는 것 이유 설치 -i · 업그레이드 -U -F 패키지 파일 (….rpm)아직 시스템에 없으니 파일을 건네야 한다 삭제 -e · 질의 -q · 검증 -V 패키지 이름 (httpd)이미 설치되어 RPM 데이터베이스에 등록된 것을 가리킨다 질의 -qp 패키지 파일 설치하기 전 의 파일을 들여다본다
설치된 패키지 정보는 RPM 데이터베이스(/var/lib/rpm) 에 기록된다. rpm -q 계열은 이 데이터베이스를 읽는다.
rpm -e는 성공하면 아무것도 출력하지 않는다. 조용하면 된 것이다.
옵션 묻는 것 인자 -qa설치된 패키지 전부 (all) 없음 -qi패키지 정보 — 버전·설명·설치 시각 (info) 패키지 이름 -ql그 패키지가 설치한 파일 목록 (list) 패키지 이름 -qc그중 설정 파일만 (config) 패키지 이름 -qd그중 문서 파일만 (doc) 패키지 이름 -qf이 파일이 속한 패키지 (file) 파일 경로 -qR그 패키지가 필요로 하는 것 (requires) 패키지 이름 -qp설치 전 파일 을 대상으로 — -qpi, -qpl로 조합.rpm 파일
# rpm -qa | grep httpd
httpd-2.4.6-97.el7.x86_64
httpd-tools-2.4.6-97.el7.x86_64
# rpm -qf /etc/httpd/conf/httpd.conf
httpd-2.4.6-97.el7.x86_64
-ql과 -qf는 방향이 반대 다. -ql은 패키지 → 파일들 , -qf는 파일 → 패키지 다. 보기에 둘을 나란히 놓고 묻는다.
-qa는 수백 줄이 나오므로 보통 grep으로 걸러 본다. -q만 쓰면 이름을 정확히 알아야 하지만 -qa | grep은 이름의 일부만으로 찾는다.
# rpm -V httpd
S.5....T. c /etc/httpd/conf/httpd.conf
설치할 때 기록해 둔 값과 지금 파일을 비교 한다. 아무것도 출력되지 않으면 바뀐 것이 없다 는 뜻이다.
글자가 나온 자리가 달라진 항목이다 — S 크기, 5 내용(해시값), T 수정 시각 , M 권한, U 소유자, G 그룹. 점(.)은 그대로라는 표시다.
가운데 c는 그 파일이 설정 파일 이라는 뜻이다. 설정 파일은 관리자가 고치는 것이 정상이라 위 결과는 문제가 아니다. 실행 파일에서 5가 뜨면 의심해야 한다.
httpd - 2.4.6 - 97 . el7 . x86_64 . rpm
│ │ │ │ │ │
│ │ │ │ │ └── 확장자
│ │ │ │ └───────── 아키텍처 (x86_64, i386, noarch)
│ │ │ └──────────────── 배포판 (el7 = RHEL 7)
│ │ └────────────────────── 릴리스 번호
│ └───────────────────────────── 버전
└───────────────────────────────────── 패키지 이름
이름-버전-릴리스.아키텍처.rpm 구조를 그대로 묻는다.
noarch 는 CPU 구조와 무관한 패키지(문서, 스크립트)를 뜻한다.
버전은 프로그램 자체의 판 번호 , 릴리스는 같은 버전을 배포판이 몇 번째로 다시 묶었는가 다. 프로그램은 그대로인데 보안 패치만 넣어 다시 내면 릴리스만 오른다.
이름에 하이픈이 들어간 패키지도 있다. httpd-tools-2.4.6-97.el7.x86_64.rpm 은 오른쪽부터 읽는다 — 아키텍처, 릴리스(97.el7), 버전(2.4.6)을 떼고 남은 httpd-tools가 이름이다.
아키텍처 자리 뜻 x86_6464비트 인텔·AMD i386 · i68632비트 인텔 계열 noarch아키텍처와 무관 src컴파일 전의 소스 패키지 (.src.rpm)
yum install httpd # 설치 (의존성 자동)
yum remove httpd # 삭제
yum update # 전체 업데이트
yum update httpd # 특정 패키지만
yum list installed # 설치된 목록
yum search 키워드 # 검색
yum info httpd # 정보
yum repolist # 저장소 목록
yum clean all # 캐시 정리
저장소(repository) 에서 필요한 것을 알아서 내려받고 의존 패키지까지 함께 설치 한다.
저장소 설정은 /etc/yum.repos.d/ 아래의 .repo 파일에 있다.
# /etc/yum.repos.d/CentOS-Base.repo
[base]
name=CentOS-$releasever - Base
baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
항목 뜻 [base]저장소 ID . 대괄호 한 덩어리가 저장소 하나다name사람이 읽는 설명 baseurl패키지를 받아 올 저장소 주소 enabled1이면 사용, 0이면 끔 gpgcheck1이면 패키지의 서명을 검사 한다 gpgkey검사에 쓸 공개 키의 위치
위치 역할 /etc/yum.confYUM 전체 설정 /etc/yum.repos.d/*.repo저장소별 설정/var/cache/yum내려받은 목록과 패키지의 캐시 — yum clean all이 비운다 /var/log/yum.log설치·삭제 기록
파일 이름이 .repo로 끝나야 읽힌다. 저장소를 잠시 끄려면 파일을 지울 필요 없이 enabled=0으로 바꾼다.
명령 하는 일 yum check-update업데이트할 것이 있는지 확인만 한다 yum localinstall 파일.rpm내려받아 둔 파일 을 설치하되 의존성은 저장소에서 채운다yum provides /경로/파일그 파일을 제공하는 패키지 찾기 yum grouplist · groupinstall패키지 묶음(그룹) 보기 · 설치 yum eraseremove와 같다yum history지금까지의 작업 이력 yum -y install httpd묻는 말에 모두 yes — 확인 없이 진행
하는 일 rpmyum설치 rpm -ivh 파일.rpmyum install 이름업그레이드 rpm -Uvh 파일.rpmyum update 이름삭제 rpm -e 이름yum remove 이름설치 목록 rpm -qayum list installed정보 rpm -qi 이름yum info 이름파일의 소속 rpm -qf 파일yum provides 파일의존성 직접 챙긴다 자동 재료를 얻는 곳 내가 건넨 파일 저장소
rpm은 옵션(하이픈+글자), yum은 영어 단어 로 일을 시킨다. 보기에서 yum -i나 rpm install 같은 섞인 표기는 틀린 것이다.
yum도 결국 내부에서 RPM 패키지를 설치한다. 그래서 yum으로 설치한 것이 rpm -qa에 그대로 보인다. 둘은 경쟁자가 아니라 위아래 층 이다.
도구 쓰는 곳 yumCentOS 7, RHEL 7 이하 dnfYUM의 후계 — 페도라, RHEL 8 이상zypperSUSE 계열
dnf는 명령 구조가 yum과 거의 같다. dnf install처럼 쓴다.
SUSE는 RPM 계열이지만 도구가 zypper 라는 점이 함정으로 나온다.
DNF는 Dandified YUM 의 줄임말이다. RHEL 8 이상에서도 yum 명령은 남아 있지만 실제로는 dnf를 부르는 이름 일 뿐이다.
zypper도 쓰는 법이 닮았다 — zypper install, zypper remove, zypper update.
증상 원인 확인·대처 Failed dependencies 로 설치가 멈춤저수준 도구는 의존성을 풀지 못한다 yum install로 설치rpm -e 파일.rpm 이 is not installed삭제는 패키지 이름 으로 한다 rpm -e httpdrpm -q가 is not installed 인데 분명 깔았다이름이 정확하지 않다 rpm -qa를 grep으로 걸러 본다yum install이 패키지를 못 찾음그 패키지를 가진 저장소가 없거나 꺼져 있다 yum repolist, .repo의 enabled설정 파일을 고쳤는지 알고 싶다 — rpm -V 패키지명
내일은 데비안 계열의 dpkg·apt, 그리고 소스를 직접 컴파일하는 방법을 다룬다.
패키지 : 프로그램 파일과 설치 정보를 하나로 묶은 배포 단위.
의존성 : 어떤 패키지가 동작하기 위해 필요한 다른 패키지와의 관계.
RPM 계열 : .rpm을 쓰는 배포판 계열. 레드햇, CentOS, 페도라, SUSE.
저수준 도구 : 패키지 파일 하나를 다루며 의존성을 해결하지 않는 도구. rpm, dpkg.
고수준 도구 : 저장소를 이용해 의존성까지 자동 해결하는 도구. yum, dnf, apt.
저장소(repository) : 패키지를 모아 둔 서버. /etc/yum.repos.d/에 설정한다.
dnf : YUM을 대체한 차세대 패키지 관리 도구.
zypper : SUSE 계열에서 사용하는 고수준 패키지 관리 도구.
📝 연습 문제 선택지를 클릭하면 정답·해설이 펼쳐집니다.
다음 중 .rpm 패키지 형식을 사용하는 배포판으로 알맞은 것은?
다음 중 rpm 명령에서 패키지를 삭제할 때 사용하는 옵션으로 알맞은 것은?
다음 중 의존성 문제를 자동으로 해결하며 저장소에서 패키지를 내려받아 설치하는 도구로 알맞은 것은?
다음 중 httpd-2.4.6-97.el7.x86_64.rpm에서 x86_64가 나타내는 것으로 알맞은 것은?
A 패키지 버전 B 릴리스 번호 C 아키텍처 D 배포판 이름 다음 중 SUSE 리눅스에서 사용하는 고수준 패키지 관리 도구로 알맞은 것은?