yum/dnf Package Manager (RHEL/Fedora)

yum (Yellowdog Updater Modified) and dnf (Dandified Yum) for RHEL, Fedora, CentOS.


dnf vs yum

1# dnf is the modern replacement for yum
2# Commands are mostly compatible
3
4# Fedora 22+: dnf
5# RHEL 8+: dnf
6# CentOS 8+: dnf
7# Older systems: yum
8
9# This guide uses dnf, but most commands work with yum

Basic Commands

 1# Update package cache
 2sudo dnf check-update
 3
 4# Upgrade all packages
 5sudo dnf upgrade
 6
 7# Install package
 8sudo dnf install package-name
 9
10# Install specific version
11sudo dnf install package-name-version
12
13# Install multiple packages
14sudo dnf install package1 package2 package3
15
16# Install without confirmation
17sudo dnf install -y package-name
18
19# Remove package
20sudo dnf remove package-name
21
22# Autoremove unused dependencies
23sudo dnf autoremove

Search and Query

 1# Search for package
 2dnf search package-name
 3
 4# Show package info
 5dnf info package-name
 6
 7# List installed packages
 8dnf list installed
 9
10# List available packages
11dnf list available
12
13# List updates
14dnf list updates
15
16# Show package dependencies
17dnf deplist package-name
18
19# Find which package provides file
20dnf provides /path/to/file
21dnf whatprovides */filename

Repositories

 1# List enabled repositories
 2dnf repolist
 3
 4# List all repositories
 5dnf repolist --all
 6
 7# Enable repository
 8sudo dnf config-manager --set-enabled repo-name
 9
10# Disable repository
11sudo dnf config-manager --set-disabled repo-name
12
13# Add repository
14sudo dnf config-manager --add-repo https://example.com/repo.repo
15
16# Install from specific repo
17sudo dnf --enablerepo=repo-name install package-name

EPEL Repository (RHEL/CentOS)

1# Install EPEL (Extra Packages for Enterprise Linux)
2# RHEL 8/CentOS 8
3sudo dnf install epel-release
4
5# RHEL 9/CentOS 9
6sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
7
8# Verify
9dnf repolist | grep epel

RPM Fusion (Fedora)

1# Free repository
2sudo dnf install https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm
3
4# Nonfree repository
5sudo dnf install https://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm

Install from RPM File

 1# Install .rpm package
 2sudo dnf install ./package.rpm
 3
 4# Or using rpm directly
 5sudo rpm -ivh package.rpm
 6
 7# Upgrade package
 8sudo rpm -Uvh package.rpm
 9
10# Remove package
11sudo rpm -e package-name
12
13# Query installed package
14rpm -qa | grep package-name
15
16# List files in package
17rpm -ql package-name
18
19# Show package info
20rpm -qi package-name

Build from Source

 1# Install development tools
 2sudo dnf groupinstall "Development Tools"
 3sudo dnf install rpm-build rpmdevtools
 4
 5# Setup RPM build environment
 6rpmdev-setuptree
 7
 8# Directory structure:
 9# ~/rpmbuild/
10# β”œβ”€β”€ BUILD/
11# β”œβ”€β”€ RPMS/
12# β”œβ”€β”€ SOURCES/
13# β”œβ”€β”€ SPECS/
14# └── SRPMS/
15
16# Download source
17cd ~/rpmbuild/SOURCES
18wget https://example.com/source.tar.gz
19
20# Create spec file
21cd ~/rpmbuild/SPECS
22rpmdev-newspec package-name
23
24# Edit spec file
25nano package-name.spec
26
27# Build RPM
28rpmbuild -ba package-name.spec
29
30# Install built RPM
31sudo dnf install ~/rpmbuild/RPMS/x86_64/package-name-version.rpm

Example SPEC File

 1Name:           mypackage
 2Version:        1.0
 3Release:        1%{?dist}
 4Summary:        My custom package
 5
 6License:        MIT
 7URL:            https://example.com
 8Source0:        %{name}-%{version}.tar.gz
 9
10BuildRequires:  gcc make
11Requires:       glibc
12
13%description
14Long description of my package
15
16%prep
17%setup -q
18
19%build
20./configure --prefix=/usr
21make %{?_smp_mflags}
22
23%install
24make install DESTDIR=%{buildroot}
25
26%files
27/usr/bin/myprogram
28/usr/share/doc/%{name}/README
29
30%changelog
31* Thu Dec 12 2024 Your Name <email@example.com> - 1.0-1
32- Initial package

Groups

 1# List groups
 2dnf group list
 3
 4# Show group info
 5dnf group info "Group Name"
 6
 7# Install group
 8sudo dnf group install "Development Tools"
 9
10# Remove group
11sudo dnf group remove "Development Tools"
12
13# Common groups:
14# - "Development Tools"
15# - "System Tools"
16# - "Security Tools"

History

 1# Show transaction history
 2dnf history
 3
 4# Show specific transaction
 5dnf history info <id>
 6
 7# Undo transaction
 8sudo dnf history undo <id>
 9
10# Redo transaction
11sudo dnf history redo <id>
12
13# Rollback to transaction
14sudo dnf history rollback <id>

Cache Management

 1# Clean cache
 2sudo dnf clean all
 3
 4# Clean packages only
 5sudo dnf clean packages
 6
 7# Clean metadata
 8sudo dnf clean metadata
 9
10# Make cache
11sudo dnf makecache
12
13# Download packages without installing
14dnf download package-name
15
16# Download with dependencies
17dnf download --resolve package-name

Configuration

 1# Main config file
 2sudo nano /etc/dnf/dnf.conf
 3
 4# Example settings:
 5[main]
 6gpgcheck=1
 7installonly_limit=3
 8clean_requirements_on_remove=True
 9best=True
10skip_if_unavailable=True
11max_parallel_downloads=10

Security Updates

 1# List security updates
 2dnf updateinfo list security
 3
 4# Install security updates only
 5sudo dnf upgrade --security
 6
 7# Show security advisories
 8dnf updateinfo list --security
 9
10# Show specific advisory
11dnf updateinfo info <advisory-id>

Modules (dnf only)

 1# List modules
 2dnf module list
 3
 4# Show module info
 5dnf module info module-name
 6
 7# Install module stream
 8sudo dnf module install module-name:stream
 9
10# Enable module
11sudo dnf module enable module-name:stream
12
13# Disable module
14sudo dnf module disable module-name
15
16# Reset module
17sudo dnf module reset module-name
18
19# Example: Install Python 3.11
20sudo dnf module install python:3.11

Troubleshooting

 1# Fix broken dependencies
 2sudo dnf check
 3sudo dnf upgrade --best --allowerasing
 4
 5# Rebuild RPM database
 6sudo rpm --rebuilddb
 7
 8# Clean and update
 9sudo dnf clean all
10sudo dnf makecache
11sudo dnf upgrade
12
13# Force reinstall
14sudo dnf reinstall package-name
15
16# Check for duplicate packages
17dnf repoquery --duplicates

Useful Aliases

1# Add to ~/.bashrc
2alias update='sudo dnf upgrade'
3alias install='sudo dnf install'
4alias remove='sudo dnf remove'
5alias search='dnf search'
6alias clean='sudo dnf autoremove && sudo dnf clean all'

yum Commands (Legacy)

 1# Update
 2sudo yum update
 3
 4# Install
 5sudo yum install package-name
 6
 7# Remove
 8sudo yum remove package-name
 9
10# Search
11yum search package-name
12
13# Info
14yum info package-name
15
16# List
17yum list installed
18
19# Clean
20sudo yum clean all
21
22# History
23yum history

Create and Publish RPM Package

Setup Build Environment

 1# Install tools
 2sudo dnf install rpm-build rpmdevtools rpmlint
 3
 4# Setup RPM build tree
 5rpmdev-setuptree
 6
 7# Creates:
 8# ~/rpmbuild/
 9# β”œβ”€β”€ BUILD/
10# β”œβ”€β”€ RPMS/
11# β”œβ”€β”€ SOURCES/
12# β”œβ”€β”€ SPECS/
13# └── SRPMS/

Create SPEC File

1# Generate template
2cd ~/rpmbuild/SPECS
3rpmdev-newspec mypackage
4
5# Edit spec file
6nano mypackage.spec

mypackage.spec

 1Name:           mypackage
 2Version:        1.0.0
 3Release:        1%{?dist}
 4Summary:        A useful package
 5
 6License:        MIT
 7URL:            https://github.com/username/mypackage
 8Source0:        https://github.com/username/%{name}/archive/v%{version}.tar.gz
 9
10BuildRequires:  gcc make
11Requires:       glibc python3
12
13%description
14Long description of my package.
15It can span multiple lines.
16
17%prep
18%setup -q
19
20%build
21./configure --prefix=%{_prefix}
22make %{?_smp_mflags}
23
24%install
25make install DESTDIR=%{buildroot}
26
27# Install systemd service
28install -Dm644 mypackage.service %{buildroot}%{_unitdir}/mypackage.service
29
30%post
31%systemd_post mypackage.service
32
33%preun
34%systemd_preun mypackage.service
35
36%postun
37%systemd_postun_with_restart mypackage.service
38
39%files
40%license LICENSE
41%doc README.md
42%{_bindir}/mypackage
43%{_unitdir}/mypackage.service
44%config(noreplace) %{_sysconfdir}/mypackage/config.conf
45
46%changelog
47* Thu Dec 12 2024 Your Name <email@example.com> - 1.0.0-1
48- Initial package

Build RPM

 1# Download source
 2cd ~/rpmbuild/SOURCES
 3wget https://github.com/username/mypackage/archive/v1.0.0.tar.gz
 4
 5# Build RPM
 6cd ~/rpmbuild/SPECS
 7rpmbuild -ba mypackage.spec
 8
 9# This creates:
10# ~/rpmbuild/RPMS/x86_64/mypackage-1.0.0-1.fc38.x86_64.rpm
11# ~/rpmbuild/SRPMS/mypackage-1.0.0-1.fc38.src.rpm
12
13# Check RPM
14rpmlint mypackage.spec
15rpmlint ~/rpmbuild/RPMS/x86_64/mypackage-1.0.0-1.fc38.x86_64.rpm
16
17# Install locally
18sudo dnf install ~/rpmbuild/RPMS/x86_64/mypackage-1.0.0-1.fc38.x86_64.rpm

Publish to COPR (Fedora)

 1# Install copr-cli
 2sudo dnf install copr-cli
 3
 4# Create COPR project at https://copr.fedorainfracloud.org/
 5
 6# Configure API token
 7# Get token from https://copr.fedorainfracloud.org/api/
 8nano ~/.config/copr
 9
10# Build from SRPM
11copr-cli build myproject ~/rpmbuild/SRPMS/mypackage-1.0.0-1.fc38.src.rpm
12
13# Or build from Git
14copr-cli buildscm myproject --clone-url https://github.com/username/mypackage.git --spec mypackage.spec
15
16# Users can install with:
17# sudo dnf copr enable username/myproject
18# sudo dnf install mypackage

Custom RPM Repository

 1# Create repository directory
 2mkdir -p /var/www/rpm/{RPMS,SRPMS}
 3
 4# Copy RPMs
 5cp ~/rpmbuild/RPMS/x86_64/*.rpm /var/www/rpm/RPMS/
 6cp ~/rpmbuild/SRPMS/*.rpm /var/www/rpm/SRPMS/
 7
 8# Create repository metadata
 9createrepo /var/www/rpm
10
11# Sign packages (optional)
12rpm --addsign /var/www/rpm/RPMS/*.rpm
13
14# Export GPG public key
15gpg --export --armor YOUR_KEY_ID > /var/www/rpm/RPM-GPG-KEY-myrepo
16
17# Serve with nginx
18# Configure nginx to serve /var/www/rpm
19
20# Users add repository:
21# sudo nano /etc/yum.repos.d/myrepo.repo
22[myrepo]
23name=My Custom Repository
24baseurl=https://repo.example.com/rpm
25enabled=1
26gpgcheck=1
27gpgkey=https://repo.example.com/rpm/RPM-GPG-KEY-myrepo
28
29# Then: sudo dnf install mypackage

Build for Multiple Distributions

 1# Use mock for clean builds
 2sudo dnf install mock
 3
 4# Add user to mock group
 5sudo usermod -a -G mock $USER
 6
 7# Build for Fedora 38
 8mock -r fedora-38-x86_64 ~/rpmbuild/SRPMS/mypackage-1.0.0-1.fc38.src.rpm
 9
10# Build for RHEL 9
11mock -r rhel-9-x86_64 ~/rpmbuild/SRPMS/mypackage-1.0.0-1.el9.src.rpm
12
13# Results in:
14# /var/lib/mock/fedora-38-x86_64/result/
15# /var/lib/mock/rhel-9-x86_64/result/

Best Practices

 1# 1. Follow Fedora packaging guidelines
 2# https://docs.fedoraproject.org/en-US/packaging-guidelines/
 3
 4# 2. Use macros
 5%{_bindir}      # /usr/bin
 6%{_sbindir}     # /usr/sbin
 7%{_libdir}      # /usr/lib64
 8%{_sysconfdir}  # /etc
 9%{_datadir}     # /usr/share
10
11# 3. Handle config files properly
12%config(noreplace) %{_sysconfdir}/mypackage/config.conf
13
14# 4. Use systemd macros
15%systemd_post mypackage.service
16%systemd_preun mypackage.service
17%systemd_postun_with_restart mypackage.service
18
19# 5. Check with rpmlint
20rpmlint mypackage.spec
21rpmlint mypackage.rpm
22
23# 6. Test installation
24sudo dnf install mypackage.rpm
25sudo dnf remove mypackage

Related Snippets