Red Hat Certified System Administrator (RHCSA) #8 패키지와 repository: dnf, modules, AppStream

9 분 소요

#7 파일 시스템까지로 스토리지와 마운트를 마쳤습니다. 시스템을 운영하려면 그 위에 소프트웨어를 올려야 하고, RHEL에서 소프트웨어를 다루는 표준 도구가 dnf입니다. 이번 글에서는 dnf로 패키지를 설치,제거,검색하는 기본기부터, repository를 추가하는 방법, RHEL 8 이후 등장한 AppStream의 module stream과 profile, 그리고 dnf 아래에 있는 rpm을 직접 다루는 법까지 정리하겠습니다.

RHCSA에서 패키지 영역은 작업 수는 많지 않지만 확실하게 점수를 가져올 수 있는 영역입니다. “특정 repository를 추가하고 거기서 패키지를 설치하라”, “특정 module stream을 활성화해 설치하라” 같은 문제가 단골로 나오므로, 명령을 손에 익혀 두면 짧은 시간에 점수를 확보합니다.

dnf와 rpm의 관계 #

RHEL의 패키지는 rpm 형식이며, 개별 rpm 파일을 설치하는 저수준 도구가 rpm 명령입니다. 하지만 rpm은 의존성을 자동으로 풀어 주지 않습니다. 어떤 패키지를 설치하려는데 다른 패키지가 필요하면, 그 의존 패키지를 직접 찾아 같이 설치해야 합니다.

그 불편을 해결하는 상위 도구가 dnf입니다. dnf는 repository에서 메타데이터를 받아 의존성을 자동으로 해결하고, 필요한 패키지를 함께 내려받아 설치합니다. RHEL 7까지 쓰던 yum의 후속이며, RHEL 8부터는 yum이 dnf의 별칭으로 동작합니다. 따라서 시험에서는 dnf를 쓰되, 손에 익은 yum을 써도 결과는 같습니다.

도구역할
rpm개별 rpm 파일 설치,질의,검증. 의존성 자동 해결 없음
dnfrepository 기반. 의존성 자동 해결, 검색, 그룹, module 관리

정리하면, 일상 설치는 dnf로 하고, 설치된 패키지를 조회하거나 검증할 때 rpm을 함께 쓰는 흐름입니다.

dnf 기본 명령 #

설치, 제거, 업데이트 #

가장 기본이 되는 세 가지입니다.

dnf install httpd            # 패키지 설치
dnf install httpd mod_ssl    # 여러 패키지 한 번에
dnf install -y httpd         # 확인 프롬프트 자동 승인
dnf remove httpd             # 제거
dnf update                   # 시스템 전체 업데이트
dnf update httpd             # 특정 패키지만 업데이트

시험에서는 확인 프롬프트에 일일이 답하기보다 -y 옵션으로 자동 승인하는 편이 빠릅니다.

검색과 정보 조회 #

패키지 이름을 정확히 모를 때 검색합니다.

dnf search web server    # 키워드로 패키지 검색
dnf info httpd           # 버전, 요약, 라이선스 등 상세
dnf list available       # 설치 가능한 패키지 목록
dnf list installed       # 설치된 패키지 목록

provides로 파일의 출처 패키지 찾기 #

RHCSA에서 특히 유용한 명령입니다. “어떤 명령이나 파일이 어느 패키지에 들어 있는지” 모를 때 provides로 역추적합니다.

# 특정 명령을 제공하는 패키지 찾기
dnf provides /usr/sbin/semanage

# 경로에 와일드카드도 가능
dnf provides */htpasswd

예를 들어 semanage가 필요한데 명령이 없다면, 위 명령으로 policycoreutils-python-utils 패키지가 그 명령을 제공한다는 사실을 찾아 설치할 수 있습니다.

패키지 그룹 #

여러 패키지를 묶은 단위가 그룹입니다. 개발 도구나 서버 환경처럼 한꺼번에 설치할 패키지 모음을 그룹으로 처리합니다.

dnf group list                          # 그룹 목록
dnf group list hidden                    # 숨겨진 그룹까지
dnf group info "Development Tools"        # 포함 패키지 확인
dnf group install "Development Tools"     # 그룹 설치
dnf group remove "Development Tools"      # 그룹 제거

그룹 이름에 공백이 있으므로 따옴표로 감싸야 합니다. dnf groupinstall처럼 붙여 쓰는 옛 표기도 동작하지만, RHEL 9에서는 dnf group install을 권장합니다.

dnf history #

dnf는 모든 트랜잭션을 기록합니다. 이 기록으로 과거 작업을 확인하고, 잘못한 설치를 통째로 되돌릴 수 있습니다.

dnf history             # 트랜잭션 이력
dnf history info 5      # 특정 트랜잭션 상세
dnf history undo 5      # 해당 트랜잭션 되돌리기
dnf history undo last   # 마지막 작업 되돌리기

설치 작업을 잘못했을 때 undo로 그 트랜잭션이 건드린 패키지를 한 번에 정리할 수 있어 편리합니다.

repository 다루기 #

dnf가 패키지를 찾는 곳이 repository입니다. 설정 파일은 /etc/yum.repos.d/ 아래의 .repo 파일에 들어 있습니다.

현재 repository 확인 #

dnf repolist        # 활성 repository 목록
dnf repolist all    # 비활성 포함 전체 목록

config-manager로 repository 추가 #

URL 형태의 repository를 추가하는 가장 간단한 방법이 dnf config-manager입니다.

dnf config-manager --add-repo https://example.com/repo/myrepo.repo   # URL 추가
dnf config-manager --set-enabled myrepo                              # 활성화
dnf config-manager --set-disabled myrepo                             # 비활성화

config-manager가 없다면 dnf install -y dnf-plugins-core로 설치할 수 있습니다.

.repo 파일 직접 작성 #

시험에서 baseurl과 gpgcheck를 직접 지정하는 문제가 자주 나옵니다. /etc/yum.repos.d/ 아래에 .repo 파일을 만들어 다음처럼 작성합니다.

[myrepo]
name=My Custom Repository
baseurl=http://content.example.com/rhel9/BaseOS
enabled=1
gpgcheck=0

각 항목의 의미는 다음과 같습니다.

의미
[myrepo]repository 식별자(ID). 대괄호 안의 짧은 이름
name사람이 읽을 설명
baseurl패키지가 있는 위치. http://, https://, file://가능
enabled활성화 여부. 1이면 사용
gpgcheck패키지 서명 검증 여부. 1이면 검증, 0이면 생략

gpgcheck를 1로 두면 gpgkey=에 키 위치를 함께 지정해야 합니다. 시험에서 키 정보가 주어지지 않으면 gpgcheck=0으로 두는 편이 안전합니다.

# .repo 파일을 만든 뒤 인식 확인
dnf repolist
dnf install -y mypackage

로컬 repository #

마운트한 ISO나 로컬 디렉터리를 repository로 쓸 때는 baseurlfile://을 씁니다.

[localmedia]
name=Local Media
baseurl=file:///mnt/repo/BaseOS
enabled=1
gpgcheck=0

위처럼 두면 인터넷 없이 로컬 경로에서 패키지를 설치할 수 있습니다. 인터넷이 막힌 시험 환경의 특성과 맞닿아 있으므로 익혀 둘 가치가 있습니다.

AppStream과 module #

RHEL 8부터 기본 repository가 둘로 나뉩니다.

repository내용
BaseOSOS의 핵심 구성 요소. 커널, 기본 도구 등
AppStream애플리케이션과 런타임. 데이터베이스, 언어, 웹 서버 등

AppStream의 핵심은 module입니다. 하나의 소프트웨어를 여러 버전으로 제공하기 위한 구조이며, 다음 두 개념이 중요합니다.

  • stream: 같은 소프트웨어의 버전 갈래. 예를 들어 nodejs18 stream과 20 stream
  • profile: 그 stream을 어떤 구성으로 설치할지. 예를 들어 common, minimal, development

module 목록과 정보 #

dnf module list          # 전체 module 목록
dnf module list nodejs   # 특정 module의 stream과 profile
dnf module info nodejs   # module 상세 정보

dnf module list nodejs의 출력에서 stream 옆의 [d]는 기본(default) stream을, [e]는 활성(enabled) stream을, [i]는 설치(installed) 표시를 뜻합니다.

stream 활성화와 설치 #

특정 버전을 쓰려면 그 stream을 활성화한 뒤 설치합니다.

dnf module enable nodejs:18          # 특정 stream 활성화
dnf module install nodejs:18         # stream 명시 설치(enable+install)
dnf module install nodejs:18/minimal # profile까지 명시

dnf module install nodejs:18처럼 stream을 명시하면 enable과 install이 함께 처리되므로, 시험에서는 이 한 줄로 끝내는 편이 빠릅니다.

stream 전환 #

이미 다른 stream이 설치된 상태에서 버전을 바꾸려면 reset으로 초기화한 뒤 원하는 stream을 설치합니다.

dnf module reset nodejs        # 현재 활성/설치 module 초기화
dnf module install nodejs:20   # 원하는 stream 설치
dnf module list nodejs         # 전환 결과 확인

한 module에서 두 stream을 동시에 활성화할 수는 없습니다. 그래서 버전 전환은 항상 reset 후 재설치 흐름을 따릅니다. 시험에서 “기존 버전을 제거하고 다른 stream으로 바꾸라"는 문제가 나오면 이 순서를 기억하면 됩니다.

rpm 직접 다루기 #

dnf로 설치한 뒤 상태를 확인하거나, 개별 rpm 파일을 다룰 때 rpm 명령을 씁니다. 질의(query) 옵션을 묶어서 외워 두면 좋습니다.

rpm -qa                              # 설치된 전체 패키지 목록
rpm -q httpd                         # 특정 패키지 설치 여부
rpm -qf /etc/httpd/conf/httpd.conf   # 파일 -> 소속 패키지
rpm -ql httpd                        # 패키지 -> 설치 파일 목록
rpm -qi httpd                        # 패키지 설명 정보
rpm -qc httpd                        # 설정 파일만 추리기
rpm -qd httpd                        # 문서 파일 보기

-qf-ql은 방향이 반대입니다. -qf는 파일에서 패키지를 찾고, -ql은 패키지에서 파일을 나열합니다. 헷갈리기 쉬우니 “f는 file로 묻기, l은 list로 펼치기"로 구분하면 됩니다.

rpm -V로 변경 검증 #

설치 이후 파일이 바뀌었는지 검증할 때 -V(verify)를 씁니다.

rpm -V httpd   # 특정 패키지 무결성 검증
rpm -Va        # 모든 패키지 검증

출력에 아무것도 없으면 변경이 없다는 뜻이며, 변경이 있으면 각 줄에 어떤 속성이 바뀌었는지 플래그로 표시됩니다.

플래그의미
S파일 크기 변경
M권한(mode) 변경
5MD5 체크섬 변경(내용 변경)
T수정 시각(mtime) 변경
c해당 파일이 설정 파일임

예를 들어 S.5....T. c /etc/httpd/conf/httpd.conf는 설정 파일의 크기와 내용, 시각이 바뀌었음을 뜻합니다. 설정을 직접 고쳤다면 자연스러운 결과입니다.

로컬 rpm 파일 설치 #

dnf로도 로컬 파일을 설치할 수 있고, 이 방법이 의존성을 함께 처리하므로 더 안전합니다.

dnf install ./mypackage-1.0.rpm   # 의존성 자동 해결
rpm -ivh mypackage-1.0.rpm        # 의존성 해결 없음

가능하면 dnf로 설치해 의존성 문제를 피하는 편이 좋습니다.

시험 포인트 #

  • 특정 repository를 추가하고 거기서 설치가 단골 출제입니다. /etc/yum.repos.d/.repo 파일을 만들고 baseurlgpgcheck=0을 지정한 뒤 dnf repolist로 인식되는지 확인하고 설치하겠습니다.
  • repository 추가는 dnf config-manager --add-repo URL로도 가능하지만, baseurl을 직접 지정하라는 문제는 .repo 파일을 손으로 작성하는 편이 정확합니다.
  • module stream 설치와 전환도 자주 나옵니다. dnf module install 이름:스트림 한 줄로 enable과 install을 처리하고, 버전을 바꿀 때는 dnf module reset 후 재설치하겠습니다.
  • 명령이나 파일의 출처 패키지를 찾을 때 dnf provides 경로를 씁니다. 필요한 명령이 없을 때 이 방법으로 설치할 패키지를 역추적하겠습니다.
  • rpm -qf(파일에서 패키지)와 rpm -ql(패키지에서 파일)의 방향을 헷갈리지 않겠습니다.
  • 패키지 설치 작업은 재부팅과 무관하게 즉시 영구 적용되지만, repository 설정 파일이 .repo로 디스크에 남는지는 확인하겠습니다.

정리 #

이번 글에서 잡은 것:

  • dnf는 의존성을 자동으로 해결하는 상위 도구이고, rpm은 개별 파일을 다루는 저수준 도구입니다.
  • dnf 기본 명령. install,remove,update,search,info,provides, 그룹은 group install, 이력은 history undo로 되돌립니다.
  • repository는 /etc/yum.repos.d/.repo 파일로 관리하고, baseurlgpgcheck를 지정합니다. 로컬 경로는 file://을 씁니다.
  • AppStream의 module은 stream과 profile로 버전을 고릅니다. dnf module install 이름:스트림으로 설치하고, 전환은 reset 후 재설치합니다.
  • rpm 질의. -qa,-qf,-ql,-V로 설치 상태와 무결성을 확인합니다.

다음: 시스템 운영 #

패키지로 소프트웨어를 올렸으니, 이제 그 시스템을 운영하는 도구를 다룹니다.

#9 시스템 운영: chronyd, journald, cron, systemd timer, tuned에서는 chronyd로 시간을 동기화하고, journald로 로그를 보고, cron과 systemd timer로 작업을 예약하며, tuned로 성능 프로파일을 적용하는 작업을 직접 쳐 보며 정리하겠습니다.

X