22 update-alternatives
: 複数のバージョンのコマンドとファイルの管理 #
システムに同じツールの複数のバージョンがインストールされていることがよくあります。管理者に選択肢を提供し、異なる複数のバージョンを並行してインストールして使用できるようにするために、alternativesシステムでは、このような複数のバージョンを一貫性を持って管理することができます。
22.1 概要 #
SUSE Linux Enterprise Desktopでは、いくつかのプログラムが同じまたは類似のタスクを実行します。たとえば、Java 1.7とJava 1.8が両方ともシステムにインストールされている場合、alternativesシステムスクリプト(update-alternatives
)がRPMパッケージ内から呼び出されます。デフォルトでは、alternativesシステムはバージョン1.8を指し示します。上位バージョンの優先度が高くなります。ただし、管理者はデフォルトを変更することができ、汎用名としてバージョン1.7を指すことができます。
この章では、以下の用語を使用します。
- 管理ディレクトリ
デフォルトの
/var/lib/rpm/alternatives
ディレクトリには、alternativesの現在の状態に関する情報が含まれています。- 代わりとなる製品
ファイルシステム内の特定のファイルの名前。alternativesシステムを使用して汎用名でアクセス可能にすることができます。
- alternativesディレクトリ
シンボリックリンクを含むデフォルトの
/etc/alternatives
ディレクトリ。- 汎用名
alternativesシステムを使用して使用可能な複数のファイルのうちの1つを指し示す名前(たとえば、
/usr/bin/edit
)。- リンクグループ
グループとして更新できる関連するシンボリックリンクのセット。
- マスタリンク
グループ内の他のリンクの設定方法を決定するリンクグループ内のリンク。
- スレーブリンク
マスタリンクによって制御されるリンクグループ内のリンク。
- シンボリックリンク(Symlink)
同じファイルシステム内の別のファイルへの参照となるファイル。alternativesシステムは、alternativesディレクトリ内のシンボリックリンクを使用して、ファイルのバージョンを切り替えます。
alternativesディレクトリ内のシンボリックリンクは、
update-alternatives
コマンドによって管理者が変更できます。
alternativesシステムは、シンボリックリンクに関する情報を作成、削除、維持、および表示するためのupdate-alternatives
コマンドを提供します。これらのシンボリックリンクは、通常、コマンドを指しますが、JARアーカイブ、マニュアルページ、およびその他のファイルを指すこともできます。この章の例では、コマンドとマニュアルページを使用しますが、他のファイルタイプにも適用できます。
alternativesシステムはalternativesディレクトリを使用して、使用可能なalternativesへのリンクを収集します。alternativeを含む新しいパッケージがインストールされると、新しいalternativeがシステムに追加されます。新しいパッケージのalternativeがデフォルトとして選択されるかどうかは、その優先順位と設定されたモードに依存します。上位バージョンのパッケージの優先度が高くなります。alternativesシステムは、次の2つのモードで動作することができます。
自動モード. このモードでは、alternativesシステムによって、グループ内のリンクが、グループに適した最優先のalternativesを確実に指し示すようになります。
手動モード. このモードでは、alternativesシステムによって、システム管理者の設定は変更されません。
たとえば、java
コマンドのalternativesシステムでのリンク階層は次のようになっています。
22.2 使用例 #
デフォルトでは、update-alternatives
スクリプトはRPMパッケージ内から呼び出されます。あるパッケージがインストールまたは削除されると、このスクリプトはそのすべてのシンボリックリンクに対処します。ただし、以下の操作についてはコマンドラインから手動で実行することができます。
汎用名に対する現在のalternativesを表示する。
alternativeのデフォルトを変更する。
alternativeの関連ファイルのセットを作成する。
22.3 alternativesの概要の取得 #
すべての設定済みのalternativesの名前を取得するには、次を使用します。
>
ls /var/lib/alternatives
すべての設定済みのalternativesの概要およびその値を取得するには、次を使用します
>
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 特定のalternativesに関する詳細の表示 #
alternativesを確認する最も簡単な方法は、コマンドのシンボリックリンクをたどることです。たとえば、java
コマンドが参照しているリンクを見つけるには、次のコマンドを使用します。
>
readlink --canonicalize /usr/bin/java
/usr/lib64/jvm/jre-10-openjdk/bin/java
同じパスが表示されている場合(この例では、/usr/bin/java
)、このコマンドに対して使用可能なalternativesはありません。
すべてのalternatives(スレーブを含む)を表示するには、--display
オプションを使用します。
>
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 alternativesのデフォルトバージョンの設定 #
デフォルトでは、/usr/bin
のコマンドは、優先順位が最も高いalternativesディレクトリを参照します。たとえば、デフォルトでは、コマンドjava
に対して次のバージョン番号が表示されます。
>
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)
デフォルトのjava
コマンドを変更して前のバージョンを参照するには、次のコマンドを実行します。
>
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:
システムおよびインストールされているバージョンに応じて、正確なJavaバージョン番号は変わります。1
を選択すると、java
に対して次のバージョン番号が表示されます。
>
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)
また、次の点に注意してください。
手動モードを使用して、別のJavaバージョンをインストールする場合、alternativesシステムはリンクに触れず、汎用名も変更しません。
自動モードを使用して、別のJavaバージョンをインストールする場合、alternativesシステムはJavaマスタリンクとすべてのスレーブリンクを変更します(22.4項 「特定のalternativesに関する詳細の表示」を参照)。マスタ-スレーブの関係を確認するには、次のコマンドを使用します。
>
sudo
update-alternatives --display java
22.6 カスタムalternativesのインストール #
このセクションでは、システムでカスタムalternativesを設定する方法について説明します。
python3用のカスタムalternativesをインストールしないでください。/usr/bin/python3
には、アップデートのalternativesはなく、常に特定のテスト済みバージョンを指します。異なるバージョン(python 3.11など)を指すpython3のカスタムalternativesを作成すると、依存するシステムツールが壊れます。
この例には、以下の前提があります。
同様の機能を持つ2つのスクリプト(
foo-2
とfoo-3
)があります。これらのスクリプトは、
/usr/bin
内のシステムツールとの競合を避けるために、/usr/local/bin
ディレクトリに保存されています。foo-2
またはfoo-3
のいずれかを指し示すマスタリンクfoo
があります。
使用しているシステムにalternativesを用意するには、次の手順を実行します。
スクリプトを
/usr/local/bin
ディレクトリにコピーします。スクリプトを実行可能にします。
>
sudo
chmod +x /usr/local/bin/foo-{2,3}
両方のスクリプトに対して
update-alternatives
を実行します。>
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 4--install
の後のオプションには、次の意味があります。マスタリンクを確認します。
>
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
上記の手順を完了したら、マスタリンク/usr/local/bin/foo
を使用できます。
必要に応じて、追加のalternativesをインストールすることもできます。alternativeを削除するには、次のコマンドを使用します。
>
sudo
update-alternatives --remove foo /usr/local/bin/foo-2
このスクリプトが削除されると、fooグループのalternativesシステムは次のようになります。
>
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 依存するalternativesの定義 #
alternativesがあっても、スクリプト自体は十分なものではありません。ほとんどのコマンドは、スタンドアロンではありません。これらのコマンドには、拡張機能、設定、マニュアルページなどの追加ファイルが付属しています。マスタリンクに依存するalternativesを作成するには、スレーブalternativesを使用します。
22.6項 「カスタムalternativesのインストール」の例を拡張し、次のマニュアルページと環境設定ファイルを用意すると仮定します。
/usr/local/man/man1
ディレクトリに格納された2つのマニュアルページ(foo-2.1.gz
およびfoo-3.1.gz
)。/etc
に格納された2つの環境設定ファイル(foo-2.conf
およびfoo-3.conf
)。
以下の手順に従って、alternativesに追加ファイルを追加します。
環境設定ファイルを
/etc
にコピーします。>
sudo
cp foo-{2,3}.conf /etc
マニュアルページを
/usr/local/man/man1
ディレクトリにコピーします。>
sudo
cp foo-{2,3}.1.gz /usr/local/man/man1/
--slave
オプションを使用して、メインスクリプトにスレーブリンクを追加します。>
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
マスタリンクを確認します。
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
update-alternatives --config foo
を使用してリンクをfoo-2
に変更すると、スレーブリンクもすべて変更されます。