28.2. alternatives の仕組み

alternatives は、既存のファイルに新しい名前をつけて利用できるようにするシステムです。

いくつかのファイルを同じ名前の元に登録すれば、切り替えられるようにすることができます。

28.2.1. 用語とディレクトリ

alternative には仕組みを理解する上で必要となる 5つの用語と 2つのディレクトリ があります。

  • 用語

    • 総称名 generic name

    • リンク名 link name

    • 選択候補 alternative

    • 優先度 priotity

    • モード mode

  • ディレクトリ

    • alternatives directory

    • administrative directory

総称名 generic name は、リンク名、選択候補、優先度、モードなどを一つのグループとして管理するための グループの名前 です。

リンク名 link name は、alternatives によって作られる、新しい名前 です。この名前で、シンボリックリンクファイル[6]が作られ、一般的なコマンド、ファイルと同じように利用されることになります。

選択候補 alternative は、既存のファイル、実際のファイルです。「本体」といった感じのものになります。リンク名 で作られるファイルは最終的にこのファイルを参照することになります。

選択候補ごとに、優先度 priority があります。数字で設定され、選択候補が複数ある場合には、数字の大きなものほど優先されます。

優先度に従うかどうかを決める モード mode があります。モードには、パッケージの追加や削除などで、選択候補が追加されたり削除された時に、優先度が高いものに自動的に切り替わる auto(matic mode) と、すでに設定したもので固定しておく manual( mode) というものがあります。

標準では、自動的に切り替える auto になっています。

alternatives directory は、どの候補を選択するかといった切り替えに利用するディレクトリです。Vine Linux では /etc/alternatives が利用されます。

administrative directory には、総称名ごとに、モード、リンク名、選択候補、優先度の情報が保存されます。Vine Linux では /var/lib/rpm/alternatives が利用されます。

ここにあるファイルの中身については「administrative directory におかれるファイル」で説明します。

update-alternatives コマンドで切り替える時には 総称名 と 選択候補 を利用します。

リンク名以外は alternatives という仕組みの中で利用されるものです。

ノート

一般的にシステムごとの設定ファイルなどは /etc/ というディレクトリ以下におかれて管理されるので、alternatives は /usr/bin/ にあるコマンドを直接変更するのではなく、/etc/alternatives 以下を経由して変更を行うようになっています。

また、優先度などの情報は、パッケージのインストールやアンインストールなどで、選択候補が増えたり減ったり動的に変化するために、/var/lib/rpm/alternatives 以下におかれます。

/etc や /var などのディレクトリの配置や意味などについては、FHS(Filesystem Hierarchy Standard)という規格があります。

28.2.2. ファイルのつながり

図28.1 alternatives の概念図

alternatives の概念図

リンク名 があります。このファイルは、alternatives directory の中にある、総称名と同じ名前のファイル を参照しています。

総称名 のもとに、2つの選択候補 ファイルA と ファイルB が登録されています。

優先度は、A が 20、 B が 10 となっています。

総称名と同じ名前のファイル は、優先度の高い ファイルA を参照します。

リンク名総称名と同じ名前のファイル を経由して 選択候補ファイルA を参照しています。

28.2.2.1. gcc の場合

GCC(GNU Compiler Collection) の、/usr/bin/gcc というコマンドを見てみましょう。

Vine Linux 4.1 では、表28.1「GCC のパッケージ」のように 3つrpmパッケージが用意されています。[7]

表28.1 GCC のパッケージ

パッケージ名 GCCのバージョン gccコマンド 優先度(priority)
gcc 3.3.6 /usr/bin/gcc-3.3.6 30
gcc4 4.0.2 /usr/bin/gcc-4.0.2 20
gcc295 2.95.3 /usr/bin/gcc-2.95.3 15

gcc というコマンドは一般的には /usr/bin/gcc ですが、それぞれのrpmパッケージでは /usr/bin/gcc-3.3.6 , /usr/bin/gcc-4.0.2 , /usr/bin/gcc-2.95.3 というコマンド(ファイル名)になっています。

そして、alternatives を使って、この中のどれかを /usr/bin/gcc として使えるようにしています。

図28.2 gcc の場合

gcc の場合

/usr/bin/gcc があります。このファイルは、/etc/alternatives の中にある、総称名と同じ名前の gcc というファイル を参照しています。

$ file /usr/bin/gcc

/usr/bin/gcc: symbolic link to `/etc/alternatives/gcc'

総称名 gcc のもとに、3つの選択候補 /usr/bin/gcc-3.3.6 と /usr/bin/gcc-4.0.2 と /usr/bin/gcc-2.95.3 が登録されています。

優先度は、/usr/bin/gcc-3.3.6 が 30 , /usr/bin/gcc-4.0.2 が 20 , /usr/bin/gcc-2.95.3 が 15 となっています。

/etc/alternatives/gcc は、優先度の最も高い /usr/bin/gcc-3.3.6 を参照します。

$ file /etc/alternatives/gcc

/etc/alternatives/gcc: symbolic link to `/usr/bin/gcc-3.3.6'

/usr/bin/gcc/etc/alternatives/gcc を経由して 選択候補/usr/bin/gcc-3.3.6 を参照しています。

28.2.3. リンクグループ(マスターリンクとスレーブリンク)

alternatives には、プログラムが変更されたら同時にマニュアルページファイルも切り替える、といったように、複数のものを同時に切り替える仕組みがあります。

総称名1 を切り替えたら、総称名2 のほうも同時に切り替えるというように、複数の総称名をグループ化することで、選択候補を同時に切り替えられるようにすることができます。

基準となる総称名1 をマスターリンク(master link)と呼び、それと同時に変更される総称名2 をスレーブリンク(slave link)と呼びます。

マスターリンクとスレーブリンクを合わせて、リンクグループ(link group)と呼びます。

スレーブリンクは、マスターリンクに合わせて切り替わるものなので、モードと優先度を持ちません。総称名とリンク名と選択候補を持ちます。

スレーブリンクは、無くてもいいものなので、マスターリンクの選択候補1 にはスレーブリンクがあるけれど、選択候補2 にはスレーブリンクはない、といったようにもできます。全て対応させる必要はありません。

また、スレーブリンクを複数持つこともできます。

マスターリンクとスレーブリンクは、図28.3「alternatives の概念図(マスターリンクとスレーブリンク)」のような関係になります。

図28.3 alternatives の概念図(マスターリンクとスレーブリンク)

alternatives の概念図(マスターリンクとスレーブリンク)

総称名1 の選択候補 ファイルA と、総称名2 の選択候補 ファイルa が対応します。

また、総称名1 の選択候補 ファイルB と、総称名2 の選択候補 ファイルb が対応します。

リンク名1 に ファイルA を選択した時には、リンク名2 が ファイルa になります。

28.2.4. administrative directory におかれるファイル

administrative directory ( /var/lib/rpm/alternatives/ ) に 総称名と同じ名前のファイルがあり、総称名ごとに、モード、リンク名、選択候補、優先度の情報が保存されます。

書式は次のようになります。

モード (auto か manual)
リンク名 (/usr/bin/hoge など)
区切りとなる空行
選択候補1
選択候補1の優先度
選択候補2
選択候補2の優先度

スレーブリンクもある場合には次のような書式になります。

モード
master link のリンク名
slave link1 の総称名
slave link1 のリンク名
slave link2 の総称名
slave link2 のリンク名
区切りとなる空行
master link の選択候補1
master link の選択候補1の優先度
master link の選択候補1のslave link1の選択候補
master link の選択候補1のslave link2の選択候補
master link の選択候補2
master link の選択候補2の優先度
master link の選択候補2のslave link1の選択候補
master link の選択候補2のslave link2の選択候補
区切りとなる空行

スレーブリンクのリンク名など、関連したファイルがどこにあるのかはこのファイルをみるとわかります。

28.2.4.1. /var/lib/rpm/alternatives/gcc の場合

/var/lib/rpm/alternatives/gcc は次のように書かれています。

auto                                  モード
/usr/bin/gcc                          master link のリンク名
c99                                   slave link1 の総称名
/usr/bin/c99                          slave link1 のリンク名
cc                                    slave link2 の総称名
/usr/bin/cc                           slave link2 のリンク名
i386-vine-linux-gcc                   slave link3 の総称名
/usr/bin/i386-vine-linux-gcc          slave link3 のリンク名
c89                                   slave link4 の総称名
/usr/bin/c89                          slave link4 のリンク名
                                      (区切りとなる空行)
/usr/bin/gcc-3.3.6                    選択候補 1
30                                    選択候補 1の優先度
/usr/bin/c99-3.3.6                    選択候補 1のスレーブリンク 1の選択候補
/usr/bin/gcc-3.3.6                    選択候補 1のスレーブリンク 2の選択候補
/usr/bin/i386-vine-linux-gcc-3.3.6    選択候補 1のスレーブリンク 3の選択候補
/usr/bin/c89-3.3.6                    選択候補 1のスレーブリンク 4の選択候補
/usr/bin/gcc-2.95.3                   選択候補 2
15                                    選択候補 2の優先度
                                      選択候補 2のスレーブリンク 1の選択候補 (該当無し)
/usr/bin/gcc-2.95.3                   選択候補 2のスレーブリンク 2の選択候補
                                      選択候補 2のスレーブリンク 3の選択候補 (該当無し)
                                      選択候補 2のスレーブリンク 4の選択候補 (該当無し)
/usr/bin/gcc-4.0.2                    選択候補 3
20                                    選択候補 3の優先度
/usr/bin/c99-4.0.2                    選択候補 3のスレーブリンク 1の選択候補
/usr/bin/gcc-4.0.2                    選択候補 3のスレーブリンク 2の選択候補
/usr/bin/i386-vine-linux-gcc-4.0.2    選択候補 3のスレーブリンク 3の選択候補
/usr/bin/c89-4.0.2                    選択候補 3のスレーブリンク 4の選択候補
                                      (区切りとなる空行)


[6] symbolic link file:他のファイル、ディレクトリを参照する形式のファイル

[7] C++ をサポートするための gcc-c++ など関連したパッケージも GCC のバージョンごとに用意されています。