dnf 명령어: 패키지 설치, 업데이트, 삭제와 yum 차이

공정위 광고 문구 Ver 3.1
공정위 광고 문구 Ver 3.2(모바일 전용)
테스트 환경RHEL 계열AlmaLinux 9.8root 계정2026-10-28 확인

dnf 명령어는 RHEL 계열 리눅스에서 패키지를 검색, 설치, 업데이트, 삭제하는 패키지 관리 명령어입니다. AlmaLinux 9에서는 yum을 입력해도 같은 프로그램이 실행됩니다. AlmaLinux 9 서버에서 search, info, provides, history를 실제로 실행해, 패키지를 찾는 search, info, provides가 각각 어디를 보는지와 history에 남는 작업 기록을 출력으로 확인했습니다.

설치, 삭제, 업데이트처럼 시스템을 바꾸는 명령은 실행하지 않았습니다. 그 동작은 DNF 공식 문서와 서버에 남아 있던 작업 기록으로 확인했습니다.

1️⃣ dnf 명령어와 yum의 관계

yum을 입력하면 옛 yum이 실행된다고 여기기 쉬우나, AlmaLinux 9의 yum과 dnf는 둘 다 같은 실행 파일 dnf-3을 향한 링크입니다.

ls -l /usr/bin/yum /usr/bin/dnf
lrwxrwxrwx 1 root root 5 May 21 04:48 /usr/bin/dnf -> dnf-3
lrwxrwxrwx 1 root root 5 May 21 04:48 /usr/bin/yum -> dnf-3

yum과 dnf의 차이는 입력하는 이름뿐이고, 어느 쪽을 입력해도 하위 명령과 옵션이 같습니다. search htop을 yum과 dnf로 각각 실행한 출력도 똑같았습니다.

DNF 공식 문서 [Changes in DNF CLI compared to YUM] 기준으로 update와 upgrade는 같은 동작이고, 문서는 upgrade 쪽을 권합니다.

dnf가 없는 옛 배포판에서는 yum 명령어를 그대로 사용합니다. 이 글의 install과 search, history 같은 하위 명령 이름은 yum에서도 같습니다.

2️⃣ dnf 명령어 패키지 조회: search, info, provides

설치하려는 프로그램의 정확한 패키지 이름을 모를 때는 search에 낱말 하나를 붙여 찾습니다. search는 패키지 이름과 요약(Summary)에서 낱말을 찾고, 이름이 정확히 같은 패키지를 맨 위에 올립니다.

dnf search htop
Last metadata expiration check: 0:21:53 ago on Wed Oct 28 15:24:31 2026.
========================== Name Exactly Matched: htop ==========================
htop.x86_64 : Interactive process viewer

htop은 이름이 정확히 같은 패키지 하나만 있어 [Name Exactly Matched] 아래 한 줄로 끝났습니다.

dnf search wget
Last metadata expiration check: 0:22:35 ago on Wed Oct 28 15:24:31 2026.
========================== Name Exactly Matched: wget ==========================
wget.x86_64 : A utility for retrieving files using the HTTP or FTP protocols
========================= Name & Summary Matched: wget =========================
perl-HTTP-Tinyish-Wget.noarch : HTTP::Tinyish wget backend
wget2-devel.x86_64 : Libraries and header files needed for using wget2 libraries
wget2-libs.x86_64 : Runtime libraries for GNU Wget2
============================== Name Matched: wget ==============================
wget2.x86_64 : An advanced file and recursive website downloader

wget처럼 여러 패키지에 들어가는 낱말은 이름이 정확히 같은 것, 이름과 요약에 모두 있는 것, 이름에만 있는 것의 세 묶음으로 나뉘어 나왔습니다.

search는 설명(Description) 문장은 보지 않으므로, 설명에만 있는 낱말로 찾을 때는 맞지 않습니다. 이때는 [--all] 옵션을 붙이면 설명과 URL까지 범위를 넓혀 찾습니다.

패키지 이름을 알았으면 info로 버전과 크기, 어느 저장소에서 왔는지를 확인합니다.

dnf info htop
Last metadata expiration check: 0:22:37 ago on Wed Oct 28 15:24:31 2026.
Available Packages
Name         : htop
Version      : 3.3.0
Release      : 1.el9
Architecture : x86_64
Size         : 198 k
Source       : htop-3.3.0-1.el9.src.rpm
Repository   : epel
Summary      : Interactive process viewer
URL          : http://hisham.hm/htop/
License      : GPLv2+
Description  : htop is an interactive text-mode process viewer for Linux, similar to
             : top(1).

아직 설치되지 않은 htop은 info htop에서 [Available Packages] 아래에 버전 3.3.0, 저장소 epel로 나옵니다. htop은 epel 저장소에만 있는 패키지라, epel을 빼고 search를 다시 실행하면 아무것도 나오지 않습니다.

dnf info wget
Last metadata expiration check: 0:22:38 ago on Wed Oct 28 15:24:31 2026.
Installed Packages
Name         : wget
Version      : 1.21.1
Release      : 11.el9_8
Architecture : x86_64
Size         : 3.1 M
Source       : wget-1.21.1-11.el9_8.src.rpm
Repository   : @System
From repo    : appstream
Summary      : A utility for retrieving files using the HTTP or FTP protocols
URL          : http://www.gnu.org/software/wget/
License      : GPLv3+
Description  : GNU Wget is a file retrieval utility which can use either the HTTP or
             : FTP protocols. Wget features include the ability to work in the
             : background while you are logged out, recursive retrieval of
             : directories, file name wildcard matching, remote file timestamp
             : storage and comparison, use of Rest with FTP servers and Range with
             : HTTP servers to retrieve files over slow or unstable connections,
             : support for Proxy servers, and configurability.

이미 설치된 wget은 [Installed Packages] 아래에 나왔습니다. Repository는 @System이었고, 설치할 때 받아 온 저장소는 [From repo] 줄에 appstream으로 적혀 있었습니다.

반대로 파일 이름만 알고 어느 패키지에 들어 있는지 모를 때는 provides에 파일 경로를 붙입니다.

dnf provides /usr/bin/tree
Last metadata expiration check: 0:22:40 ago on Wed Oct 28 15:24:31 2026.
tree-1.8.0-10.el9.x86_64 : File system tree viewer
Repo        : @System
Matched from:
Filename    : /usr/bin/tree

tree-1.8.0-10.el9.x86_64 : File system tree viewer
Repo        : baseos
Matched from:
Filename    : /usr/bin/tree

/usr/bin/tree로 찾은 결과는 tree 패키지가 설치된 쪽(@System)과 저장소 쪽(baseos)의 두 묶음이었습니다. [Matched from] 아래 Filename이 실제로 맞은 경로입니다. 경로 없이 파일 이름만 적으면 dnf가 /usr/bin/과 /usr/sbin/을 앞에 붙여 다시 찾고, 그래도 없으면 아래 오류로 끝납니다.

dnf provides nosuchfile
Last metadata expiration check: 0:22:41 ago on Wed Oct 28 15:24:31 2026.
Error: No matches found. If searching for a file, try specifying the full path or using a wildcard prefix ("*/") at the beginning.

오류 문구는 전체 경로를 적거나 와일드카드 [*/]를 앞에 붙이라고 안내합니다. 세 명령이 무엇을 입력받아 어디를 찾는지는 아래 다이어그램에서 차례로 비교할 수 있습니다.

🧭 패키지를 찾는 세 명령이 보는 자리
설명 다이어그램
🔍 명령
$ dnf search htopinfo htopprovides /usr/bin/tree
① 입력한 것htop낱말 하나htop패키지 이름/usr/bin/tree파일 경로
➜
② 찾아보는 자리패키지 이름과 요약(Summary)저장소 전체에서 낱말이 들어간 패키지를 모두 찾습니다.패키지 하나의 메타데이터설치된 것과 설치할 수 있는 것을 나눠 출력합니다.패키지가 제공하는 파일 목록그 경로의 파일이 든 패키지를 거꾸로 찾습니다.
➜
③ 출력맞는 패키지 목록htop.x86_64 : Interactive process viewer버전, 크기, 저장소, 설명Version 3.3.0, Size 198 k, Repository epel파일을 가진 패키지tree-1.8.0-10.el9.x86_64, @System, baseos
search는 패키지 이름과 요약에서 낱말을 찾아, 이름이 정확히 같은 것부터 차례로 목록을 출력합니다.
info는 패키지 하나의 버전과 크기, 어느 저장소에서 왔는지를 출력합니다. 설치된 패키지는 Repository 칸에 @System이 나옵니다.
provides는 파일 경로로 패키지를 거꾸로 찾습니다. 설치된 쪽(@System)과 저장소 쪽(baseos)이 따로 나옵니다.

3️⃣ 패키지 설치, 삭제, 업데이트: install, remove, upgrade

찾은 패키지는 install로 설치합니다. dnf는 지정한 패키지뿐 아니라 그 패키지가 필요로 하는 의존 패키지까지 한 번에 설치합니다.

dnf install htop

공식 문서 기준으로 dnf는 설치할 패키지 목록(트랜잭션 요약)을 출력한 뒤 계속할지 묻고, [-y]를 붙이면 묻지 않고 진행합니다.

설치할 때 함께 필요한 의존 패키지는 repoquery [--requires]로 미리 확인할 수 있습니다.

dnf repoquery --requires htop
Last metadata expiration check: 0:22:59 ago on Wed Oct 28 15:24:31 2026.
libc.so.6(GLIBC_2.34)(64bit)
libcap.so.2()(64bit)
libhwloc.so.15()(64bit)
libm.so.6()(64bit)
libm.so.6(GLIBC_2.2.5)(64bit)
libm.so.6(GLIBC_2.29)(64bit)
libncursesw.so.6()(64bit)
libnl-3.so.200()(64bit)
libnl-3.so.200(libnl_3)(64bit)
libnl-genl-3.so.200()(64bit)
libnl-genl-3.so.200(libnl_3)(64bit)
libtinfo.so.6()(64bit)
rtld(GNU_HASH)

[--requires]만 붙이면 htop이 요구하는 라이브러리 이름만 나옵니다. 그 라이브러리가 어느 패키지에 들어 있는지는 다음 명령으로 확인합니다.

dnf repoquery --requires --resolve htop
Last metadata expiration check: 0:23:01 ago on Wed Oct 28 15:24:31 2026.
glibc-0:2.34-283.el9_8.i686
glibc-0:2.34-283.el9_8.x86_64
hwloc-libs-0:2.4.1-6.el9_7.x86_64
libcap-0:2.48-10.el9_8.1.x86_64
libnl3-0:3.11.0-1.el9.x86_64
ncurses-libs-0:6.2-12.20210508.el9.x86_64

[--resolve]를 더하면 그 라이브러리를 제공하는 패키지 이름으로 바뀝니다. 이 가운데 hwloc-libs는 테스트한 서버에 없어, htop을 설치하면 함께 설치됩니다.

remove는 지정한 패키지와 그 패키지에 의존하는 패키지를 함께 삭제하고, 기본 설정에서는 더 이상 필요 없게 된 의존 패키지도 같이 삭제합니다.

dnf remove htop

htop만 지워도 htop 때문에 설치된 hwloc-libs처럼 다른 패키지가 필요로 하지 않는 의존 패키지가 함께 삭제됩니다.

예전에 의존 패키지로 설치되었지만 지금은 어느 패키지도 필요로 하지 않는 것은 autoremove가 삭제합니다. 삭제될 목록은 list [--autoremove]로 먼저 확인합니다.

dnf list --autoremove
Last metadata expiration check: 0:23:09 ago on Wed Oct 28 15:24:31 2026.
Autoremove Packages
cmake-rpm-macros.noarch            3.31.8-3.el9                       @appstream
grub2-tools-efi.x86_64             1:2.06-126.el9_8.alma.1            @baseos
grub2-tools-extra.x86_64           1:2.06-126.el9_8.alma.1            @baseos
libatomic.x86_64                   11.5.0-14.el9.alma.1               @baseos
libvisual.x86_64                   1:0.4.0-34.el9                     @appstream
libwayland-server.x86_64           1.21.0-1.el9                       @appstream
dnf autoremove

테스트한 서버에서는 목록에 패키지 6개가 나왔고, autoremove는 이 6개를 한 번에 삭제합니다.

설치된 패키지에 새 버전이 나왔는지는 check-update로 확인합니다. 패키지 이름을 붙이면 그 패키지만 대상으로 합니다.

dnf check-update libavif libdav1d
Last metadata expiration check: 0:52:20 ago on Wed Oct 28 15:24:31 2026.

libavif.x86_64                          1.1.1-3.el9                         epel
libdav1d.x86_64                         1.5.4-1.el9                         epel

libavif와 libdav1d를 넣은 위 명령은 둘 다 새 버전이 있어 종료 코드 100으로 끝났습니다. check-update는 업데이트가 있으면 100, 없으면 0, 오류면 1로 끝나므로 스크립트에서 분기 조건으로 사용할 수 있습니다.

list에 패키지 이름을 붙이면 설치된 버전과 저장소의 새 버전이 함께 나옵니다. updateinfo list로는 그 업데이트가 어떤 권고(advisory)에 해당하는지 확인합니다.

dnf list libavif
Last metadata expiration check: 0:52:21 ago on Wed Oct 28 15:24:31 2026.
Installed Packages
libavif.x86_64                        0.11.1-5.el9                         @epel
Available Packages
libavif.x86_64                        1.1.1-3.el9                          epel

libavif는 설치된 0.11.1-5.el9가 [Installed Packages] 아래에, 저장소의 1.1.1-3.el9가 [Available Packages] 아래에 나뉘어 나왔습니다.

dnf updateinfo list libavif
Last metadata expiration check: 0:52:24 ago on Wed Oct 28 15:24:31 2026.
FEDORA-EPEL-2026-d611eab94a bugfix libavif-1.1.1-3.el9.x86_64

그 새 버전은 bugfix 권고 FEDORA-EPEL-2026-d611eab94a에 해당하는 업데이트였습니다. 보안 업데이트는 같은 자리에 [Moderate/Sec.]처럼 등급과 Sec.가 붙어 나옵니다.

업데이트는 upgrade로 실행합니다. upgrade는 의존성이 맞는 범위에서만 새 버전을 설치하므로, check-update에 보인 버전이 그대로 설치되지 않을 수 있습니다.

dnf upgrade libavif

패키지 이름을 붙이면 그 패키지와 필요한 의존 패키지만 새 버전으로 올립니다.

dnf upgrade

이름을 생략하면 설치된 패키지 전체가 대상입니다. 트랜잭션 요약을 출력한 뒤 계속할지 묻는 흐름은 install과 같고, 실행한 트랜잭션은 history에 번호로 남습니다.

4️⃣ dnf 명령어 저장소 목록: repolist

search와 install이 패키지를 찾는 곳은 저장소(repository)입니다. repolist는 지금 켜져 있는 저장소의 id와 이름을 출력합니다.

dnf repolist
repo id             repo name
appstream           AlmaLinux 9 - AppStream
baseos              AlmaLinux 9 - BaseOS
epel                Extra Packages for Enterprise Linux 9 - x86_64
epel-cisco-openh264 Extra Packages for Enterprise Linux 9 openh264 (From Cisco) - x86_64
extras              AlmaLinux 9 - Extras
nginx-stable        nginx stable repo
remi-modular        Remi's Modular repository for Enterprise Linux 9 - x86_64
remi-safe           Safe Remi's RPM repository for Enterprise Linux 9 - x86_64

목록에 없는 저장소는 서버에 없다고 여기기 쉬우나, repolist의 기본 출력에는 켜진 저장소만 나옵니다. [--all]을 붙이면 꺼진 저장소까지 status 열과 함께 출력합니다. 테스트한 서버에서는 AlmaLinux 9의 CRB 저장소 셋이 모두 disabled였습니다.

dnf repolist --all | grep -i crb
crb                           AlmaLinux 9 - CRB                         disabled
crb-debuginfo                 AlmaLinux 9 - CRB - Debug                 disabled
crb-source                    AlmaLinux 9 - CRB - Source                disabled

저장소 하나의 패키지 수와 미러 주소, 메타데이터 만료 시간, 설정 파일 위치는 repoinfo로 확인합니다.

dnf repoinfo baseos
Last metadata expiration check: 0:22:55 ago on Wed Oct 28 15:24:31 2026.
Repo-id            : baseos
Repo-name          : AlmaLinux 9 - BaseOS
Repo-status        : enabled
Repo-revision      : 1793090609
Repo-updated       : Tue Oct 27 17:43:29 2026
Repo-pkgs          : 3458
Repo-available-pkgs: 3458
Repo-size          : 21 G
Repo-mirrors       : https://mirrors.almalinux.org/mirrorlist/9/baseos
Repo-baseurl       : http://aws.repo.almalinux.org/almalinux/9.8/BaseOS/x86_64/os/ (9 more)
Repo-expire        : 86400 second(s) (last: Wed Oct 28 15:24:26 2026)
Repo-filename      : /etc/yum.repos.d/almalinux-baseos.repo
Total packages: 3458

repoinfo baseos에서는 패키지가 3,458개로 나왔고, 메타데이터는 86,400초(하루)마다 다시 확인하도록 되어 있었습니다. [Repo-filename] 줄의 .repo 파일이 이 저장소의 설정 파일입니다. 저장소를 켜고 끄는 [--set-enabled]와 [--set-disabled] 옵션은 dnf-plugins-core의 config-manager 명령과 함께 사용합니다.

5️⃣ dnf 명령어 작업 기록과 되돌리기: history

설치와 삭제를 여러 번 거치면 무엇을 언제 바꿨는지 따라가기 어려운데, dnf는 트랜잭션(transaction)마다 번호를 붙여 history에 기록합니다. 패키지 이름을 붙이면 그 패키지를 바꾼 트랜잭션만 나옵니다.

dnf history list tmux
ID     | Command line             | Date and time    | Action(s)      | Altered
-------------------------------------------------------------------------------
    51 | install -y tmux          | 2026-10-15 20:40 | Install        |    1

tmux로 좁힌 출력에는 tmux를 설치한 51번 트랜잭션 한 줄만 남았습니다. 번호 범위는 [50..51]처럼 두 점으로 적습니다.

dnf history list 50..51
ID     | Command line             | Date and time    | Action(s)      | Altered
-------------------------------------------------------------------------------
    51 | install -y tmux          | 2026-10-15 20:40 | Install        |    1
    50 | -y -q install mlocate    | 2026-10-07 19:39 | Install        |    1 EE

[Altered] 열의 숫자는 바뀐 패키지 수입니다. 50번 줄 끝에는 [EE]가 붙어 나왔는데, 트랜잭션은 끝났지만 경고나 오류 출력이 있었다는 뜻입니다.

트랜잭션 하나의 명령줄과 바뀐 패키지, 결과 코드는 history info로 확인합니다.

dnf history info 51
Transaction ID : 51
Begin time     : Thu Oct 15 20:40:51 2026
Begin rpmdb    : d3db9c92a9d0f6ef9a7a1404552bb76e9d56ba7602b1fce73fa5a62170d33c5c
End time       : Thu Oct 15 20:40:51 2026 (0 seconds)
End rpmdb      : a862c33ee6a2f2d0479e4dc2631907dee47591c5b6795551b755c6cd090ac1df
User           : root <root>
Return-Code    : Success
Releasever     : 9
Command Line   : install -y tmux
Persistence    : Persist
Comment        :
Packages Altered:
    Install tmux-3.2a-5.el9.x86_64 @baseos

51번을 열어 보니 [Command Line]에 실행한 명령 install -y tmux가 그대로 남아 있었습니다. [Packages Altered]에는 설치된 tmux와 저장소 @baseos가, [Return-Code]에는 Success가 적혀 있었습니다. 번호를 생략하면 가장 최근 트랜잭션이 나옵니다.

잘못 설치했으면 history undo에 트랜잭션 번호를 붙여 그 트랜잭션의 반대 동작을 실행합니다. rollback은 패키지 상태를 지정한 트랜잭션 직후로 되돌립니다.

dnf history undo 51

트랜잭션 51은 tmux 설치였으므로, undo 51은 tmux를 삭제하는 반대 트랜잭션이 됩니다.

dnf history rollback 50

rollback 50은 50 뒤에 실행된 트랜잭션을 마지막 것까지 모두 되돌리므로, tmux 하나만 삭제하는 undo 51과 결과가 다를 수 있습니다.

공식 문서 기준으로 되돌릴 수 없는 패키지가 있으면 undo와 rollback은 아무것도 바꾸지 않고 끝납니다. rpm으로 직접 바꾼 내용이 기록에 없어도 오류로 멈추지 않습니다.

🔲 dnf 명령어 시뮬레이터

아래 시뮬레이터에서 search와 info, provides, repolist, history 명령을 직접 입력해 출력을 확인할 수 있습니다. yum으로 입력해도 같은 결과가 나옵니다.

dnf 명령어 시뮬레이터dnf 4.14.0
[root@server work]#
키보드 ↑↓ 로 앞에서 쓴 명령을 다시 불러옵니다.

🔢 FAQ & 추천 콘텐츠

저장소 메타데이터의 로컬 사본을 마지막으로 확인한 때입니다. 공식 문서 기준으로 저장소마다 정한 metadata_expire 시간이 지나면 다시 받아 옵니다. search와 provides처럼 최신 정보가 꼭 필요하지 않은 명령은 만료되어도 로컬 사본을 사용합니다. [--refresh]를 붙이면 강제로 다시 받고, [-C]는 캐시만 사용합니다.

foo처럼 없는 명령을 넣어 보니 [No such command] 오류와 함께 [dnf install dnf-command(이름)] 꼴로 플러그인을 설치해 보라는 안내가 나왔습니다. 일부 하위 명령은 dnf-plugins-core 같은 플러그인 패키지가 추가하기 때문입니다. 오타라면 [dnf --help]로 명령 목록을 확인합니다.

rpm -q는 서버에 설치된 패키지 데이터베이스(RPMDB)만 읽어 그 패키지의 버전을 출력하고, 없으면 [package htop is not installed]로 답합니다. dnf list –installed는 같은 데이터베이스에 저장소 정보를 더해 출력하므로, 설치된 패키지 옆에 받아 온 저장소(@epel)가 붙습니다. [--installed] 없이 dnf list를 쓰면 저장소의 새 버전도 함께 출력합니다.

🧭 패키지 명령어 추천 콘텐츠 글 6 · 참조 2
🗂️ 패키지 명령어
📄 YUM 개념과 기본 명령어 📄 dnf 명령어 📄 yum-config-manager 명령어 📄 RPM · YUM 차이
📄 apt · apt-get 명령어 📄 snapd 설치

ℹ️ 제휴 안내
본 사이트의 콘텐츠에는 제휴 링크가 포함되어 있습니다. 방문자가 이 링크를 통해 상품 또는 서비스를 구매하면 본 사이트는 판매처로부터 수수료를 지급받습니다. 이 과정에서 구매자가 지불하는 금액(이벤트 할인 시 금액이 내려갑니다↓)은 오르지 않습니다. 게시된 가격·할인·재고 정보는 작성 시점 기준이며 실제와 다를 수 있으므로, 구매 전 판매처에서 최종 확인하시기 바랍니다. 상품 선정과 평가는 자체 기준에 따라 작성되며, 수수료 지급 여부가 소개 순서나 평가 내용에 영향을 주지 않습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

인간임을 증명하세요: 2   +   1   =