-i(install)와 -U(Upgrade)의 결정적 차이는 기존 버전 처리다. -i는 이미 설치돼 있으면 "already installed" 오류를 내며 멈추지만, -U는 기존 버전을 지우고 새 버전으로 교체한다. 게다가 -U는 설치된 적이 없어도 새로 설치한다. 그래서 실무에서는 -Uvh를 가장 많이 쓴다. -F(Freshen)는 한 발 더 나아가 이미 설치된 패키지만 갱신하고, 미설치 패키지는 건드리지 않는다.
조회(query)는 -q를 앞세운다. 여기서 헷갈리기 쉽다.
rpm -qa # 설치된 모든 패키지 목록(all)rpm -q httpd # 특정 패키지 설치 여부 + 버전rpm -qi httpd # 상세 정보(information)rpm -ql httpd # 그 패키지가 설치한 파일 목록(list)rpm -qf /usr/sbin/httpd # 이 파일이 어느 패키지 소속인지(file)rpm -qc httpd # 설정 파일만(config)rpm -V httpd # 설치 후 변조 여부 검증(Verify)
옵션
의미
자주 쓰는 형태
-i
install
rpm -ivh pkg.rpm
-U
Upgrade(없으면 설치)
rpm -Uvh pkg.rpm
-F
Freshen(설치된 것만)
rpm -Fvh pkg.rpm
-e
erase(삭제)
rpm -e pkg
-v -h
verbose + 진행막대(#)
설치 시 함께
-qa
전체 목록
rpm -qa | grep ...
-ql
패키지의 파일 목록
어디에 깔렸나
-qf
파일→패키지 역추적
rpm -qf /경로
rpm -qf(file→package)와 rpm -ql(package→files)는 정반대 방향의 조회다. "이 파일은 누가 깔았지?"는 -qf, "이 패키지는 뭘 깔았지?"는 -ql. 시험에서 이 둘을 바꿔치기한 보기는 오답이다. q(query)가 빠지면 안 된다는 점도 함정이다 — rpm -f는 존재하지 않는 조합이다.
⚠️ 함정: rpm -ivh로는 의존성을 자동 해결하지 못한다. A 패키지가 B를 요구하면 "Failed dependencies: B is needed" 오류를 내고 멈춘다. 강제로 무시하려면 --nodeps를 쓸 수 있지만 시스템이 깨질 수 있어 권장되지 않는다. 의존성 자동 해결이 바로 다음에 나오는 YUM/DNF의 존재 이유다.
# 직접 쳐보기 — rpm 조회 연습 (RHEL/CentOS 계열에서)rpm -qa | wc -l # 설치된 패키지 개수rpm -qa | grep kernel # 커널 관련 패키지rpm -qi bash # bash 패키지 상세rpm -ql coreutils | head # coreutils가 깐 파일들rpm -qf /bin/ls # ls는 어느 패키지 소속?
YUM(Yellowdog Updater Modified): rpm의 의존성 지옥(dependency hell)을 풀기 위해 등장했다. 후속이 DNF(Dandified YUM).
명령 체계가 거의 같아 yum을 dnf로 바꿔도 대부분 동작한다. RHEL 8부터 기본은 DNF이며 yum은 dnf의 심볼릭 링크다.
핵심 차이는 저장소(repository)에서 의존성까지 자동으로 끌어온다는 점. /etc/yum.repos.d/*.repo에 정의된 저장소 URL에서 필요한 패키지를 모두 내려받아 한꺼번에 설치한다.
yum install httpd # httpd + 필요한 모든 의존성 자동 설치yum remove httpd # 삭제(의존성 고려)yum update # 모든 패키지 업데이트yum update httpd # 특정 패키지만 업데이트yum search keyword # 이름·설명에서 검색yum info httpd # 패키지 정보yum list installed # 설치된 패키지 목록yum repolist # 활성 저장소 목록yum clean all # 캐시 정리yum groupinstall "Development Tools" # 패키지 그룹 설치
작업
RPM(저수준)
YUM/DNF(고수준)
설치
rpm -ivh pkg.rpm
yum install pkg
삭제
rpm -e pkg
yum remove pkg
업그레이드
rpm -Uvh pkg.rpm
yum update pkg
의존성
수동(오류만 표시)
자동 해결
패키지 출처
로컬 .rpm 파일
저장소(인터넷)
검색
불가(설치된 것만)
yum search
rpm install과 yum install의 입력이 다르다. rpm은 로컬 .rpm 파일 경로를 주지만, yum은 패키지 이름만 준다(yum install httpd, 파일명·경로 없음). yum이 저장소에서 알아서 찾아 받기 때문이다. 시험에서 "인터넷 저장소에서 의존성까지 자동 설치하는 명령"의 답은 항상 yum/dnf 쪽이다.
yum repolist는 현재 활성화된 저장소를 보여준다. 저장소는 /etc/yum.repos.d/ 아래 .repo 파일로 정의되며, 각 파일에는 [저장소ID], baseurl=, enabled=1, gpgcheck=1 같은 항목이 들어간다. gpgcheck=1이면 패키지의 GPG 서명을 검증해 변조·위조를 막는다. 사내망에서는 로컬 미러 저장소를 만들어 baseurl=file:///경로로 가리키기도 한다.
⚠️ 함정: yum remove로 어떤 패키지를 지우면 그것에 의존하던 다른 패키지도 함께 제거될 수 있다. 무심코 핵심 라이브러리를 지우면 시스템이 마비된다. 삭제 전 yum이 보여주는 "Removing" 목록을 반드시 확인해야 한다. 또 yum update(전체)와 yum update 패키지(개별)를 혼동하면 안 된다.
# 직접 쳐보기 — yum/dnfyum repolist # 어떤 저장소가 켜져 있나yum list installed | head # 설치 패키지 일부yum info bash # bash 패키지 정보yum search editor # 'editor'가 들어간 패키지 검색# dnf로도 동일하게 동작dnf repolist
Debian 계열(Debian·Ubuntu·Mint)의 패키지는 .deb 확장자를 갖는다.
이를 직접 다루는 저수준 도구가 dpkg — Red Hat 계열의 rpm에 대응한다.
.deb 파일명도 정보를 담는다.
# nginx_1.18.0-6_amd64.deb# └이름 └버전 └아키텍처
dpkg -i nginx_1.18.0-6_amd64.deb # 설치(install)dpkg -r nginx # 삭제(remove) — 설정 파일은 남김dpkg -P nginx # 완전 삭제(Purge) — 설정까지 제거dpkg -l # 설치된 패키지 목록(list)dpkg -l nginx # 특정 패키지 상태dpkg -L nginx # 그 패키지가 설치한 파일 목록(List files)dpkg -S /usr/sbin/nginx # 이 파일이 어느 패키지 소속인지(Search)dpkg -s nginx # 패키지 상태·정보(status)
작업
RPM 명령
dpkg 명령
설치
rpm -ivh pkg.rpm
dpkg -i pkg.deb
삭제(설정 유지)
rpm -e pkg
dpkg -r pkg
완전 삭제
(해당 없음)
dpkg -P pkg
전체 목록
rpm -qa
dpkg -l
패키지의 파일
rpm -ql pkg
dpkg -L pkg
파일→패키지
rpm -qf 파일
dpkg -S 파일
dpkg에서 -r(remove)과 -P(Purge)의 차이가 있다. -r은 프로그램 파일만 지우고 설정 파일(/etc 아래)은 남긴다 — 나중에 재설치할 때 설정을 보존하기 위함이다. -P(Purge)는 설정 파일까지 완전히 제거한다. RPM에는 이 구분이 없다(rpm -e는 설정도 함께 제거).
대소문자에 주의해야 한다. dpkg -l(소문자 L)은 설치 목록, dpkg -L(대문자 L)은 특정 패키지가 깐 파일 목록이다. rpm에서 -ql과 -qa가 갈리는 지점이 dpkg에서는 -L과 -l의 대소문자로 갈린다. 시험에서 이 대소문자를 바꾼 오답이 있다.
dpkg -i도 rpm -ivh처럼 의존성을 자동 해결하지 못한다. 의존성이 빠지면 패키지가 "설치됐지만 설정 안 됨" 상태로 남는다. 이때 apt-get install -f(fix-broken)로 의존성을 메우거나, 처음부터 apt를 쓰는 것이 정석이다.
APT(Advanced Package Tool)는 YUM/DNF에 대응하는 고수준 도구로, 저장소에서 의존성까지 자동으로 끌어온다.
과거 apt-get/apt-cache로 나뉘어 있던 것을 통합한 apt 명령이 현재 표준이다.
apt update # 저장소 패키지 목록 갱신(설치 아님!)apt upgrade # 설치된 패키지 업그레이드apt install nginx # 설치(의존성 자동)apt remove nginx # 삭제(설정 유지)apt purge nginx # 완전 삭제(설정까지)apt search keyword # 검색apt show nginx # 패키지 정보apt list --installed # 설치 목록apt autoremove # 더 이상 필요 없는 의존성 정리
apt update와 apt upgrade를 혼동하면 안 된다. apt update는 패키지를 설치·갱신하지 않는다. 저장소에서 "어떤 패키지의 어떤 버전이 있는지" 목록(인덱스)만 갱신한다. 실제 업그레이드는 apt upgrade가 한다. 그래서 항상 apt update && apt upgrade 순서로 쓴다. YUM의 yum update는 이 두 단계를 한 번에 하는 점이 다르다.
작업
YUM/DNF
APT
저장소 목록 갱신
(자동)
apt update
업그레이드
yum update
apt upgrade
설치
yum install pkg
apt install pkg
삭제
yum remove pkg
apt remove pkg
검색
yum search
apt search
정보
yum info
apt show
APT의 저장소 정의는 /etc/apt/sources.list와 /etc/apt/sources.list.d/*.list에 들어 있고, 각 줄은 deb URL 배포판 컴포넌트 형식이다. apt update는 이 목록의 URL에서 인덱스(Packages.gz)를 받아 로컬 캐시(/var/lib/apt/lists/)에 저장한다. 그래서 update를 안 하면 apt는 옛 인덱스만 보고 "최신 버전 없음"이라 잘못 판단한다.
RPM과 DEB는 1990년대 중반 거의 동시에 등장했다. 둘 다 초기엔 "의존성 지옥"으로 악명 높았다 — A를 깔려면 B가, B를 깔려면 C가 필요한데 사용자가 일일이 손으로 받아야 했다. Debian이 1998년 APT로 먼저 자동 의존성 해결을 선보였고, Red Hat 진영은 yum(2003년경 Fedora 채택)으로 따라잡았다. 오늘날 두 계열의 명령이 데칼코마니처럼 대응하는 것은 결국 같은 문제(의존성·저장소·검증)를 각자 풀어낸 결과다. 이 대응 구조를 표로 외워두면 시험의 절반은 자동으로 맞힌다.