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/alternatives
enthä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/alternatives
mit 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-alternatives
bearbeiten.
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 den Befehl 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
>
sudo
update-alternatives --get-selections
asadmin 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:
>
sudo
update-alternatives --display java
java - 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 Befehle 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 -version
openjdk 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:
>
sudo
update-alternatives --config java
root'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 -version
java 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:
>
sudo
update-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-2
undfoo-3
– mit ähnlicher Funktionalität.Die Skripte sind im Verzeichnis
/usr/local/bin
gespeichert, sodass keine Konflikte mit den Systemwerkzeugen unter/usr/bin
entstehen.Der Master-Link
foo
verweist entweder auffoo-2
oder 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:
>
sudo
chmod +x /usr/local/bin/foo-{2,3}
Führen Sie
update-alternatives
für beide Skripte aus:>
sudo
update-alternatives --install \ /usr/local/bin/foo 1\ foo 2\ /usr/local/bin/foo-2 3\ 200 4>
sudo
update-alternatives --install \ /usr/local/bin/foo 1\ foo 2\ /usr/local/bin/foo-3 3\ 300 4Die Optionen nach
--install
bedeuten: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-2
erhält eine niedrigere Priorität alsfoo-3
. Die Prioritäten sollten nach Möglichkeit deutlich unterschiedliche Zahlen erhalten. Beispiel: Priorität 200 fürfoo-2
und 300 fürfoo-3
.Prüfen Sie den Master-Link:
>
sudo
update-alternatives --display foo
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 /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:
>
sudo
update-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:
>
sudo
update-alternatives --display foo
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 /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.gz
undfoo-3.1.gz
–, die im Verzeichnis/usr/local/man/man1
gespeichert sind.Zwei Konfigurationsdateien –
foo-2.conf
undfoo-3.conf
–, die in/etc
gespeichert sind.
So nehmen Sie die zusätzlichen Dateien in Ihre Alternativen auf:
Kopieren Sie die Konfigurationsdateien in
/etc
:>
sudo
cp foo-{2,3}.conf /etc
Kopieren Sie die man-Seiten in das Verzeichnis
/usr/local/man/man1
:>
sudo
cp foo-{2,3}.1.gz /usr/local/man/man1/
Tragen Sie die Slave-Links mit der Option
--slave
in die Hauptskripte ein:>
sudo
update-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
>
sudo
update-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.conf
Prü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.