Wie man Paket- und Kernel-Updates in CentOS / Rocky Linux blockiert

Der Paketmanager ist wahrscheinlich das hilfreichste Werkzeug für einen Linux-Benutzer. Du kannst jede Software/jedes Paket auf deinem Linux-System mit einem einzigen Befehl installieren, aktualisieren und entfernen. Aber manchmal brauchst du eine genaue Kontrolle darüber, welche Pakete du installieren oder upgraden willst und welche Pakete nicht automatisch upgegradet werden sollen. Warum solltest du das tun wollen? Manchmal stellst du fest, dass die aktualisierte Version eines Pakets fehlerhaft ist. Du willst nicht, dass dieses Paket beim nächsten Mal, wenn du sudo yum upgrade aufrufst, aktualisiert wird. Und es ist mühsam, jedes Paket einzeln zu aktualisieren.

In diesem Lernprogramm erfahren Sie, wie Sie bestimmte Pakete von der Installation oder Aktualisierung ausschließen und wie Sie die Installation bestimmter Versionen von Paketen oder Kerneln verhindern.

Hinweis: Es ist leicht, nach einiger Zeit zu vergessen, welche Pakete du zurückgehalten hast, selbst wenn es fehlerfreie Versionen gibt. Bleib also wachsam, denn wenn du Pakete lange zurückhältst, kann das zu Sicherheitsproblemen führen.

Wir werden hier fünf Methoden besprechen. Für alle diese Methoden werden der yum (Yellow dog Updater, Modified) und der dnf (Dandified YUM) Paketmanager verwendet.

Voraussetzungen

  • Ein Server mit CentOS oder Rocky Linux oder Alma Linux. Für diesen Lehrgang wurde Rocky Linux 9 verwendet, aber die Befehle hier sollten auch mit anderen Betriebssystemen und älteren Versionen gut funktionieren.
  • Ein Nicht-Root-Benutzer mit sudo-Rechten.

Methode 1 – Paketinstallation/Updates dauerhaft sperren (mit yum.conf)

Um ein Paket dauerhaft für die Installation, Aktualisierung oder Entfernung zu sperren, können wir die Datei /etc/yum.conf oder /etc/dnf/dnf.conf verwenden.

Sie sollte wie die folgende aussehen.

[main]
gpgcheck=1
installonly_limit=3
clean_requirements_on_remove=True
best=True
skip_if_unavailable=False

Wenn du ein Paket, zum Beispiel nginx, daran hindern willst, installiert, aktualisiert oder entfernt zu werden, füge die folgende Zeile am Ende der Datei an.

exclude=nginx

Wenn du alle nginx-Pakete stoppen willst, kannst du das Zeichen * verwenden.

exclude=nginx*

Wenn du mehr als ein Paket ausschließen willst, kannst du ihre Namen durch ein Leerzeichen trennen.

exclude=nginx php

Das gesperrte Paket bleibt auf der gleichen Version, auch wenn du dein System aktualisierst. Das ist besonders nützlich, um Grafiktreiber zurückzuhalten.

Versuchen wir, das gesperrte Paket, nginx, zu installieren.

$ sudo dnf install nginx
or
$ sudo yum install nginx

Du wirst eine ähnliche Ausgabe erhalten.

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

Du kannst hier auch Pakete über ihre Architektur blockieren. Wenn du zum Beispiel 32-Bit-Pakete blockieren willst, kannst du die folgende Zeile in die Datei /etc/yum.conf eingeben.

exclude=*.i?86 *i686

Bei dieser Methode gibt es einen wichtigen Vorbehalt. Das Paket wird zwar nicht automatisch aktualisiert, wenn du den Befehl sudo yum upgrade verwendest oder das System aktualisierst, aber du kannst das Paket trotzdem manuell entfernen. sudo yum remove <package> funktioniert auch bei gehaltenen Paketen.

Diese Methode verhindert nur, dass sie automatisch geändert werden. Wenn du sie in der Warteschleife hältst, bleiben sie auf jeden Fall in ihrer aktuellen Version, es sei denn, du entscheidest dich, sie manuell zu entfernen.

Kernel-Updates blockieren

Um das Kernel-Update zu blockieren, verwende den folgenden Befehl.

$ sudo dmf --exclude=kernel* update
or
$ sudo yum --exclude=kernel* update

Du kannst kernel* als Paketname in allen anderen Methoden verwenden, um Kernel-Updates zu blockieren.

Methode 2 – Paketinstallation/-aktualisierung vorübergehend deaktivieren

Bei dieser Methode verwendest du den yum-Befehl mit einem zusätzlichen Parameter.

Wenn du ein Paket aktualisieren willst, kannst du mit der Option -x bestimmte Pakete blockieren, die du nicht aktualisieren willst.

$ sudo dnf -x nginx update
or
$ sudo yum -x nginx update

Der obige Befehl wird alle Pakete außer dem nginx-Paket auf deinem System aktualisieren. Um mehrere Pakete mit einem einzigen Befehl zu blockieren, verwende die Option -x mehrmals.

$ sudo dnf -x nginx -x php update
or
$ sudo yum -x nginx -x php update

Du kannst auch den –exclude Schalter anstelle von -x auf die gleiche Weise verwenden.

$ sudo dnf --exclude nginx, php
or
$ sudo yum --exclude nginx, php

Methode 3 – Repository verwenden (Verwendung von .repo-Dateien)

Wenn du ein Paket über sein Repository installiert hast, gibt es noch eine andere Möglichkeit, um zu verhindern, dass es aktualisiert wird. Dazu bearbeitest du seine .repo Datei, die du im /etc/yum.repos.d Verzeichnis findest.

Angenommen, dein System hat das Epel-Repository hinzugefügt und du möchtest das Paket golang nicht daraus installieren, dann kannst du es blockieren, indem du die Zeile exclude=certbot in der Datei /etc/yum.repos.d/epel.repo hinzufügst, wie gezeigt.

[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
...

Versuche nun, das Paket certbot zu installieren, das über das Epel-Repository verfügbar ist.

$ sudo dnf install certbot
or
$ sudo yum install certbot

Du wirst eine ähnliche Ausgabe erhalten.

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

Methode 4 – Blockieren eines gesamten Repositorys für die Aktualisierung

Alternativ kannst du auch ein ganzes Repository vor der Aktualisierung schützen.

Prüfen wir zunächst alle Repositories in unserem System.

$ dnf repolist
or
$ yum repolist

Du wirst eine ähnliche Ausgabe erhalten.

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

Um das Repository Epel von der Aktualisierung auszuschließen, verwendest du den folgenden Befehl.

$ sudo dnf update --disablerepo=epel
or
$ sudo yum update --disablerepo=epel

Du kannst mehrere Repositories deaktivieren, indem du ihre IDs mit Kommas trennst.

$ sudo dnf update --disablerepo=epel, extras
or
$ sudo yum update --disablerepo=epel, extras

Repositories über ihre Repo-Datei blockieren

Es gibt noch eine andere Möglichkeit, ein Repository zu blockieren, indem du die jeweilige Repo-Datei bearbeitest.

Öffnen wir die Datei epel.repo zum Bearbeiten.

$ sudo nano /etc/yum.repos.d/epel.repo

Ändere den Wert der Variable enabled von 1 auf 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
...

Speichere die Datei, indem du Strg + X drückst und Y eingibst, wenn du dazu aufgefordert wirst.

Versuchen wir nun, das Paket certbot zu installieren, das im Repository epel verfügbar ist.

$ sudo dnf install certbot
or
$ sudo yum install certbot

Du wirst eine ähnliche Ausgabe erhalten.

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

Methode 5 – Pakete mit einer bestimmten Version blockieren (mit dem Versionlock-Plugin)

Versionlock ist ein Plugin für den Yum-Paketmanager. Dieses Plugin verhindert, dass Pakete auf eine höhere Version aktualisiert werden als die, die zum Zeitpunkt der Sperrung installiert war.

Installiere zunächst Versionlock.

$ sudo dnf install dnf-plugin-versionlock
or
$ sudo yum install dnf-plugin-versionlock

Dadurch wird auch eine Datei /etc/yum/pluginconf.d/versionlock.list auf deinem System erstellt.

Um die aktuell auf deinem System installierte Version von mariadb-server zu sperren, führe den folgenden Befehl aus.

$ sudo dnf versionlock mariadb-server
or
$ sudo yum versionlock mariadb-server

Du wirst eine ähnliche Ausgabe erhalten.

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.*

Du kannst mehrere Pakete auf einmal hinzufügen.

$ sudo dnf versionlock evolution golang
or
$ sudo yum versionlock evolution golang

Du erhältst dann eine ähnliche Ausgabe.

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.*

Lass uns versuchen, das Paket mariadb-server zu aktualisieren.

$ sudo dnf update mariadb-server
or
$ sudo yum update mariadb-server

Du erhältst eine ähnliche Ausgabe.

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.

Um die Liste der blockierten Pakete über das Versionlock-Plugin zu überprüfen, verwende den folgenden Befehl.

$ dnf versionlock list
or
$ yum versionlock list

Du erhältst eine ähnliche Ausgabe.

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.*

Um das Paket aus dem Versionlock zu entfernen, verwende den folgenden Befehl.

$ sudo dnf versionlock delete mariadb-server
or
$ sudo yum versionlock delete mariadb-server

Du erhältst die folgende Ausgabe.

Deleting versionlock for: mariadb-server-3:10.3.35-1.module+el8.6.0+1005+cdf19c22.*

Um die Liste zu verwerfen und die Sperren zu löschen, verwende den folgenden Befehl.

$ sudo dnf versionlock clear
or
$ sudo yum versionlock clear

Alternativ kannst du auch die Datei /etc/yum/pluginconf.d/versionlock.list bearbeiten, um Pakete mit dem Versionlock-Plugin zu blockieren.

Um ein installiertes Paket zu der Datei hinzuzufügen, verwende den folgenden Befehl.

$ sudo sh -c 'rpm -qa | grep evolution >> /etc/yum/pluginconf.d/versionlock.list'

Der obige Befehl blockiert das Paket evolution, indem er es der Liste hinzufügt. Wir haben rpm -qa | grep evolution verwendet, um den vollständigen Paketnamen zu erhalten. Und der

sudo sh -c Befehl führt eine sudo-Shell aus, unter der die Befehle zum Schreiben in die Datei ausgeführt werden.

Fazit

Das war’s für diesen Lehrgang. Du solltest jetzt in der Lage sein, bestimmte Versionen von Paketen zu blockieren, die du nicht auf deinem CentOS- oder Rocky-Linux-System installieren oder aktualisieren möchtest.

Das könnte dich auch interessieren …