22 update-alternatives: Verwalten mehrerer Befehls- und Dateiversionen #
Häufig sind gleich mehrere Versionen eines Werkzeugs auf einem System installiert. Mit dem Alternativen-System lassen sich diese Versionen konsistent verwalten. So können die Administratoren eine Auswahl treffen und es ist möglich, verschiedene Versionen nebeneinander zu installieren und zu nutzen.
22.1 Übersicht #
Auf SUSE Linux Enterprise Server haben mehrere Programme identische oder ähnliche Aufgaben. Wenn beispielsweise sowohl Java 1.7 als auch Java 1.8 auf einem System installiert sind, wird das Skript des Alternativen-Systems (update-alternatives) aus dem RPM-Paket heraus aufgerufen. Standardmäßig verweist das Alternativen-System auf Version 1.8: Höhere Versionen besitzen auch eine höhere Priorität. Der Administrator kann jedoch die Standardeinstellung ändern, sodass der generische Name auf Version 1.7 verweist.
In diesem Kapitel gilt die folgende Terminologie:
- Administrationsverzeichnis
Das Standardverzeichnis
/var/lib/rpm/alternativesenthält Informationen zum aktuellen Status der Alternativen.- Alternativ
Name einer bestimmten Datei im Dateisystem. Der Zugriff auf diese Datei erfolgt anhand eines generischen Namens über das Alternativen-System.
- Alternativen-Verzeichnis
Standardverzeichnis
/etc/alternativesmit symbolischen Links.- Generischer Name
Name (z. B.
/usr/bin/edit), der auf eine von mehreren über das Alternativen-System verfügbaren Dateien verweist.- Link-Gruppe
Gruppe zusammengehöriger symbolischer Links, die als Gruppe aktualisiert werden können.
- Master-Link
Link in Link-Gruppe, der bestimmt, wie die anderen Links in der Gruppe konfiguriert werden.
- Slave-Link
Link in einer Link-Gruppe, der durch den Master-Link gesteuert wird.
- Symbolischer Link (Symlink)
Datei, die auf eine andere Datei in demselben Dateisystem verweist. Das Alternativen-System schaltet über symbolische Links im Alternativen-Verzeichnis zwischen den verschiedenen Versionen einer Datei um.
Der Administrator kann die symbolischen Links im Alternativen-Verzeichnis mit dem Befehl
update-alternativesbearbeiten.
Mit dem Befehl update-alternatives im Alternativen-System lassen sich symbolische Links erstellen entfernen und pflegen sowie Informationen zu diesen Links abrufen. Diese symbolischen Links verweisen in der Regel auf Befehle, können allerdings auch auf JAR-Archive, man-Seiten und andere Dateien verweisen. Die Beispiele in diesem Kapitel zeigen Befehle und man-Seiten, gelten jedoch auch für andere Dateitypen.
Im Alternativen-Verzeichnis legt das Alternativen-System die Links zu möglichen Alternativen ab. Wenn ein neues Paket mit einer Alternative installiert wird, wird die neue Alternative in das System aufgenommen. Die Entscheidung, ob die Alternative des neuen Pakets als Standard festgelegt werden soll, ist abhängig von der Priorität des Pakets und vom ausgewählten Modus. Pakete mit einer höheren Version haben auch eine höhere Priorität. Das Alternativen-System bietet zwei Modi:
Automatischer Modus. In diesem Modus sorgt das Alternativen-System dafür, dass die Links in der Gruppe auf die geeigneten Alternativen mit der höchsten Priorität für die Gruppe verweisen.
Manueller Modus. In diesem Modus nimmt das Alternativen-System keine Änderungen an den Einstellungen des Systemadministrators vor.
Für das Kommando java gilt beispielsweise die folgende Link-Hierarchie im Alternativen-System:
22.2 Einsatzbereiche #
Standardmäßig wird das Skript update-alternatives aus einem RPM-Paket heraus aufgerufen. Wenn ein Paket installiert oder entfernt wird, bearbeitet das Skript alle zugehörigen symbolischen Links. Sie können das Skript jedoch auch manuell über die Befehlszeile ausführen und so:
die aktuellen Alternativen für einen generischen Namen abrufen.
die Standardeinstellungen für eine Alternative ändern.
eine Gruppe zusammengehöriger Dateien für eine Alternative erstellen.
22.3 Überblick über Alternativen #
Die Namen aller konfigurierten Alternativen erhalten Sie mit:
>ls /var/lib/alternatives
Einen Überblick über alle konfigurierten Alternativen und deren Werte erhalten Sie mit
>sudoupdate-alternatives --get-selectionsasadmin auto /usr/bin/asadmin-2.7 awk auto /usr/bin/gawk chardetect auto /usr/bin/chardetect-3.6 dbus-launch auto /usr/bin/dbus-launch.x11 default-displaymanager auto /usr/lib/X11/displaymanagers/gdm [...]
22.4 Anzeigen von Details zu spezifischen Alternativen #
Am einfachsten überprüfen Sie die Alternativen, wenn Sie den symbolischen Links des Befehls folgen. Um beispielsweise herauszufinden, worauf sich der Befehl java bezieht, verwenden Sie den folgenden Befehl:
>readlink --canonicalize /usr/bin/java/usr/lib64/jvm/jre-10-openjdk/bin/java
Falls jeweils derselbe Pfad angezeigt wird (in diesem Beispiel /usr/bin/java), stehen keine Alternativen für diesen Befehl zur Auswahl.
Mit der Option --display rufen Sie sämtliche Alternativen (mit Slaves) ab:
>sudoupdate-alternatives --display javajava - auto mode link best version is /usr/lib64/jvm/jre-1.8.0-openjdk/bin/java link currently points to /usr/lib64/jvm/jre-1.8.0-openjdk/bin/java link java is /usr/bin/java slave java.1.gz is /usr/share/man/man1/java.1.gz slave jre is /usr/lib64/jvm/jre slave jre_exports is /usr/lib64/jvm-exports/jre slave keytool is /usr/bin/keytool slave keytool.1.gz is /usr/share/man/man1/keytool.1.gz slave orbd is /usr/bin/orbd slave orbd.1.gz is /usr/share/man/man1/orbd.1.gz [...]
22.5 Festlegen der Standardversion von Alternativen #
Standardmäßig verweisen die Kommandos unter /usr/bin auf das Alternativen-Verzeichnis mit der höchsten Priorität. Der Befehl java gibt beispielsweise standardmäßig die folgende Versionsnummer zurück:
>java -versionopenjdk version "10.0.1" 2018-04-17 OpenJDK Runtime Environment (build 10.0.1+10-suse-lp150.1.11-x8664) OpenJDK 64-Bit Server VM (build 10.0.1+10-suse-lp150.1.11-x8664, mixed mode)
Ändern Sie die Standardeinstellung, sodass der Befehl java auf eine frühere Version verweist, mit dem folgenden Befehl:
>sudoupdate-alternatives --config javaroot's password: There are 2 choices for the alternative java (providing /usr/bin/java). Selection Path Priority Status ------------------------------------------------------------ * 0 /usr/lib64/jvm/jre-10-openjdk/bin/java 2005 auto mode 1 /usr/lib64/jvm/jre-1.8.0-openjdk/bin/java 1805 manual mode 2 /usr/lib64/jvm/jre-10-openjdk/bin/java 2005 manual mode 3 /usr/lib64/jvm/jre-11-openjdk/bin/java 0 manual mode Press <enter> to keep the current choice[*], or type selection number:
Die genaue Java-Versionsnummer ist dabei abhängig von Ihrem System und von den installierten Versionen. Wenn Sie 1 ausgewählt haben, zeigt java die folgende Versionsnummer an:
>java -versionjava version "1.8.0_171" OpenJDK Runtime Environment (IcedTea 3.8.0) (build 1.8.0_171-b11 suse-lp150.2.3.1-x86_64) OpenJDK 64-Bit Server VM (build 25.171-b11, mixed mode)
Beachten Sie auch die folgenden Punkte:
Wenn Sie im manuellen Modus arbeiten und eine andere Java-Version installieren, behält das Alternativen-System sowohl die Links als auch den generischen Namen unverändert bei.
Wenn Sie im automatischen Modus arbeiten und eine andere Java-Version installieren, ändert das Alternativen-System den Java-Master-Link und alle Slave-Links (siehe Abschnitt 22.4, „Anzeigen von Details zu spezifischen Alternativen“). Prüfen Sie die Master-Slave-Beziehungen mit dem folgenden Befehl:
>sudoupdate-alternatives --display java
22.6 Installieren von benutzerdefinierten Alternativen #
In diesem Abschnitt erfahren Sie, wie Sie benutzerdefinierte Alternativen in einem System einrichten.
Installieren Sie keine benutzerdefinierten Alternativen für python3. /usr/bin/python3 hat keine Update-Alternativen und verweist immer auf bestimmte getestete Versionen. Das Erstellen einer benutzerdefinierten python3-Alternative, die auf eine andere Version verweist – z. B. python 3.11 – beschädigt abhängige Systemwerkzeuge.
Für das Beispiel gelten die folgenden Annahmen:
Es gibt zwei Skripte –
foo-2undfoo-3– mit ähnlicher Funktionalität.Die Skripte sind im Verzeichnis
/usr/local/bingespeichert, sodass keine Konflikte mit den Systemwerkzeugen unter/usr/binentstehen.Der Master-Link
fooverweist entweder auffoo-2oder auffoo-3.
So richten Sie Alternativen im System ein:
Kopieren Sie die Skripte in das Verzeichnis
/usr/local/bin.Machen Sie die Skripte ausführbar:
>sudochmod +x /usr/local/bin/foo-{2,3}Führen Sie
update-alternativesfür beide Skripte aus:>sudoupdate-alternatives --install \ /usr/local/bin/foo 1\ foo 2\ /usr/local/bin/foo-2 3\ 200 4>sudoupdate-alternatives --install \ /usr/local/bin/foo 1\ foo 2\ /usr/local/bin/foo-3 3\ 300 4Die Optionen nach
--installbedeuten:Generischer Name. Zur Bedeutung: Dies ist in der Regel der Skriptname ohne Versionsnummern.
Name des Master-Links. Muss identisch sein.
Der Pfad zu den ursprünglichen Skripten in
/usr/local/bin.Die Priorität.
foo-2erhält eine niedrigere Priorität alsfoo-3. Die Prioritäten sollten nach Möglichkeit deutlich unterschiedliche Zahlen erhalten. Beispiel: Priorität 200 fürfoo-2und 300 fürfoo-3.Prüfen Sie den Master-Link:
>sudoupdate-alternatives --display foofoo - auto mode link best version is /usr/local/bin/foo-3 link currently points to /usr/local/bin/foo-3 link foo is /usr/local/bin/foo /usr/local/bin/foo-2 - priority 200 /usr/local/bin/foo-3 - priority 300
Sobald Sie die angegebenen Schritte erledigt haben, können Sie den Master-Link /usr/local/bin/foo verwenden.
Bei Bedarf können Sie weitere Alternativen installieren. Mit dem folgenden Befehl entfernen Sie eine Alternative:
>sudoupdate-alternatives --remove foo /usr/local/bin/foo-2
Sobald dieses Skript entfernt wurde, sieht das Alternativen-System für die foo-Gruppe wie folgt aus:
>sudoupdate-alternatives --display foofoo - auto mode link best version is /usr/local/bin/foo-3 link currently points to /usr/local/bin/foo-3 link foo is /usr/local/bin/foo /usr/local/bin/foo-3 - priority 300
22.7 Definieren von abhängigen Alternativen #
Wenn Sie mit Alternativen arbeiten, reicht das Skript allein nicht aus. Die meisten Befehle sind nicht eigenständig, sondern umfassen zusätzliche Dateien wie Erweiterungen, Konfigurationen oder man-Seiten. Mit Slave-Alternativen erstellen Sie Alternativen, die von einem Master-Link abhängig sind.
Angenommen, das Beispiel in Abschnitt 22.6, „Installieren von benutzerdefinierten Alternativen“ soll mit man-Seiten und Konfigurationsdateien erweitert werden:
Zwei Manpages –
foo-2.1.gzundfoo-3.1.gz–, die im Verzeichnis/usr/local/man/man1gespeichert sind.Zwei Konfigurationsdateien –
foo-2.confundfoo-3.conf–, die in/etcgespeichert sind.
So nehmen Sie die zusätzlichen Dateien in Ihre Alternativen auf:
Kopieren Sie die Konfigurationsdateien in
/etc:>sudocp foo-{2,3}.conf /etcKopieren Sie die man-Seiten in das Verzeichnis
/usr/local/man/man1:>sudocp foo-{2,3}.1.gz /usr/local/man/man1/Tragen Sie die Slave-Links mit der Option
--slavein die Hauptskripte ein:>sudoupdate-alternatives --install \ /usr/local/bin/foo foo /usr/local/bin/foo-2 200 \ --slave /usr/local/man/man1/foo.1.gz \ foo.1.gz \ /usr/local/man/man1/foo-2.1.gz \ --slave /etc/foo.conf \ foo.conf \ /etc/foo-2.conf>sudoupdate-alternatives --install \ /usr/local/bin/foo foo /usr/local/bin/foo-3 300 \ --slave /usr/local/man/man1/foo.1.gz \ foo.1.gz \ /usr/local/man/man1/foo-3.1.gz \ --slave /etc/foo.conf \ foo.conf \ /etc/foo-3.confPrüfen Sie den Master-Link:
foo - auto mode link best version is /usr/local/bin/foo-3 link currently points to /usr/local/bin/foo-3 link foo is /usr/local/bin/foo slave foo.1.gz is /usr/local/man/man1/foo.1.gz slave foo.conf is /etc/foo.conf /usr/local/bin/foo-2 - priority 200 slave foo.1.gz: /usr/local/man/man1/foo-2.1.gz slave foo.conf: /etc/foo-2.conf /usr/local/bin/foo-3 - priority 300 slave foo.1.gz: /usr/local/man/man1/foo-3.1.gz slave foo.conf: /etc/foo-3.conf
Wenn Sie die Links mit update-alternatives --config foo in foo-2ändern, werden auch alle Slave-Links geändert.