1. 패키지 관리 개념
리눅스에서 소프트웨어를 설치, 업데이트, 제거하는 체계적인 방법. 배포판마다 패키지 관리 도구가 다르므로 주요 계열별로 알아둘 필요가 있다.
소스 설치 vs 패키지 설치
| 구분 | 소스 설치 | 패키지 설치 |
|---|---|---|
| 방법 | 소스코드 다운로드 → 컴파일 → 설치 | 패키지 관리자로 바이너리 설치 |
| 의존성 | 수동 해결 | 자동 해결 |
| 업데이트 | 수동 재컴파일 | apt upgrade / dnf update 등 |
| 제거 | make uninstall (없을 수도 있음) | 깔끔한 제거 보장 |
| 장점 | 최신 버전, 컴파일 옵션 커스터마이징 | 간편, 안전, 의존성 자동 관리 |
| 단점 | 번거롭고 시간 소요 | 버전이 다소 오래될 수 있음 |
의존성 관리
패키지 A가 동작하려면 패키지 B, C가 필요한 관계. 의존성 지옥(dependency hell)은 패키지 관리자가 해결해주는 가장 큰 문제.
nginx → libssl, libpcre, zlib, ...
└→ 각각도 자신만의 의존성을 가짐
2. Debian/Ubuntu 계열
2.1 dpkg - 저수준 패키지 관리
.deb 파일을 직접 다루는 도구. 의존성을 자동 해결하지 않는다.
# 설치
dpkg -i package.deb # .deb 파일 설치 (의존성 미해결)
dpkg -i *.deb # 여러 .deb 한번에 설치
# 제거
dpkg -r package_name # 제거 (설정 파일 유지)
dpkg -P package_name # 완전 제거 (purge - 설정 파일도 삭제)
# 조회
dpkg -l # 설치된 모든 패키지 목록
dpkg -l | grep nginx # 특정 패키지 검색
dpkg -l 'nginx*' # 패턴으로 검색
dpkg -s package_name # 패키지 상세 정보 (status)
dpkg -L package_name # 패키지가 설치한 파일 목록
dpkg -S /usr/bin/curl # 특정 파일이 어떤 패키지에 속하는지
# 의존성 문제 발생 시 복구
sudo apt --fix-broken install # dpkg 설치 후 의존성 문제 해결dpkg 상태 코드 (dpkg -l 출력의 첫 두 글자):
ii- 정상 설치됨rc- 제거됨 (설정 파일 잔존)un- 알 수 없음 / 미설치hi- 반강제 설치됨
2.2 apt / apt-get - 고수준 패키지 관리
dpkg 위에 구축된 도구. 의존성을 자동 해결하고, 원격 저장소에서 패키지를 다운로드한다.
apt는 apt-get의 현대적 대체판으로, 더 나은 UI와 진행바를 제공한다. 스크립트에서는 apt-get이 더 안정적.
# 저장소 정보 갱신 (설치 전 반드시 실행)
sudo apt update # 패키지 목록 최신화 (패키지 자체는 설치/업그레이드 안 함)
# 패키지 설치
sudo apt install nginx # 설치 (의존성 자동 해결)
sudo apt install nginx=1.18.0-0ubuntu1 # 특정 버전 설치
sudo apt install -y nginx # 확인 없이 설치
# 패키지 제거
sudo apt remove nginx # 제거 (설정 파일 유지)
sudo apt purge nginx # 완전 제거 (설정 파일도 삭제)
sudo apt autoremove # 더 이상 필요 없는 의존 패키지 제거
# 업그레이드
sudo apt upgrade # 설치된 패키지 업그레이드 (제거 없음, 안전)
sudo apt full-upgrade # 업그레이드 (필요시 패키지 제거 포함)
# apt-get에서는:
sudo apt-get dist-upgrade # full-upgrade에 해당
# 검색 및 정보
apt search nginx # 패키지 검색 (이름+설명)
apt show nginx # 패키지 상세 정보
apt list --installed # 설치된 패키지 목록
apt list --upgradable # 업그레이드 가능한 패키지2.3 apt-cache
apt-cache search nginx # 패키지 검색
apt-cache show nginx # 상세 정보
apt-cache showpkg nginx # 의존성 관계 표시
apt-cache depends nginx # 의존하는 패키지
apt-cache rdepends nginx # 이 패키지에 의존하는 패키지 (역의존성)
apt-cache policy nginx # 설치 가능한 버전 및 저장소 정보2.4 /etc/apt/sources.list
패키지를 가져올 원격 저장소(repository) 목록.
cat /etc/apt/sources.list
ls /etc/apt/sources.list.d/ # 추가 저장소 파일들# 형식: deb [옵션] URI 배포판코드명 컴포넌트
deb http://archive.ubuntu.com/ubuntu/ jammy main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ jammy-updates main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu/ jammy main # 소스 패키지 (deb-src)
| 컴포넌트 | 설명 |
|---|---|
main | 공식 지원, 오픈소스 |
restricted | 공식 지원, 비자유(독점 드라이버 등) |
universe | 커뮤니티 유지, 오픈소스 |
multiverse | 비자유, 제한적 지원 |
2.5 PPA (Personal Package Archives)
Ubuntu에서 서드파티 저장소를 쉽게 추가하는 방법.
# PPA 추가
sudo add-apt-repository ppa:ondrej/php
sudo apt update
sudo apt install php8.2
# PPA 제거
sudo add-apt-repository --remove ppa:ondrej/php
# 또는 /etc/apt/sources.list.d/ 에서 해당 파일 삭제3. RHEL/CentOS/Fedora 계열
3.1 rpm - 저수준 패키지 관리
.rpm 파일을 직접 다루는 도구. dpkg와 마찬가지로 의존성을 자동 해결하지 않는다.
# 설치
rpm -ivh package.rpm # 설치 (i=install, v=verbose, h=hash progress)
rpm -Uvh package.rpm # 업그레이드 (없으면 설치)
rpm -Fvh package.rpm # 업그레이드만 (없으면 설치 안 함)
# 제거
rpm -e package_name # 제거 (erase)
rpm -e --nodeps package_name # 의존성 무시하고 제거 (위험!)
# 조회
rpm -qa # 설치된 모든 패키지 (query all)
rpm -qa | grep nginx # 패턴 검색
rpm -qi package_name # 패키지 상세 정보 (query info)
rpm -ql package_name # 패키지가 설치한 파일 목록 (query list)
rpm -qf /usr/bin/curl # 특정 파일이 속한 패키지 (query file)
rpm -qc package_name # 설정 파일 목록 (query config)
rpm -qd package_name # 문서 파일 목록 (query docs)
rpm -qR package_name # 의존성 목록 (requires)
# 미설치 .rpm 파일 조회 (p 옵션 추가)
rpm -qip package.rpm # .rpm 파일의 정보
rpm -qlp package.rpm # .rpm 파일에 포함된 파일 목록
# 검증
rpm -V package_name # 설치 후 변경된 파일 확인 (verify)
rpm -Va # 모든 패키지 검증rpm -V 출력 코드:
S- 크기 변경,M- 모드(퍼미션) 변경,5- MD5 체크섬 변경D- 디바이스,L- 링크,U- 소유자,G- 그룹,T- 수정 시간
3.2 yum / dnf - 고수준 패키지 관리
yum은 RHEL/CentOS 7까지, dnf은 RHEL/CentOS 8+ 및 Fedora의 기본 패키지 관리자. dnf는 yum의 차세대 버전으로 명령어가 거의 동일하다.
# 패키지 설치
sudo yum install nginx
sudo dnf install nginx
sudo dnf install -y nginx # 확인 없이
# 패키지 제거
sudo dnf remove nginx
sudo dnf autoremove # 불필요한 의존 패키지 제거
# 업데이트
sudo dnf check-update # 업데이트 가능 목록 확인
sudo dnf update # 모든 패키지 업데이트
sudo dnf update nginx # 특정 패키지만 업데이트
sudo dnf upgrade # update와 동일 (dnf에서는 동의어)
# 검색 및 정보
dnf search nginx # 패키지 검색
dnf info nginx # 상세 정보
dnf list installed # 설치된 패키지
dnf list available # 설치 가능한 패키지
dnf provides /usr/bin/curl # 파일을 제공하는 패키지 검색
# 그룹 설치 (개발 도구 등을 한 번에)
dnf grouplist # 가용한 그룹 목록
dnf groupinstall "Development Tools"
dnf groupremove "Development Tools"
# 이력 관리
dnf history # 설치/제거 이력
dnf history info 15 # 특정 트랜잭션 상세
dnf history undo 15 # 특정 트랜잭션 되돌리기
# 캐시 관리
dnf clean all # 캐시 전부 삭제
dnf makecache # 캐시 재생성3.3 /etc/yum.repos.d/
저장소 설정 파일 디렉토리. 각 .repo 파일이 하나의 저장소를 정의한다.
ls /etc/yum.repos.d/
cat /etc/yum.repos.d/CentOS-Base.repo# /etc/yum.repos.d/example.repo
[base]
name=CentOS-$releasever - Base
baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
enabled=1| 필드 | 설명 |
|---|---|
[base] | 저장소 ID (고유해야 함) |
name | 저장소 설명 |
baseurl | 저장소 URL (또는 mirrorlist) |
gpgcheck | GPG 서명 검증 여부 (1=활성화) |
gpgkey | GPG 공개키 경로 |
enabled | 저장소 활성화 여부 (0=비활성화) |
# 저장소 관리
dnf repolist # 활성화된 저장소 목록
dnf repolist all # 전체 저장소 (비활성 포함)
dnf config-manager --add-repo URL # 저장소 추가
dnf config-manager --set-enabled repo_id # 활성화
dnf config-manager --set-disabled repo_id # 비활성화EPEL (Extra Packages for Enterprise Linux)
RHEL 계열에서 추가 패키지를 제공하는 대표적 서드파티 저장소.
sudo dnf install epel-release4. Debian vs RHEL 계열 비교 요약
| 작업 | Debian/Ubuntu | RHEL/CentOS/Fedora |
|---|---|---|
| 패키지 형식 | .deb | .rpm |
| 저수준 도구 | dpkg | rpm |
| 고수준 도구 | apt / apt-get | yum / dnf |
| 저장소 목록 갱신 | apt update | dnf check-update |
| 패키지 설치 | apt install pkg | dnf install pkg |
| 패키지 제거 | apt remove pkg | dnf remove pkg |
| 완전 제거 | apt purge pkg | dnf remove pkg (설정도 삭제됨) |
| 전체 업그레이드 | apt upgrade | dnf update |
| 패키지 검색 | apt search name | dnf search name |
| 패키지 정보 | apt show pkg | dnf info pkg |
| 파일→패키지 | dpkg -S /path | rpm -qf /path |
| 패키지→파일 | dpkg -L pkg | rpm -ql pkg |
| 저장소 설정 | /etc/apt/sources.list | /etc/yum.repos.d/*.repo |
5. 소스 컴파일 설치
패키지 저장소에 없거나 최신 버전이 필요할 때 소스코드에서 직접 빌드한다.
전통적 방법: configure → make → make install
# 1. 빌드 도구 설치
# Debian/Ubuntu:
sudo apt install build-essential # gcc, g++, make 등
# RHEL/CentOS:
sudo dnf groupinstall "Development Tools"
# 2. 소스 다운로드 및 압축 해제
wget https://example.com/software-1.0.tar.gz
tar xzf software-1.0.tar.gz
cd software-1.0
# 3. 설정 (configure)
./configure # 기본 설정
./configure --prefix=/usr/local # 설치 경로 지정
./configure --help # 사용 가능한 옵션 확인
./configure --enable-ssl --with-pcre # 기능 활성화/의존성 경로 지정configure가 하는 일:
- 시스템 환경 검사 (컴파일러, 라이브러리 존재 여부)
- 의존성 확인 (없으면 에러 메시지와 함께 중단)
Makefile생성
# 4. 컴파일
make # Makefile에 따라 소스 컴파일
make -j$(nproc) # CPU 코어 수만큼 병렬 컴파일 (빠름)
# 5. 설치
sudo make install # 바이너리를 시스템에 복사 (/usr/local/bin 등)
# 6. 제거 (가능한 경우)
sudo make uninstall # Makefile에 uninstall 타겟이 있어야 함cmake 기초
configure 대신 크로스 플랫폼 빌드 시스템인 CMake를 사용하는 프로젝트도 많다.
# 빌드 도구 설치
sudo apt install cmake
# 전형적인 cmake 빌드 절차
git clone https://github.com/example/project.git
cd project
mkdir build && cd build # out-of-source 빌드 (소스 디렉토리 깔끔 유지)
cmake .. # CMakeLists.txt 기반으로 빌드 설정
cmake -DCMAKE_INSTALL_PREFIX=/usr/local .. # 설치 경로 지정
cmake -DCMAKE_BUILD_TYPE=Release .. # 릴리스 빌드
make -j$(nproc) # 컴파일
sudo make install # 설치checkinstall - 소스 설치를 패키지로 관리
소스 컴파일 설치의 단점(제거 어려움)을 보완. make install 대신 사용하면 .deb 또는 .rpm 패키지를 생성해준다.
sudo apt install checkinstall
# make install 대신:
sudo checkinstall # .deb 패키지 생성 및 설치
# 이후 dpkg -r 로 깔끔하게 제거 가능6. snap, flatpak 개요
전통적 패키지 관리의 한계(배포판 의존성, 라이브러리 충돌)를 해결하기 위한 범용 패키지 형식.
snap (Canonical/Ubuntu)
모든 의존성을 패키지 안에 포함(sandboxed). Ubuntu에 기본 탑재.
# 기본 명령어
snap find package # 검색
sudo snap install package # 설치
sudo snap remove package # 제거
snap list # 설치된 snap 목록
sudo snap refresh # 모든 snap 업데이트
sudo snap refresh package # 특정 snap 업데이트
snap info package # 상세 정보
# 채널 선택 (stable, candidate, beta, edge)
sudo snap install package --channel=beta
sudo snap install package --classic # classic confinement (전체 시스템 접근)특징:
- 자동 업데이트
- 격리된 환경 (sandboxing)
/snap/디렉토리에 설치- 배포판 독립적
flatpak (Red Hat 주도)
snap과 유사한 컨셉. Fedora에 기본 탑재, 다른 배포판에서도 사용 가능.
# 설치 (배포판에 따라)
sudo apt install flatpak # Debian/Ubuntu
# Flathub 저장소 추가
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
# 기본 명령어
flatpak search package # 검색
flatpak install flathub org.mozilla.firefox # 설치
flatpak uninstall org.mozilla.firefox # 제거
flatpak list # 설치 목록
flatpak update # 업데이트
flatpak run org.mozilla.firefox # 실행비교
| 구분 | apt/dnf | snap | flatpak |
|---|---|---|---|
| 의존성 | 시스템 공유 | 자체 포함 | 런타임 공유 |
| 격리 | 없음 | AppArmor | Bubblewrap |
| 저장소 | 배포판별 | Snap Store | Flathub |
| 디스크 사용 | 적음 | 많음 | 중간 |
| 업데이트 | 수동 | 자동 | 수동/자동 |
| 용도 | 서버/데스크톱 전반 | 데스크톱 앱 위주 | 데스크톱 앱 위주 |
7. 패키지 검증
GPG 서명 검증
패키지가 신뢰할 수 있는 출처에서 왔는지 디지털 서명으로 확인한다.
# Debian/Ubuntu: 저장소 키 관리
apt-key list # 등록된 키 목록 (deprecated)
# 현대적 방법:
curl -fsSL https://example.com/key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/example.gpg
# sources.list에 signed-by 옵션 추가:
# deb [signed-by=/etc/apt/keyrings/example.gpg] https://repo.example.com/ stable main
# RHEL: RPM 패키지 서명 검증
rpm --import https://example.com/RPM-GPG-KEY # GPG 키 가져오기
rpm -K package.rpm # 패키지 서명 검증
rpm -qa gpg-pubkey* # 등록된 GPG 키 목록체크섬 검증
다운로드한 파일의 무결성을 해시값으로 확인한다.
# MD5 (보안 취약 - 참고용)
md5sum file.iso
md5sum -c checksums.md5 # 체크섬 파일로 일괄 검증
# SHA-256 (권장)
sha256sum file.iso
sha256sum -c SHA256SUMS # 체크섬 파일로 일괄 검증
# 다운로드 후 검증 예시
wget https://example.com/package.tar.gz
wget https://example.com/package.tar.gz.sha256
sha256sum -c package.tar.gz.sha256
# package.tar.gz: OK