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.