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
- APT Package Manager (Debian/Ubuntu)
APT (Advanced Package Tool) for Debian and Ubuntu-based systems. Basic Commands β¦ - Bazel Build System
Bazel - Fast, scalable, multi-language build system from Google. Installation 1# β¦ - dpkg Package Manager
dpkg - Low-level package manager for Debian-based systems. Basic Commands 1# β¦ - emerge Package Manager (Gentoo)
emerge (Portage) - Source-based package manager for Gentoo Linux. Basic Commands β¦ - Go Modules & Workspaces
Go modules and workspaces for dependency management. Essential commands for Go β¦ - npm - Node Package Manager
Essential npm commands for Node.js package management. Quick reference for daily β¦ - pacman Package Manager (Arch Linux)
pacman - Package manager for Arch Linux and derivatives (Manjaro, EndeavourOS). β¦ - pip Package Manager (Python)
pip - Package installer for Python. Basic Commands 1# Install package 2pip β¦ - pkg Package Manager (FreeBSD)
pkg - Binary package manager for FreeBSD. Basic Commands 1# Update repository β¦ - Scoop Package Manager (Windows)
Scoop - Command-line installer for Windows. Installation 1# Set execution policy β¦ - Yarn Package Manager
Yarn package manager for JavaScript/Node.js projects. Installation 1# Via npm β¦