22 update-alternatives: 複数のバージョンのコマンドとファイルの管理 #
システムに同じツールの複数のバージョンがインストールされていることがよくあります。管理者に選択肢を提供し、異なる複数のバージョンを並行してインストールして使用できるようにするために、alternativesシステムでは、このような複数のバージョンを一貫性を持って管理することができます。
22.1 概要 #
SUSE Linux Enterprise Serverでは、いくつかのプログラムが同じまたは類似のタスクを実行します。たとえば、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の概要およびその値を取得するには、次を使用します
>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 特定のalternativesに関する詳細の表示 #
    alternativesを確認する最も簡単な方法は、コマンドのシンボリックリンクをたどることです。たとえば、javaコマンドが参照しているリンクを見つけるには、次のコマンドを使用します。
   
>readlink --canonicalize /usr/bin/java/usr/lib64/jvm/jre-10-openjdk/bin/java
    同じパスが表示されている場合(この例では、/usr/bin/java)、このコマンドに対して使用可能なalternativesはありません。
   
    すべてのalternatives(スレーブを含む)を表示するには、--displayオプションを使用します。
   
>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 alternativesのデフォルトバージョンの設定 #
    デフォルトでは、/usr/binのコマンドは、優先順位が最も高いalternativesディレクトリを参照します。たとえば、デフォルトでは、コマンドjavaに対して次のバージョン番号が表示されます。
   
>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)
    デフォルトのjavaコマンドを変更して前のバージョンを参照するには、次のコマンドを実行します。
   
>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:
    システムおよびインストールされているバージョンに応じて、正確なJavaバージョン番号は変わります。1を選択すると、javaに対して次のバージョン番号が表示されます。
   
>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)
また、次の点に注意してください。
- 手動モードを使用して、別の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を実行します。- >- 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 4- --installの後のオプションには、次の意味があります。
- マスタリンクを確認します。 - >- sudo- update-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
    上記の手順を完了したら、マスタリンク/usr/local/bin/fooを使用できます。
   
必要に応じて、追加のalternativesをインストールすることもできます。alternativeを削除するには、次のコマンドを使用します。
>sudoupdate-alternatives --remove foo /usr/local/bin/foo-2
このスクリプトが削除されると、fooグループのalternativesシステムは次のようになります。
>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 依存する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に変更すると、スレーブリンクもすべて変更されます。