目次にジャンプページナビゲーションにジャンプ: 前のページ[アクセスキーp]/次のページ[アクセスキーn]
documentation.suse.com / SUSE Linux Enterprise Desktopドキュメント / 管理ガイド / システム / update-alternatives: 複数のバージョンのコマンドとファイルの管理
適用項目 SUSE Linux Enterprise Desktop 15 SP6

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.1: javaコマンドのalternativesシステム
/usr/bin/java 1
 -> /etc/alternatives/java 2
     -> /usr/lib64/jvm/jre-10-openjdk/bin/java 3

1

汎用名。

2

alternativesディレクトリ内のシンボリックリンク。

3

alternativesの1つ。

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はありません

python3用のカスタムalternativesをインストールしないでください。/usr/bin/python3には、アップデートのalternativesはなく、常に特定のテスト済みバージョンを指します。異なるバージョン(python 3.11など)を指すpython3のカスタムalternativesを作成すると、依存するシステムツールが壊れます。

この例には、以下の前提があります。

  • 同様の機能を持つ2つのスクリプト(foo-2foo-3)があります。

  • これらのスクリプトは、/usr/bin内のシステムツールとの競合を避けるために、/usr/local/binディレクトリに保存されています。

  • foo-2またはfoo-3のいずれかを指し示すマスタリンクfooがあります。

使用しているシステムにalternativesを用意するには、次の手順を実行します。

  1. スクリプトを/usr/local/binディレクトリにコピーします。

  2. スクリプトを実行可能にします。

    > sudo chmod +x /usr/local/bin/foo-{2,3}
  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の後のオプションには、次の意味があります。

    1

    汎用名。混乱を避けるため、これは通常、バージョン番号のないスクリプト名です。

    2

    マスタリンクの名前。同じである必要があります。

    3

    /usr/local/binにある元のスクリプトへのパス。

    4

    優先度。foo-2に、foo-3よりも低い優先度を与えます。意味のある数値の増加を使用して、優先度を分けることをお勧めします。たとえば、foo-2の優先度を200、foo-3の優先度を300にします。

  4. マスタリンクを確認します。

    > 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に追加ファイルを追加します。

  1. 環境設定ファイルを/etcにコピーします。

    > sudo cp foo-{2,3}.conf /etc
  2. マニュアルページを/usr/local/man/man1ディレクトリにコピーします。

    > sudo cp foo-{2,3}.1.gz /usr/local/man/man1/
  3. --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
  4. マスタリンクを確認します。

    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に変更すると、スレーブリンクもすべて変更されます。