yum und dnf
Siehe auch
Software sollte soweit wie nur möglich per Paketmanager installiert und gefpelegt werden. Das Tool der Wahl auf RHEL-basierten Systemen ist yum
(ab RHEL 8+ dnf
), der ursprünglich aus CentOS stammende Paket-Manager „Yellowdog Updater, Modified“. In Fedora 22 wurde yum
gegen die verbesserte Variante dnf
(„Dandified YUM“) ausgetauscht. Das grafische GNOME-Frontend zu yum
heisst „PackageKit“.
RHEL 7: yum v3
RHEL 8+: hier kommt das auf dnf basierende yum v4 zum Einsatz (
yum
ist ein symbolischer Link aufdnf
)
Was sind dnf Modules, Streams und Profiles?
Module sind Paketgruppen, meist für Applikationen, Language Runtimes oder Toolsets.
Streams spezifizieren in den meisten Fällen die Major-Version. Streams, die „enabled“ sind, werden mit einem
[e]
indnf module list
angezeigt, „default“-Streams mit[d]
. Nicht alle Module haben einen default-Stream.Profiles geben den Use Case an, beispielsweise „client“, „common“, development“ oder „minimal“. Nicht alle Module haben ein default-Profile.
Beispiel:
dnf -y module install NAME:STREAM/PROFILE
wird dann konkret beispielsweise zudnf -y module install redis:redis-7.2/common
oderdnf -y module install mongodb/client
.
- Links:
yum/dnf Cheat Sheet
RHEL 8+:
dnf-config-manager --disable 'remi-php*'
dnf-config-manager --enable remi-php74
dnf repolist all
dnf repoquery --whatsupplements langpacks-fr
# list files in a package
dnf repoquery --list langpacks-fr
dnf list httpd
dnf list installed httpd
dnf search httpd
dnf info httpd
dnf install httpd
dnf remove httpd
dnf group list
dnf group info "Security Tools"
dnf group install "Security Tools"
dnf module list
dnf module list --installed
dnf module list httpd
dnf module info httpd
dnf module info --profile httpd:2.4
dnf module reset httpd
# Install PHP 8.1 and Redis 6.2 from Remi-Repo
dnf module install php:remi-8.1
dnf module install redis:remi-6.2
dnf module remove httpd
dnf module disable httpd
dnf update
dnf history
dnf history info 6
dnf history undo 5
Umgang mit yum/dnf erklärt
Listet verfügbare Paket-Gruppen auf. Beispiel „GNOME Desktop“:
dnf grouplist
Installiert eine Paket-Gruppe:
dnf groupinstall
Gibt Informationen zu einem Paket aus:
dnf info sysstat
Installiert ein Paket:
dnf install nano
dnf -y install openvpn-2.3.2-4.el7
Installiert ein Modul (ab yum 4 / RHEL 8+):
dnf install @perl
# or
dnf module install perl
Nur runterladen, aber nicht installieren (wird der Download abgebrochen und erneut gestartet, fängt dieser wieder von vorne an):
dnf --downloadonly --downloaddir=/root install nano
Installiert das Paket, erlaubt yum aber, falsche Bibliotheksversionen (meist neuere) zu deinstallieren und durch passende zu ersetzen:
dnf -y --allowerasing install nano
Repo hinzufügen
dnf install yum-utils
yum-config-manager --add-repo https://www.collaboraoffice.com/repos/CollaboraOnline/CODE-centos7
Deaktiviert im Beispiel das EPEL-Repository, damit ein Paket garantiert nicht aus diesem bezogen wird:
dnf -y --disablerepo=epel --allowerasing install openvas
# persistent
yum-config-manager --disable epel
Installation einer neueren Applikation aus einem anderen Repository, welches mit den RHEL-Repositories kollidiert. Im Beispiel werden alle Repositories deaktiviert, bestimmte externe Repositories aktiviert und PHP aus letzteren installiert:
dnf -y --disablerepo=* --enablerepo=remi-php55,remi install php
Paket entfernen
dnf remove fail2ban
Bemerkung
Fast alle Pakete sind so gebaut, dass ein yum remove
angepasste Konfigurationsdateien nicht entfernt.
Listet verfügbare Pakete auf.
dnf list
Listet alle installierten Pakete auf:
dnf list installed
Listet alle installierten PHP-Pakete auf:
dnf list installed php*
Listet verfügbare Pakete auf:
dnf list available
Prüft, ob Updates verfügbar sind:
dnf list updates
Verfügbare Updates für Apache, PHP, MariaDB oder cURL anzeigen (der Befehl liefert den Status-Code 100 zurück, wenn Updates vorliegen.:
dnf check-update | grep -i 'apache\|php\|mysql\|curl'
Wie oben, aber eingeschränkt auf z.B. den Kernel:
dnf list updates kernel
Listet alle installierten Kernel auf und prüft zusätzlich, ob eine neue Kernel-Version als Update verfügbar ist:
dnf list update kernel
Aktualisiert das Betriebssystem sowie alle installierten Pakete:
dnf update
Bereits installierte Software auf eine festgelegte Versionsnummer updaten:
dnf update-to openvpn-2.3.2-4.el7
Sucht nach einer Datei in allen Paketen:
dnf whatprovides */sar
Pakethistorie - alle Pakete anzeigen lassen, die nicht zur Basisausstattung der Distribution gehören, sondern die manuell installiert wurden:
dnf history userinstalled
Yum-Datenbank sowie verwaiste Dateien in /var/cache/yum bereinigen und Liste der schnellsten Mirror-Server löschen - dies sollte vor allen Dingen dann gemacht werden, wenn Repos deaktiviert oder entfernt wurden:
dnf clean all
Bemerkung
Die Option -y
bzw. --assumeyes
beantwortet die Nachfrage Is this ok [y/d/N]
automatisch mit einem „Yes“.
Mirror-Server zu langsam, zu wenig aktuell, gibt immer wieder Fehler? Einfach ignorieren:
exclude = mirror.example.com
Package Key Rotation
Die Maintainer tauschen den GPG- oder RSA-Key beispielsweise aus Gründen der Sicherheit oder des Alters aus? Hier am Beispiel des Icinga-Repos, gilt aber für alle Repos.
Falls die Maschine bereits Pakete aus dem Repo installiert hat, lassen sich diese danach nicht mehr aktualisieren (und auch keine weiteren aus dem Repo installieren). yum/dnf beschwert sich dann mit folgendem Fehler:
dnf -y install icinga2-doc
GPG key at file:///etc/pki/rpm-gpg/RPM-GPG-KEY-ICINGA (0x34410682) is already installed
The GPG keys listed for the "ICINGA (stable release)" repository are already installed but they are not correct for this package.
Check that the correct key URLs are configured for this repository.. Failing package is: icinga2-doc-2.14.2-1.el8.x86_64
GPG Keys are configured as: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-ICINGA
The downloaded packages were saved in cache until the next successful transaction.
You can remove cached packages by executing 'dnf clean packages'.
Error: GPG check FAILED
Passiert, wenn der Repo-Key als Datei abgelegt wurde (/etc/yum.repos.d/ICINGA-release.repo
definiert die Ablage des Keys in /etc/pki/rpm-gpg/RPM-GPG-KEY-ICINGA
). Man benötigt also den neuen Key.
Wer LFOps/Ansible benutzt:
Re-Deployment der Repo-Definitionen per Ansible
Wer das manuell oder per Ansible Ad-hoc-Kommando macht:
# download the new key
curl --output /etc/pki/rpm-gpg/RPM-GPG-KEY-ICINGA https://packages.icinga.com/icinga.key
# import the new key to the rpm database
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-ICINGA
Was auch geht: Alternativ kann man auch ein unbedeutendes und winziges Paket aus dem Repo installieren, und so neben der Installation auch ein Update des Keys erzwingen:
dnf -y install icinga2-doc
dnf -y remove icinga2-doc
Kernel-Versionen verwalten
yum
ist in der Lage, den Kernel upzugraden oder bestimmte Kernel-Versionen zu installieren. Standardmässig hält yum
fünf, dnf
dagegen drei Kernel-Versionen vor, in die man die Maschine booten kann. Unter Umständen hilft es, die Anzahl zu erhöhen, besonders unter Fedora Workstation:
installonly_limit=10
Jede einzelne Kernel-Version beansprucht auf /boot
knapp 70 bis 100 MB Plattenplatz.
So installiert man eine bestimmte Kernel-Version:
dnf list kernel
dnf -y install kernel-3.10.0-229.11.1.el7
So entfernt man alle alten Kernel-Versionen, bis auf die beiden neuesten:
dnf -y install yum-utils
package-cleanup --oldkernels --count=2
Version Pinning
Das Kapitel hat eine eigene Seite spendiert bekommen: Version-Pinning.
Nur sicherheitskritische Updates
Wer beispielsweise im Rahmen von Common Criteria nur sicherheitskritsche Updates installieren und Bug Fixes sowie Erweiterungen (Enhancements) aussen vor lassen möchte, verwendet yum
so:
dnf -y install yum-plugin-security
dnf updateinfo
dnf list --security
dnf update --security
Automatische Updates
yum
hält nicht nur das Betriebssystem, sondern sämtliche über den Paketmanager installierte Software auf dem aktuellsten Stand. Das betrifft Behebung von Fehlern und besonders die Schliessung von Sicherheitslücken. Letztere werden nach dem Common Vulnerabilities and Exposures (CVE)-Standard benannt, einer einheitlichen Namenskonvention für Schwachstellen und Sicherheitsrisiken, wodurch ein reibungsloser Informationsaustausch zwischen den verschiedenen Datenbanken einzelner Hersteller möglich ist.
Folgendes Tool gibt Auskunft darüber, welche Prozess-IDs nach einem yum update
neu gestartet werden müssen:
dnf -y install yum-utils
# long list of all updated services (process list)
needs-restarting
# list the affected systemd services only
needs-restarting --services
# kernel-updates and full reboot necessary? check the return code (<> 0: needs reboot)
needs-restarting --reboothint
So kann man automatische Updates per Cron einrichten: yum
soll dabei ausschliesslich Fehler per E-Mail melden (Voraussetzung ist, dass bereits der E-Mail-Versand in cron
konfiguriert ist) und zufällig zwischen 03:00 und 03:59 Uhr in der Nacht ausgeführt werden.
echo '00 03 * * * sleep $(( $RANDOM \% 3540)); /usr/bin/yum -y --errorlevel=0 update 1> /dev/null; /usr/bin/needs-restarting > /tmp/nr; if [ -s /tmp/nr ]; then /usr/sbin/reboot; fi' >> /var/spool/cron/root
Downgrade / Undo
Funktioniert nur bei Paketen, die in nur einer Version installiert werden können - also beispielsweise nicht für den Linux-Kernel, C-Libraries, SELinux oder D-Bus.
Warnung
Downgrade auf Produktivsystemen? Vorher prüfen, ob ein Backup des Systems vorhanden ist.
Möglicherweise lässt sich ein Downgrade so durchführen:
cat /var/log/yum.log | grep mypackage
# getting "Aug 08 ... Updated: mypackage-..."
# list the Yum-IDs for all updates
dnf history
# looking for the ID on updates from Aug 08
# getting "277"
# what was done during the update?
dnf history info 277
# ok, try to undo
dnf history undo 277
So geht es auch:
dnf list mypackage --showduplicates
dnf downgrade mypackage-2.7.10-1.el7.noarch
Erhält man die Meldung Only Upgrade available on package ...
, dann ist die alte Version (aus gutem Grund) aus den Basis-Repositories entfernt worden. In dem Fall das Vault-Repo aktivieren: das Repository für den alten Kram. Auf einem CentOS 6.7 aktiviert man dann beispielsweise das [C6.6-base]
:
[C6.6-base]
name=CentOS-6.6 - Base
baseurl=http://vault.centos.org/6.6/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
enabled=1
Jetzt kann die Suche nach alten Versionen wieder wie oben starten.
Der eigentliche Downgrade liefert einen Fehler - Yum kann Paketabhängigkeiten beim Downgrade (zum Glück) nicht auflösen? Hier ist Handarbeit angesagt:
dnf downgrade iptables
# Resolving Dependencies
# ---> Package iptables.x86_64 0:1.4.7-14.el6 will be a downgrade
# ---> Package iptables.x86_64 0:1.4.7-16.el6 will be erased
# Error: Package: iptables-ipv6-1.4.7-16.el6.x86_64 (@base)
# Requires: iptables = 1.4.7-16.el6
Daher gilt:
dnf downgrade iptables iptables-ipv6
… oder explizit eine bestimmte Version installieren:
dnf -y install iptables-1.4.7-14.el6
Warnung
Die Pakete werden beim nächsten yum update
natürlich wieder aktualisiert. Um das im Beispiel für iptables
zu verhindern, konfiguriert man Yum:
echo "exclude=iptables*" >> /etc/yum.conf
Nach der Aktion nicht vergessen, das Vault
-Repository wieder zu deaktivieren.
Alle Updates und Software-Installationen verhindern:
echo "exclude=*" >> /etc/yum.conf
rpmnew- und rpmsave-Dateien
Was ist der Unterschied zwischen einer *.rpmnew
- und einer *.rpmsave
-Datei?
Die Basis für die Paketmanager yum
und dessen Nachfolger dnf
sind RPM-Pakete. Ein gut definiertes RPM-Paket kennt den Unterschied zwischen Konfigurationsdateien und anderen Dateitypen und regelt auch den Umgang mit ihnen, für den Fall, dass ein Paket-Update mit neueren Konfigurationsdateien kommt, diese aber durch den Systemadmin bereits angepasst wurden - ein Überschreiben der Konfigurationsdateien wird somit vermieden.
Ein SysAdmin sollte nach jedem Update nach diesen Dateien suchen, und falls gefunden untersuchen und vergleichen.
- rpmnew - the new default config file
rpmnew
-Dateien werden angelegt, falls ein Update Änderungen an den originalen Konfigurationsdateien mit sich bringt - sei es, dass Einstellungen hinzugekommen oder weggefallen sind oder sich bestehende geändert haben. Es handelt sich dabei also um die originale Konfigurationsdatei in einer neuen Version. Die bestehende Konfigurationsdatei bleibt unangetastet. Die Neuerungen muss man manuell untersuchen und gegebenenfalls die ursprüngliche Konfigurationsdatei entsprechend nachziehen. Anschliessend kann die.rpmnew
-Datei gelöscht werden.- rpmsave - your old config file backed up
Das Update bringt so viele oder wichtige Änderungen an den Konfigurationsdateien mit sich, dass sie vom Paketmanager ausgetauscht wurden. Die Konfigurationsdateien aus dem Update kommen also zum Zug. Die ursprünglich vom Systemadmin vorgesehene Version wird mit der Endung
rpmsave
versehen. Diese Dateien bleiben auch bei der Deinstallation diverser Pakete wie z.B. chrony oder rsyslog auf dem System liegen.
Um anzupassende Konfigurationsdateien zu finden und zu bearbeiten, gibt es zwei Wege: entweder find / -name *.rpmnew
, und dann diff
, mv
, cp
, rm
, whatever…, oder rpmconf
verwenden:
dnf install rpmconf
rpmconf --all
Configuration file '/var/lib/unbound/root.key'
-rw-r--r--. 1 unbound unbound 818 Aug 4 2017 /var/lib/unbound/root.key.rpmnew
-rw-r--r--. 1 unbound unbound 1250 Sep 24 20:06 /var/lib/unbound/root.key
==> Package distributor has shipped an updated version.
What would you like to do about it ? Your options are:
Y or I : install the package maintainer's version
N or O : keep your currently-installed version
D : show the differences between the versions
M : merge configuration files
Z : background this process to examine the situation
S : skip this file
The default action is to keep your current version.
Repos
Umgang mit Repos
Kurzfristig ein sonst deaktiviertes Repo verwenden (angenommen, EPEL wäre deaktiviert):
dnf --enablerepo epel install ntfs-3g
Ein Repo dauerhaft deaktivieren - 3 Wege:
repo-Datei editieren und
enabled=1
aufenabled=0
stellenyum-config-manager --disable epel
mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.disabled
Jede andere Dateiendung als .repo führt dazu, dass die Repo-Datei ignoriert wird.
Verhalten bei Repo-Änderungen
Angenommen, MariaDB-server
wird aus Repo A installiert, und yum info MariaDB-server
zeigt erwartungsgemäss an, dass das Paket aus Repo A stammt. Nun wird Repo A entfernt, und ein völlig anderes Repo B aktiviert - mit neuer Download-URL und anderen (neueren) Versionen von MariaDB-server
. Es wird ein yum update
durchgeführt - was passiert?
Yum wird das Paket aus dem neuen Repo B ziehen und updaten, egal, ob es ursprünglich aus Repo A stammte. Wichtig ist nur, dass der Name des Software-Paketes übereinstimmt.
Aufbau einer Repo-Konfigurationsdatei
Ein Beispiel für eine minimale Repository-Konfigurationsdatei:
[inhouse]
name=my internal repo
baseurl=http://mirror/$releasever/$basearch/
gpgcheck=0
Wie sieht man, mit was $releasever
, $basearch
und andere yum-Variablen gefüttert werden?
RHEL 7:
python -c 'import yum, json; yb = yum.YumBase(); print json.dumps(yb.conf.yumvar, indent=2)'
RHEL 8:
/usr/libexec/platform-python -c 'import dnf, json; db = dnf.dnf.Base(); print(json.dumps(db.conf.substitutions, indent=2))'
Sonstiges
Outboud Proxy
echo $http_proxy
# The proxy server - proxy server:port number
proxy=http://mycache.mydomain.com:3128
# The account details for yum connections
proxy_username=yum-user
proxy_password=qwerty
Caching
Daten und Pakete, die Yum für die Installation oder zur Aktualisierung benötigt und heruntergeladen hat, werden nach erfolgreicher Anwendung gelöscht, was den Speicherplatzverbrauch minimiert. Yum lässt sich so konfigurieren, dass es die Dateien behält, indem man Caching einschaltet:
sed -i "s/.*keepcache=0.*/keepcache=1/g" /etc/yum.conf
Vorteile:
Yum arbeitet schneller.
Yum kann so auch ohne Netzwerkverbindung und nur auf Basis des Caches arbeiten.
Pakete lassen sich aus dem Cache kopieren und woanders einsetzen.
So aktiviert man die Einstellung ohne Installation von Software:
dnf list
Der in /var/cache/yum
erzeugte Cache wird inkl. der heruntergeladenen RPMs auf einem RHEL 7 Minimalsystem schnell um die 500 MB gross. Das Cache-Verzeichnis kann bei Bedarf jederzeit per rm -rf /var/cache/yum/*
geleert werden.
Verifying Keys
Prüfen des Keys eines Packages:
rpm --checksig PACKAGE_FILE
yum.log
Was bedeutet die „1:“, „32:“ usw. vor dem Paketnamen im yum.log?
Beispiel:
1:grub2-common-2.02-0.65.el7.centos.2.noarch
1:grub2-pc-modules-2.02-0.65.el7.centos.2.noarch
32:bind-license-9.9.4-51.el7_4.1.noarch
Die Zahl bezeichnet die RPM-Epoche (Standard: „0:“) - sie überschreibt die normale Reihenfolge im Versionsvergleich. Möchte man also als Package-Maintainer ein älteres Paket als Upgrade definieren, arbeitet man mit RPM-Epochennummern > 0.
Troubleshooting
- Error in PREIN scriptlet in rpm package xyz-7.0, xyz-6.0 was supposed to be removed but is not!
In diesem konkreten Beispiel ist das 7.0-Paket davon ausgegangen, dass das 6.0-Paket entfernt wurde - ist es aber nicht, oder aber die RPM-Datenbank und der yum-Cache sind nicht mehr synchronisiert. Das kann helfen:
# not critical dnf clean all rpm --rebuilddb package-cleanup --problems
Falls immer noch nicht, kann man das probieren, aber Obacht: Am Ende war die Installation kaputt.
# Be careful: this is done without any "are you sure" prompting rpm --erase --noscripts --nodeps openvas-scanner-6.0.0-6930.el7.art.x86_64
- Problem: cannot install both iptables-libs-1.8.10-4.el9_4.x86_64 from baseos and iptables-libs-1.8.10-2.el9.x86_64 from @System
Detaillierte Meldung:
package iptables-legacy-1.8.10-2.2.el9.x86_64 from @System requires (iptables-libs(x86-64) = 1.8.10-2.el9 or iptables-libs(x86-64) = 1.8.10-2.el9_1), but none of the providers can be installed
cannot install the best update candidate for package iptables-libs-1.8.10-2.el9.x86_64
cannot install the best update candidate for package iptables-legacy-1.8.10-2.2.el9.x86_64
Abhilfe:
dnf update --allowerasing dnf install iptables reboot
Built on 2024-11-18