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

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/dnflrwxrwxrwx 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-3yum과 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 htopLast metadata expiration check: 0:21:53 ago on Wed Oct 28 15:24:31 2026.
========================== Name Exactly Matched: htop ==========================
htop.x86_64 : Interactive process viewerhtop은 이름이 정확히 같은 패키지 하나만 있어 [Name Exactly Matched] 아래 한 줄로 끝났습니다.
dnf search wgetLast 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 downloaderwget처럼 여러 패키지에 들어가는 낱말은 이름이 정확히 같은 것, 이름과 요약에 모두 있는 것, 이름에만 있는 것의 세 묶음으로 나뉘어 나왔습니다.
search는 설명(Description) 문장은 보지 않으므로, 설명에만 있는 낱말로 찾을 때는 맞지 않습니다. 이때는 [--all] 옵션을 붙이면 설명과 URL까지 범위를 넓혀 찾습니다.
패키지 이름을 알았으면 info로 버전과 크기, 어느 저장소에서 왔는지를 확인합니다.
dnf info htopLast 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 wgetLast 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/treeLast 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 nosuchfileLast 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.오류 문구는 전체 경로를 적거나 와일드카드 [*/]를 앞에 붙이라고 안내합니다. 세 명령이 무엇을 입력받아 어디를 찾는지는 아래 다이어그램에서 차례로 비교할 수 있습니다.
3️⃣ 패키지 설치, 삭제, 업데이트: install, remove, upgrade
찾은 패키지는 install로 설치합니다. dnf는 지정한 패키지뿐 아니라 그 패키지가 필요로 하는 의존 패키지까지 한 번에 설치합니다.
dnf install htop공식 문서 기준으로 dnf는 설치할 패키지 목록(트랜잭션 요약)을 출력한 뒤 계속할지 묻고, [-y]를 붙이면 묻지 않고 진행합니다.
설치할 때 함께 필요한 의존 패키지는 repoquery [--requires]로 미리 확인할 수 있습니다.
dnf repoquery --requires htopLast 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 htopLast 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 htophtop만 지워도 htop 때문에 설치된 hwloc-libs처럼 다른 패키지가 필요로 하지 않는 의존 패키지가 함께 삭제됩니다.
예전에 의존 패키지로 설치되었지만 지금은 어느 패키지도 필요로 하지 않는 것은 autoremove가 삭제합니다. 삭제될 목록은 list [--autoremove]로 먼저 확인합니다.
dnf list --autoremoveLast 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 @appstreamdnf autoremove테스트한 서버에서는 목록에 패키지 6개가 나왔고, autoremove는 이 6개를 한 번에 삭제합니다.
설치된 패키지에 새 버전이 나왔는지는 check-update로 확인합니다. 패키지 이름을 붙이면 그 패키지만 대상으로 합니다.
dnf check-update libavif libdav1dLast 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 epellibavif와 libdav1d를 넣은 위 명령은 둘 다 새 버전이 있어 종료 코드 100으로 끝났습니다. check-update는 업데이트가 있으면 100, 없으면 0, 오류면 1로 끝나므로 스크립트에서 분기 조건으로 사용할 수 있습니다.
list에 패키지 이름을 붙이면 설치된 버전과 저장소의 새 버전이 함께 나옵니다. updateinfo list로는 그 업데이트가 어떤 권고(advisory)에 해당하는지 확인합니다.
dnf list libavifLast 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 epellibavif는 설치된 0.11.1-5.el9가 [Installed Packages] 아래에, 저장소의 1.1.1-3.el9가 [Available Packages] 아래에 나뉘어 나왔습니다.
dnf updateinfo list libavifLast 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 repolistrepo 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 crbcrb AlmaLinux 9 - CRB disabled
crb-debuginfo AlmaLinux 9 - CRB - Debug disabled
crb-source AlmaLinux 9 - CRB - Source disabled저장소 하나의 패키지 수와 미러 주소, 메타데이터 만료 시간, 설정 파일 위치는 repoinfo로 확인합니다.
dnf repoinfo baseosLast 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: 3458repoinfo 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 tmuxID | Command line | Date and time | Action(s) | Altered
-------------------------------------------------------------------------------
51 | install -y tmux | 2026-10-15 20:40 | Install | 1tmux로 좁힌 출력에는 tmux를 설치한 51번 트랜잭션 한 줄만 남았습니다. 번호 범위는 [50..51]처럼 두 점으로 적습니다.
dnf history list 50..51ID | 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 51Transaction 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 @baseos51번을 열어 보니 [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 50rollback 50은 50 뒤에 실행된 트랜잭션을 마지막 것까지 모두 되돌리므로, tmux 하나만 삭제하는 undo 51과 결과가 다를 수 있습니다.
공식 문서 기준으로 되돌릴 수 없는 패키지가 있으면 undo와 rollback은 아무것도 바꾸지 않고 끝납니다. rpm으로 직접 바꾼 내용이 기록에 없어도 오류로 멈추지 않습니다.
🔲 dnf 명령어 시뮬레이터
아래 시뮬레이터에서 search와 info, provides, repolist, history 명령을 직접 입력해 출력을 확인할 수 있습니다. yum으로 입력해도 같은 결과가 나옵니다.
🔢 FAQ & 추천 콘텐츠



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