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 위에 구축된 도구. 의존성을 자동 해결하고, 원격 저장소에서 패키지를 다운로드한다.

aptapt-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의 기본 패키지 관리자. dnfyum의 차세대 버전으로 명령어가 거의 동일하다.

# 패키지 설치
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)
gpgcheckGPG 서명 검증 여부 (1=활성화)
gpgkeyGPG 공개키 경로
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-release

4. Debian vs RHEL 계열 비교 요약

작업Debian/UbuntuRHEL/CentOS/Fedora
패키지 형식.deb.rpm
저수준 도구dpkgrpm
고수준 도구apt / apt-getyum / dnf
저장소 목록 갱신apt updatednf check-update
패키지 설치apt install pkgdnf install pkg
패키지 제거apt remove pkgdnf remove pkg
완전 제거apt purge pkgdnf remove pkg (설정도 삭제됨)
전체 업그레이드apt upgradednf update
패키지 검색apt search namednf search name
패키지 정보apt show pkgdnf info pkg
파일→패키지dpkg -S /pathrpm -qf /path
패키지→파일dpkg -L pkgrpm -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/dnfsnapflatpak
의존성시스템 공유자체 포함런타임 공유
격리없음AppArmorBubblewrap
저장소배포판별Snap StoreFlathub
디스크 사용적음많음중간
업데이트수동자동수동/자동
용도서버/데스크톱 전반데스크톱 앱 위주데스크톱 앱 위주

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