← Back to DevBytes

Ubuntu Package Management: APT, DNF, Pacman Guide

Introduction to Linux Package Management

Package management is the backbone of any Linux distribution. It's the system that allows developers and system administrators to install, update, configure, and remove software in a consistent, reproducible way. While the topic centers on Ubuntu, understanding the three major package managers — APT (Debian/Ubuntu), DNF (Fedora/RHEL), and Pacman (Arch) — gives you a complete picture of how modern Linux distributions handle software.

Each package manager solves the same fundamental problems: dependency resolution, repository management, signature verification, and system upgrades. However, they approach these problems with different philosophies. APT prioritizes stability, DNF balances speed with reliability, and Pacman emphasizes simplicity and bleeding-edge software.

Why Package Management Matters for Developers

As a developer, you interact with package managers constantly — installing language runtimes, build tools, databases, and libraries. A solid understanding of package management helps you:

Without package managers, you'd be manually downloading tarballs, compiling source code, and tracking shared libraries by hand — a workflow that doesn't scale beyond a single machine.

APT: The Debian and Ubuntu Package Manager

APT (Advanced Package Tool) is the package manager used by Debian-based distributions, including Ubuntu, Linux Mint, and Pop!_OS. It works with .deb packages and pulls software from configured repositories. APT is actually a front-end for dpkg, the lower-level tool that handles individual package installation.

Updating the Package Index

Before installing or upgrading anything, you should refresh the local package index. This synchronizes your system's knowledge of available packages and versions with the remote repositories.

sudo apt update

This command does not install anything. It only updates the metadata. Run it before any installation or upgrade operation to ensure you're working with current information.

Upgrading Installed Packages

To upgrade all installed packages to their latest available versions, use:

sudo apt upgrade

For a more thorough upgrade that can remove obsolete dependencies and install new ones as needed, use full-upgrade:

sudo apt full-upgrade

The difference matters in production environments. upgrade is conservative and safe, while full-upgrade may remove packages that conflict with the upgrade path.

Installing Packages

To install a single package:

sudo apt install nginx

You can install multiple packages in one command, which is more efficient than running separate installations:

sudo apt install git curl wget vim htop

APT automatically resolves and installs dependencies. If a package requires libssl, APT fetches it without manual intervention.

Searching for Packages

When you're not sure of the exact package name, search the index:

apt search python3

To get detailed information about a specific package before installing it:

apt show docker.io

This displays the version, dependencies, maintainer, download size, and a description — useful for verifying you've found the right package.

Removing Packages

To remove a package while keeping its configuration files:

sudo apt remove nginx

To remove a package along with its configuration files:

sudo apt purge nginx

After removing packages, clean up orphaned dependencies that are no longer required:

sudo apt autoremove

Managing Repositories

Ubuntu uses Personal Package Archives (PPAs) and official repositories. To add a PPA:

sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update

Always run apt update after adding or removing a repository so the package index reflects the new source.

Listing Installed Packages

To see everything installed on your system:

apt list --installed

To check if a specific package is installed and see its version:

apt list --installed | grep docker

DNF: The Fedora and RHEL Package Manager

DNF (Dandified YUM) is the successor to YUM and is used by Fedora, CentOS Stream, RHEL, and other Red Hat-based distributions. It works with .rpm packages and is known for its fast dependency resolution, powered by the libsolv library.

Checking for Updates

To see which packages have available updates without installing them:

sudo dnf check-update

Upgrading Packages

To upgrade all packages on the system:

sudo dnf upgrade

To upgrade a specific package:

sudo dnf upgrade nginx

Installing Packages

DNF's install syntax mirrors APT's closely:

sudo dnf install git curl wget

You can also install a package directly from a URL:

sudo dnf install https://example.com/package.rpm

Searching and Inspecting Packages

To search for packages by name or description:

dnf search "web server"

To view detailed information about a package:

dnf info httpd

DNF also lets you see what a package provides. This is extremely useful when you encounter a missing shared library error:

dnf provides "*/libcurl.so.4"

This tells you which package installs the file you need, solving one of the most common build-time headaches.

Removing Packages

To remove a package:

sudo dnf remove httpd

To remove a package along with all dependencies that were installed alongside it and are no longer needed:

sudo dnf autoremove httpd

Managing DNF Repositories

DNF repositories are configured in /etc/yum.repos.d/ as .repo files. To list all enabled and disabled repositories:

dnf repolist --all

To enable a disabled repository temporarily for a single command:

sudo dnf --enablerepo=epel install htop

Package Groups and Modules

DNF supports package groups, which bundle related software. For example, to install a complete development environment:

sudo dnf groupinstall "Development Tools"

Fedora also uses modules for shipping multiple versions of software streams:

dnf module list
sudo dnf module install nodejs:18

Pacman: The Arch Linux Package Manager

Pacman is the package manager for Arch Linux and its derivatives like Manjaro. It's written in C, is extremely fast, and uses a simple .pkg.tar.zst format. Pacman follows Arch's KISS philosophy — it's powerful but expects the user to understand what they're doing.

Syncing and Updating

The single most important Pacman command is the system sync and upgrade:

sudo pacman -Syu

This combines three operations: -S syncs the package database, -y refreshes the local database from the remote repositories, and -u upgrades all outdated packages. On Arch, you should always run this before installing new software to avoid partial upgrades, which can break the system.

Installing Packages

To install a package from the official repositories:

sudo pacman -S vim

To install multiple packages:

sudo pacman -S git curl wget htop

To install a package file you've downloaded locally:

sudo pacman -U /path/to/package.pkg.tar.zst

Searching for Packages

To search the remote repositories:

pacman -Ss python

To search only among installed packages:

pacman -Qs python

To display detailed information about a package in the repositories:

pacman -Si nginx

To display information about an installed package:

pacman -Qi nginx

Removing Packages

To remove a package but leave its dependencies installed:

sudo pacman -R nginx

To remove a package and its dependencies that are not required by other packages:

sudo pacman -Rs nginx

To remove a package, its dependencies, and its configuration files:

sudo pacman -Rns nginx

The -Rns combination is the cleanest removal option and is what most Arch users default to.

Querying the System

To list all installed packages:

pacman -Q

To list packages installed explicitly by the user (not as dependencies):

pacman -Qe

To find which package owns a specific file:

pacman -Qo /usr/bin/git

To list orphaned packages that were installed as dependencies but are no longer needed:

pacman -Qdt

The AUR and AUR Helpers

The Arch User Repository (AUR) is a community-driven repository containing package build scripts called PKGBUILDs. Pacman itself cannot install from the AUR directly. Instead, users employ AUR helpers like yay or paru:

yay -S google-chrome

These helpers download the PKGBUILD, resolve dependencies, compile the package, and install it through Pacman. The AUR is one of Arch's biggest advantages, offering software that isn't in the official repositories.

Cleaning the Package Cache

Pacman stores every downloaded package in /var/cache/pacman/pkg/. Over time, this directory grows large. To clean it while keeping the most recent versions:

sudo paccache -r

To remove all cached packages except those currently installed:

sudo paccache -ruk0

Comparing the Three Package Managers

While all three managers accomplish the same goals, their command structures differ significantly. Here's a quick reference for common operations:

# Update package index
sudo apt update          # APT
sudo dnf check-update    # DNF
sudo pacman -Sy          # Pacman

# Upgrade all packages
sudo apt upgrade         # APT
sudo dnf upgrade         # DNF
sudo pacman -Su          # Pacman

# Install a package
sudo apt install pkg     # APT
sudo dnf install pkg     # DNF
sudo pacman -S pkg       # Pacman

# Remove a package
sudo apt remove pkg      # APT
sudo dnf remove pkg      # DNF
sudo pacman -R pkg       # Pacman

# Search for a package
apt search pkg           # APT
dnf search pkg           # DNF
pacman -Ss pkg           # Pacman

# Show package info
apt show pkg             # APT
dnf info pkg             # DNF
pacman -Si pkg           # Pacman

Best Practices for Package Management

Always Update Before Installing

Stale package databases lead to failed installations and dependency errors. Make it a habit to refresh the index before installing or upgrading anything. On Arch, this is mandatory — partial upgrades are unsupported and can leave the system in an inconsistent state.

Pin Critical Package Versions in Production

In production environments, uncontrolled upgrades can introduce breaking changes. On Ubuntu, you can hold a package at its current version:

sudo apt-mark hold docker.io

To release the hold later:

sudo apt-mark unhold docker.io

On DNF, use versionlock:

sudo dnf install python3-dnf-plugin-versionlock
sudo dnf versionlock add nginx-1.24.*

Use Transaction Logs for Auditing

All three package managers maintain logs of every transaction. These logs are invaluable for debugging and auditing:

You can review recent APT history with:

cat /var/log/apt/history.log | tail -50

Automate Security Updates

On Ubuntu, the unattended-upgrades package enables automatic security patches:

sudo apt install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades

This keeps your system patched against known vulnerabilities without manual intervention, while still allowing you to control when full feature upgrades happen.

Keep Docker Images Lean

When building Docker images, combine package manager commands to reduce layers and clean up caches in the same layer:

RUN apt-get update && \
    apt-get install -y --no-install-recommends \
        curl \
        git \
        ca-certificates && \
    rm -rf /var/lib/apt/lists/*

The --no-install-recommends flag prevents APT from pulling in suggested packages that bloat the image. Cleaning the lists directory in the same layer ensures the cache doesn't persist in the final image.

Verify Package Signatures

All three managers support GPG signature verification by default. Never disable signature checking to work around an error — instead, investigate why the signature fails. A signature mismatch could indicate a compromised mirror or a man-in-the-middle attack.

Document Your Installed Packages

For reproducible setups, export your package list periodically:

# APT
dpkg --get-selections > installed-packages.txt

# DNF
dnf repoquery --userinstalled > installed-packages.txt

# Pacman
pacman -Qqe > installed-packages.txt

You can use these lists to rebuild a system quickly after a failure or to provision a new machine with identical software.

Conclusion

Package management is one of the most fundamental skills for any developer working on Linux. APT, DNF, and Pacman each represent a different philosophy — stability, balance, and simplicity — but they all solve the same core problems of installing, updating, and removing software safely. By mastering the commands, understanding dependency resolution, and following best practices like version pinning, log auditing, and signature verification, you can keep your development and production environments consistent, secure, and maintainable. Whether you're deploying a microservice on Ubuntu, building a container image from Fedora, or running Arch on your workstation, the principles remain the same: keep your indexes fresh, your upgrades deliberate, and your systems documented.

— Ad —

Google AdSense will appear here after approval

← Back to all articles