The package manager is probably the most helpful tool for a Linux user. You can install, upgrade and remove any software/package from your Linux system with a single command. But sometimes, you need granular control over which package you want to install or upgrade and which package to block from being upgraded automatically. Why would you want to do this? Sometimes you find out that a package’s updated version is buggy. You don’t want that package to upgrade the next time you run sudo yum upgrade
. And it is a pain to upgrade each package individually.
In this tutorial, we will cover how to block certain packages from being installed or upgraded and how to block specific versions of packages or kernels from being installed.
Note: It is easy to forget what packages you have held after some time, even when their bug-free versions are out. So remain on alert as holding packages for long can introduce security issues.
We will discuss five methods here. All of these methods will involve the yum
(Yellow dog Updater, Modified) and the dnf
(Dandified YUM) package manager.
Prerequisites
- A server with CentOS or Rocky Linux or Alma Linux. Rocky Linux 9 was used for this tutorial but the commands here should work fine with the other Operating systems and older releases as well.
- A non-root user with sudo privileges.
Method 1 – Permanently Disable Package Install/Updates (Using yum.conf)
To lock a package permanently from being installed, updated, or removed, we can use the /etc/yum.conf
or /etc/dnf/dnf.conf
file.
It should look like the following.
[main]
gpgcheck=1
installonly_limit=3
clean_requirements_on_remove=True
best=True
skip_if_unavailable=False
If you want to hold a package, for example, nginx from being installed, updated, or removed, append the following line at the end of the file.
exclude=nginx
If you want to stop all nginx packages, then you can use the *
character.
exclude=nginx*
If you want to exclude more than one package, you can separate their names by space.
exclude=nginx php
The locked package will remain on the same version even if you upgrade your system. This is especially useful for holding back graphics drivers.
Let us try to install the blocked package, nginx.
$ sudo dnf install nginx
or
$ sudo yum install nginx
You will get a similar output.
Last metadata expiration check: 0:00:21 ago on Mon 05 Dec 2022 10:42:01 AM UTC.
All matches were filtered out by exclude filtering for argument: nginx
Error: Unable to find a match: nginx
You can also block packages via their architecture here. For example, if you want to block 32-bit packages, you can enter the following line in the /etc/yum.conf
file.
exclude=*.i?86 *i686
There is an important caveat with this method. While the package won’t get automatically upgraded on using the command sudo yum upgrade
or while upgrading the system, you can still remove the package manually. sudo yum remove <package>
will still work on held packages.
This method only locks them from being changed automatically. Keeping them on hold will keep them at their current versions no matter what unless you decide to remove them manually.
Block Kernel Updates
To block the kernel update, use the following command.
$ sudo dmf --exclude=kernel* update
or
$ sudo yum --exclude=kernel* update
You can use kernel*
as the package name in all the other methods to block Kernel updates.
Method 2 – Temporarily disable Package Install/Updates
This method involves using the yum command with an additional parameter.
At the time of updating any package, use the -x switch with your command to block specific packages which you don’t want to update.
$ sudo dnf -x nginx update
or
$ sudo yum -x nginx update
The above command will update all the packages except the nginx package on your system. To block multiple packages with a single command, use the -x switch multiple times.
$ sudo dnf -x nginx -x php update
or
$ sudo yum -x nginx -x php update
You can also use the –exclude switch instead of -x in the same way.
$ sudo dnf --exclude nginx, php
or
$ sudo yum --exclude nginx, php
Method 3 – Using Repository (Using .repo files)
If you have a package installed via its repository, then there is another way to stop it from being upgraded. This is done by editing its .repo
file which you can find in the /etc/yum.repos.d
directory.
Suppose your system has the Epel repository added and you don’t want to install the golang
package from it, you can block it by adding the line exclude=certbot
in the /etc/yum.repos.d/epel.repo
file as shown.
[epel]
name=Extra Packages for Enterprise Linux 8 - $basearch
# It is much more secure to use the metalink, but if you wish to use a local mirror
# place its address here.
#baseurl=https://download.example/pub/epel/8/Everything/$basearch
metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-8&arch=$basearch&infra=$infra&content=$contentdir
enabled=1
gpgcheck=1
countme=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-8
exclude=certbot
...
Now, try to install the certbot
package which is available via the Epel repository.
$ sudo dnf install certbot
or
$ sudo yum install certbot
You will get a similar output.
Extra Packages for Enterprise Linux 8 - x86_64 20 kB/s | 4.5 kB 00:00
All matches were filtered out by exclude filtering for argument: certbot
Error: Unable to find a match: certbot
Method 4 – Blocking an entire repository from updating
Alternatively, you can block an entire repository from being updated.
First, let’s check all the repositories on our system.
$ dnf repolist
or
$ yum repolist
You will get a similar output.
repo id repo name
appstream Rocky Linux 8 - AppStream
baseos Rocky Linux 8 - BaseOS
digitalocean-agent DigitalOcean Agent
docker-ce-stable Docker CE Stable - x86_64
epel Extra Packages for Enterprise Linux 8 - x86_64
extras Rocky Linux 8 - Extras
nginx-stable nginx stable repo
To exclude the Epel repository from being updated, use the following command.
$ sudo dnf update --disablerepo=epel
or
$ sudo yum update --disablerepo=epel
You can disable multiple repositories by separating their ids with commas.
$ sudo dnf update --disablerepo=epel, extras
or
$ sudo yum update --disablerepo=epel, extras
Blocking Repositories via their repo file
There is another way to block a repository which involves editing the particular repo file.
Let us open the epel.repo
file for editing.
$ sudo nano /etc/yum.repos.d/epel.repo
Change the value of the enabled
variable from 1 to 0.
[epel]
name=Extra Packages for Enterprise Linux 8 - $basearch
# It is much more secure to use the metalink, but if you wish to use a local mirror
# place its address here.
#baseurl=https://download.example/pub/epel/8/Everything/$basearch
metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-8&arch=$basearch&infra=$infra&content=$contentdir
enabled=0
gpgcheck=1
countme=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-8
...
Save the file by pressing Ctrl + X and entering Y when prompted.
Now, let’s try to install the certbot
package which is available in the epel
repository.
$ sudo dnf install certbot
or
$ sudo yum install certbot
You will get a similar output.
Last metadata expiration check: 0:02:10 ago on Mon 05 Dec 2022 10:48:31 AM UTC.
No match for argument: certbot
Error: Unable to find a match: certbot
Method 5 – Blocking Packages at a particular version (Using versionlock plugin)
Versionlock is a plugin for the Yum package manager. This plugin doesn’t allow packages to be upgraded to a version greater than what was installed at the time locking was performed.
First, install versionlock.
$ sudo dnf install dnf-plugin-versionlock
or
$ sudo yum install dnf-plugin-versionlock
This will also create a file /etc/yum/pluginconf.d/versionlock.list
on your system.
To lock the current version of mariadb-server
installed on your system, run the following command.
$ sudo dnf versionlock mariadb-server
or
$ sudo yum versionlock mariadb-server
You will get a similar output.
Last metadata expiration check: 0:01:05 ago on Mon 05 Dec 2022 12:14:16 PM UTC.
Adding versionlock on: mariadb-server-3:10.3.35-1.module+el8.6.0+1005+cdf19c22.*
You can add multiple packages at once.
$ sudo dnf versionlock evolution golang
or
$ sudo yum versionlock evolution golang
You will get a similar output.
Last metadata expiration check: 0:01:05 ago on Mon 05 Dec 2022 12:14:16 PM UTC.
Adding versionlock on: evolution-0:3.28.5-18.el8.*
Adding versionlock on: golang-0:1.18.4-1.module+el8.7.0+1073+99e3b3cd.*
Let’s try to update the mariadb-server
package.
$ sudo dnf update mariadb-server
or
$ sudo yum update mariadb-server
You will get a similar output.
Last metadata expiration check: 0:02:07 ago on Mon 05 Dec 2022 12:14:16 PM UTC.
Package mariadb-server available, but not installed.
No match for argument: mariadb-server
Error: No packages marked for upgrade.
To check the list of blocked packages via the versionlock plugin, use the following command.
$ dnf versionlock list
or
$ yum versionlock list
You will get a similar output.
Last metadata expiration check: 0:00:05 ago on Wed 07 Dec 2022 02:36:20 AM UTC.
elasticsearch-7.17.5-1.x86_64
mariadb-server-3:10.3.35-1.module+el8.6.0+1005+cdf19c22.*
evolution-0:3.28.5-18.el8.*
golang-0:1.18.4-1.module+el8.7.0+1073+99e3b3cd.*
To remove the package from the versionlock, use the following command.
$ sudo dnf versionlock delete mariadb-server
or
$ sudo yum versionlock delete mariadb-server
You will get the following output.
Deleting versionlock for: mariadb-server-3:10.3.35-1.module+el8.6.0+1005+cdf19c22.*
To discard the list and clear the blocks, use the following command.
$ sudo dnf versionlock clear
or
$ sudo yum versionlock clear
Alternatively, you can edit the file /etc/yum/pluginconf.d/versionlock.list
to block packages using the versionlock plugin.
To add an installed package to the file, use the following command.
$ sudo sh -c 'rpm -qa | grep evolution >> /etc/yum/pluginconf.d/versionlock.list'
The above command blocks the evolution
package by adding it to the list. We used rpm -qa | grep evolution
to grab the full package name. And the
sudo sh -c
command runs a sudo shell under which the commands to write to the file run.
Conclusion
That’s it for this tutorial. You should now be able to block any specific versions of any packages you don’t want to get installed or upgraded on your CentOS or Rocky Linux system.