Mastering RPM Installation on Linux: Step-by-Step with Real-World Nuance
Installing RPM packages by hand is a core requirement for administrators working with Red Hat-based distributions—RHEL (8.x, 9.x), CentOS (7.x, 8 Stream), Fedora, and openSUSE tumbleweed/leap. This guide proceeds from version checks to dependency pitfalls, reflecting operational scenarios often missed in documentation.
Package Format: Practical Context
An RPM package (*.rpm
) encapsulates binaries, configuration templates, postinstall macros, triggers, and dependency lists. Unlike modern containerized deployments or universal package managers (snap
, flatpak
), RPM’s dependency management is explicit—mistakes in sequence or source cause failures.
When Manual Installation Arises
- Controlled environments: Air-gapped systems, compliance-driven upgrades.
- Custom modules: Vendor builds or homegrown software outside primary repos.
- Regression testing: Verifying behavior for specific versions.
# Has nginx been installed?
rpm -q nginx
If present, reports version (e.g., nginx-1.20.1-10.el8.x86_64
). Otherwise, a silent “not installed”—handy in scripts.
Installing: Direct RPM
Sometimes, rpm -ivh
is the only option because software arrives on USB or via restricted channels.
sudo rpm -ivh nginx-1.20.1-10.el8.x86_64.rpm
# -i: install, -v: verbose, -h: hash progress (okay for interactive shells)
Critical limitation: rpm
itself performs no dependency resolution. Missing libraries or pre/post script failures halt the process.
Typical error:
error: Failed dependencies:
libpcre.so.1()(64bit) is needed by nginx-1.20.1-10.el8.x86_64
In tightly controlled NOC or “golden image” builds, you verify the dependency chain up front (see rpm -qpR file.rpm
).
Practical Installation with Dependency Resolution
For real environments, system repos enable easier management. Use dnf
(RHEL 8+, Fedora 30+) or yum
(RHEL/CentOS 7.x).
sudo dnf install ./nginx-1.20.1-10.el8.x86_64.rpm
Note: The ./
prefix is non-negotiable. Without it, dnf
assumes the name is from a remote repo, not a local file.
Side note: yum
’s localinstall
is deprecated; use yum install ./package.rpm
instead, but expect legacy docs to lag.
Alternative: Use dnf
’s --nogpgcheck
option for unsigned packages (trusted sources only).
Upgrades and Rollbacks
To upgrade in place, preserving configurations where possible:
sudo rpm -Uvh nginx-1.22.1-6.el8.x86_64.rpm
Or enforce dependency checks and proper replacement sequencing:
sudo dnf upgrade ./nginx-1.22.1-6.el8.x86_64.rpm
Gotcha: Downgrading is possible (--oldpackage
) but rarely supported by vendors—config migrations may break.
Post-Installation Validation
Confirm installation and enumerate deployed files:
rpm -ql nginx
Validate package integrity (e.g., after suspected tampering or NFS issues):
rpm -V nginx
A silent return is good; listed discrepancies (denoted by “5” for MD5 sum failures) require manual evaluation.
Uninstallation and Residue
Standard removal:
sudo rpm -e nginx
With dnf
or yum
:
sudo dnf remove nginx
Detail: rpm -e
won’t refuse to remove critical system packages (unlike APT), so double-check dependencies with rpm -q --whatrequires nginx
.
Exploration and Troubleshooting
Query metadata:
rpm -qi nginx # Installed package info
rpm -qpi ./nginx*.rpm # Inspect local file, no install required
Search all installed matching “nginx”:
rpm -qa | grep nginx
Dependency chain:
rpm -qR nginx
Rebuild a stuck database (known issue after power loss or abrupt kill):
sudo rm -f /var/lib/rpm/__db.*
sudo rpm --rebuilddb
Note: This does not fix deeper corruption caused by disk errors.
Quick Reference Table
Operation | Command Example |
---|---|
Query installed | rpm -q nginx |
Direct install | rpm -ivh nginx-1.20.1-10.el8.x86_64.rpm |
Install w/ deps | dnf install ./nginx-1.20.1-10.el8.x86_64.rpm |
Upgrade | dnf upgrade ./nginx-1.22.1-6.el8.x86_64.rpm |
List files | rpm -ql nginx |
Remove | dnf remove nginx |
Inspect local rpm | rpm -qpi ./nginx*.rpm |
Nuanced Practices From the Field
- In air-gapped deployments, assemble all required
.rpm
files (seednf repoquery --requires
) and use a custom local repo or thecreaterepo
utility. - Avoid
rpm -–force
except when explicitly directed—can mask underlying filesystem divergence or configuration drift. - Some application vendors distribute “metapackages” that only pull in dependencies, so test in a staging environment before rolling into production.
Not perfect, but functional: RPM’s process lacks the atomic rollback features of transaction-based managers (e.g., Nix or Zypper), so snapshot or backup critical systems prior to mass operations. As always, confirm that your install base matches what your monitoring tells you: configuration drift here is all too common.
For advanced diagnostics, or to automate deployments, consider embedding these steps within an Ansible playbook or a CI/CD pipeline—systemd services and postinstall triggers tend not to play nicely with manual overrides.
For further detail—or edge cases not covered here—consult the rpm(8)
, dnf(8)
, and distribution-specific release notes.