Zypper Guide (openSUSE)
Zypper is the package manager for openSUSE and SUSE Linux Enterprise. It sits on top of the libzypp library and provides one of the most detailed dependency resolver outputs of any Linux package manager — when it cannot resolve something, it tells you exactly why and offers multiple solutions. This guide covers the full command set from daily operations through repository management, patterns, locks, and distribution upgrades.
Daily workflow
# Refresh all repository metadata
sudo zypper refresh
# Install available updates (conservative: no package set changes)
sudo zypper update
# Distribution upgrade (Tumbleweed, or between Leap versions)
sudo zypper dup
# Check for updates without installing
zypper list-updates
# See what dup would change before committing
sudo zypper dup --dry-run
On openSUSE Tumbleweed (rolling release), zypper dup is the standard upgrade command. On openSUSE Leap (stable release), zypper update handles routine updates; zypper dup is only used when upgrading between major Leap releases.
Installing and removing packages
# Install a package
sudo zypper install nginx
# Short form
sudo zypper in nginx
# Install multiple packages
sudo zypper in nginx postgresql redis
# Install a specific version
sudo zypper in nginx=1.24.0
# Install from a local .rpm file
sudo zypper in ./package.rpm
# Install and automatically agree to licenses
sudo zypper in --auto-agree-with-licenses nginx
# Reinstall a package
sudo zypper in --force nginx
# Remove a package
sudo zypper remove nginx
# Short form
sudo zypper rm nginx
# Remove a package and packages that depend on it
sudo zypper rm --clean-deps nginx
# Remove orphaned packages (no longer required by anything)
sudo zypper rm $(zypper packages --unneeded | awk -F'|' 'NR>4 {print $3}')
Searching and inspecting packages
# Search for a package by name or description
zypper search nginx
zypper se nginx # short form
# Search by exact name
zypper se --match-exact nginx
# Search only in package names (faster)
zypper se --name nginx
# Show full information about a package
zypper info nginx
zypper if nginx # short form
# Show what files a package installs (installed packages)
rpm -ql nginx
# Find which package provides a file
zypper what-provides /usr/sbin/nginx
# See reverse dependencies (what requires this package)
zypper se --requires nginx
# List installed packages
zypper packages --installed-only
zypper se -i # short form
# List packages with updates available
zypper list-updates
zypper lu # short form
# Verify package integrity
rpm -V nginx
Repository management
# List configured repositories
zypper repos
zypper lr # short form
# List repos with URL and priority
zypper lr -u -p
# Refresh all repo metadata
sudo zypper refresh
sudo zypper ref # short form
# Refresh a specific repo
sudo zypper ref repo-alias
# Add a repository from a URL
sudo zypper addrepo https://download.opensuse.org/repo.repo alias
sudo zypper ar https://download.opensuse.org/repo.repo alias
# Add a repo with automatic refresh enabled
sudo zypper ar --refresh https://example.com/repo.repo alias
# Remove a repository
sudo zypper removerepo alias
sudo zypper rr alias
# Enable or disable a repository
sudo zypper modifyrepo --enable alias
sudo zypper modifyrepo --disable alias
sudo zypper mr -e alias # enable
sudo zypper mr -d alias # disable
# Change repo priority (lower number = higher priority, default 99)
sudo zypper mr --priority 70 alias
# Rename a repository alias
sudo zypper mr --rename old-alias new-alias
Repository priority controls which source wins when the same package is available from multiple repos. This matters when you have OBS (openSUSE Build Service) repos alongside the standard repos.
openSUSE Build Service repositories
OBS is openSUSE’s community build infrastructure, similar to Fedora’s COPR. It hosts thousands of community-maintained packages.
# Find packages on OBS (best done through software.opensuse.org)
# The site provides "1-Click Install" buttons and CLI instructions
# Example: manually adding an OBS repo
sudo zypper ar https://download.opensuse.org/repositories/some:Project/openSUSE_Tumbleweed/ some-project
# After adding:
sudo zypper refresh
sudo zypper in some-package
# Import the GPG key for the repo
sudo rpm --import https://download.opensuse.org/repositories/some:Project/openSUSE_Tumbleweed/repodata/repomd.xml.key
Patterns
Patterns are predefined groups of packages that represent a complete feature set or system role:
# List available patterns
zypper patterns
# List installed patterns
zypper patterns --installed-only
# Show what packages a pattern includes
zypper info -t pattern devel_basis
# Install a pattern
sudo zypper install -t pattern devel_basis
sudo zypper in -t pattern lamp_server
# Remove a pattern
sudo zypper remove -t pattern pattern_name
# Commonly useful patterns
# base -- minimal base system
# devel_basis -- C/C++ development tools (gcc, make, etc.)
# devel_python3 -- Python development
# lamp_server -- Apache, MariaDB, PHP
# gnome -- GNOME desktop environment
# kde -- KDE Plasma desktop
Package locks
Locks prevent zypper from modifying specific packages during updates:
# Add a lock on a package
sudo zypper addlock nginx
sudo zypper al nginx # short form
# Lock a specific version
sudo zypper al nginx=1.24.0
# List all current locks
zypper locks
zypper ll # short form
# Remove a lock
sudo zypper removelock nginx
sudo zypper rl nginx # short form
# Remove all locks
sudo zypper rl --all
# Locks are stored in a file
cat /etc/zypp/locks
Locked packages show a warning during zypper dup or zypper update but are left unchanged. This is useful for keeping a known-good version of a critical package while everything else updates.
Dependency resolution output
Zypper’s resolver output is unusually detailed. When a conflict or dependency problem occurs, it offers numbered solution choices:
Problem: package A conflicts with package B
Solution 1: Remove package B
Solution 2: Install an older version of package A
Solution 3: Do not install package A
Choose solution [1/2/3/skip/cancel]:
This is different from apt or dnf, which typically make the decision automatically. Zypper forces you to choose, which can feel slower but prevents silent surprise removals.
# Show verbose resolver output
sudo zypper in --verbose nginx
# Force zypper to not ask questions (picks first solution automatically)
sudo zypper in --non-interactive nginx
# Show what would happen without doing it
sudo zypper in --dry-run nginx
Distribution upgrades
Upgrading Tumbleweed
# Standard Tumbleweed upgrade (run regularly)
sudo zypper ref && sudo zypper dup
Tumbleweed snapshots are tested with openQA before release, but zypper dup can still occasionally require removing packages. Review the proposed changes before confirming.
Upgrading between Leap versions
# Example: upgrading from Leap 15.5 to 15.6
# 1. Refresh current system
sudo zypper ref && sudo zypper update
# 2. Update all repo URLs to the new version
sudo zypper mr --all --disable # disable all repos
sudo zypper ar -f https://download.opensuse.org/distribution/leap/15.6/repo/oss/ Leap-15.6-OSS
sudo zypper ar -f https://download.opensuse.org/update/leap/15.6/oss/ Leap-15.6-Updates
# 3. Refresh and run dup
sudo zypper ref
sudo zypper dup --download-in-advance # download everything before changing anything
# 4. Reboot
sudo reboot
--download-in-advance downloads all required packages before beginning installation, reducing the risk of a partial upgrade if the download fails mid-process.
RPM layer
Zypper uses RPM as the underlying package format. Direct RPM commands are useful for inspection and verification:
# Install a local .rpm file (DNF handles deps; rpm does not)
sudo zypper in ./package.rpm
# List all installed packages
rpm -qa
# Find which package owns a file
rpm -qf /usr/sbin/nginx
# List files installed by a package
rpm -ql nginx
# Show package information
rpm -qi nginx
# Verify package integrity against recorded checksums
rpm -V nginx
# Verify all installed packages
rpm -Va 2>/dev/null | head -20
# List GPG keys trusted by RPM
rpm -q gpg-pubkey --qf '%{summary}\n'
Cache and cleanup
# Clean all cached packages and metadata
sudo zypper clean --all
# Clean just the package cache
sudo zypper clean
# See how much space zypper's cache is using
du -sh /var/cache/zypp/
# Remove packages not required by any other package
zypper packages --unneeded
# Remove unneeded packages
sudo zypper rm $(zypper --quiet packages --unneeded | awk -F'|' 'NR>4 {gsub(/ /,""); print $3}')
Key configuration files
# Main zypper/libzypp configuration
cat /etc/zypp/zypp.conf
# Repository definitions (one file per repo)
ls /etc/zypp/repos.d/
cat /etc/zypp/repos.d/repo-oss.repo
# Package locks
cat /etc/zypp/locks
# zypper log
less /var/log/zypper.log
Quick reference
# Daily workflow (Tumbleweed)
sudo zypper ref && sudo zypper dup
# Daily workflow (Leap)
sudo zypper ref && sudo zypper update
# Install / remove
sudo zypper in pkg
sudo zypper rm pkg
# Search and inspect
zypper se term
zypper if pkg
# Repository management
zypper lr -u # list repos with URLs
sudo zypper ar URL alias # add repo
sudo zypper rr alias # remove repo
sudo zypper mr -d alias # disable repo
sudo zypper mr -p 70 alias # set priority
# Patterns
zypper patterns
sudo zypper in -t pattern name
# Locks
sudo zypper al pkg # add lock
sudo zypper rl pkg # remove lock
zypper ll # list locks
# RPM layer
rpm -qf /path/to/file # who owns this file?
rpm -ql pkg # what files are installed?
rpm -V pkg # verify integrity
Zypper’s explicit resolver output and fine-grained repository priority system make it well-suited for managing complex package sets, particularly on SUSE Linux Enterprise where stability requirements are strict. The same tooling spans both the stable Leap and rolling Tumbleweed variants, so the commands you learn work across the whole SUSE family.
Frequently Asked Questions
What is zypper?
Zypper is the command-line package manager for openSUSE Leap, openSUSE Tumbleweed, and SUSE Linux Enterprise (SLE). It handles installing, updating, removing, and searching RPM packages, with full dependency resolution and repository management. Zypper replaced the older YaST software installation module for command-line use and is known for its detailed dependency resolver output.
What is the difference between zypper update and zypper dup?
zypper update installs newer versions of installed packages without changing the installed package set — it will not switch a package to a different vendor or remove packages to resolve dependencies. zypper dup (distribution upgrade) is more aggressive: it can replace packages with equivalents from different vendors, remove packages to resolve conflicts, and is the correct command for upgrading between openSUSE versions or updating Tumbleweed. On Tumbleweed (rolling release), zypper dup is the standard upgrade command.
How do I add a repository in zypper?
Use zypper addrepo (or zypper ar) followed by the repository URL and a name alias. For example: sudo zypper ar https://download.opensuse.org/repositories/some/repo.repo alias. You can also add repositories through the openSUSE Build Service (OBS) web interface, which provides a one-click install button that configures the repo automatically. After adding, run sudo zypper refresh to update the metadata.
What are zypper patterns?
Patterns are groups of related packages that represent a system role or feature set, similar to package groups in DNF. Examples include patterns like base, devel_basis, lamp_server, and gnome. Installing a pattern installs all the packages that make up that role. You can list available patterns with zypper patterns and install one with sudo zypper install -t pattern pattern_name.
How do I prevent a package from being upgraded with zypper?
Use zypper addlock packagename (or zypper al) to add a package lock. Locked packages are not modified by zypper update or zypper dup. You can see all locks with zypper locks (or zypper ll) and remove a lock with zypper removelock packagename (or zypper rl). Locks are stored in /etc/zypp/locks.