8 alternatives -選択せよ-

えとー      
___________________________________________________________________________________________________________________________

8.1 alternatives とは?

パ ッケ ー ジ 管 理 と い う と 依 存関係の管理についてのみがクローズアップされるが、 パッケージ 管理としては、 それだけでは不足する部分がある、 それを補うものの一つが alternativesで す 。

日本語訳すると「選択肢」 、 私の定義ですが、 「複数のパッケージを特定機能ごとに一つにまとめて扱い機 能 ベ ー ス の パ ッケ ー ジ の 管 理 を 提 供 す る も の 。 」 「パ ッケ ー ジ を 機 能 の 視 点 で 管 理 す る 。 」 「プ ロ グ ラ ム に OS の統一的な API を提供する。 」 の 3 点です。

機 能 と し て は 、 「類 似 の 機 能 を 持 つ プ ロ グ ラ ム の別名を提供する。 」 で、 symlink を使って実現しています 。 alternatives とは、 その symlink を管理するための機構と言えるでしょう。

な ぜ わ ざ わ ざ 別 名 が 必 要 ?

  1. プログラムからの使い勝手の向上万単位のパッケージの存在する Debian では同じような機能 を 持 つ 別 々の パ ッケ ー ジ が 複 数 存 在 す る こ と は 珍 し く あ り ま せ ん 。 伝 統 的 に Unix 系 OS ではパイプやリダイレクトなどやスクリプト、 プログラムなどから他のプログラムの機能を利 用 す る こ と に よ り コ ー ド 量 の 削 減 と 質 の 向 上 を 図 って い ま す 。 し か し 、 プ ロ グ ラ ム か ら 呼 び出す際に同じような機能をもつもの全てを把握し条件分岐などで呼んで行くのはコストから 言 って 現 実 的 で は あ り ま せ ん 。 そ の 解 決 策 と し て は プ ロ グ ラ ム へ の 統 一 的 な API を提供す る こ と が で き る よ う す る こ と で す 。 awk スクリプトやコンパイラなどを思い浮べるといいと 思 い ま す 。
  2. ユーザへの使い勝手の向上ユーザからしても同じ機能なのに別の別の名前であると不便な場 合もあります。 MUA や IRC クライアントからの Web Browser を呼び出す際を想像しても ら え ば 想 像 し 易 い と 思 い ま す 。
  3. menu との連携 Debian 独自なものとして menu がありますが、 これと alternatives を連携 させることによりメニューをいじらずに、 違うパッケージを提供することができます。

8.2 update-alternatives の使い方

see man(重要)

alternatives の制御には /usr/sbin/update-alternatives というコマンドを使います。

   書式一覧
   update-alternatives --install  リンク  一般名  パス  優先度  [--slave  スレーブリンク  スレーブ一般名  スレーブパス]
   update-alternatives --remove  一般名  パス
   update-alternatives --remove-all  ディレクトリ
   update-alternatives --all
   update-alternatives --auto  一般名
   update-alternatives --display  一般名
   update-alternatives --list  一般名
   update-alternatives --config  一般名
   update-alternatives --set  一般名  パス

8.3 用語の説明

8.3.1 マスター
8.3.2 スレーブ
8.3.3 automatic と manual

alternatives は優先度によって自動的に選択する automatic モードと優先度を無視しユーザが選択する manual モードがあります。 デフォルトは automatic モードで –config や –set 、 –all を使い変更し た場合に manual モードに以降します。 automatic モードに戻したければ –auto を使い ます。

8.4 ユーザとして使う場合

ユーザとして主に使用するコマンド

8.4.1 状態表示 (一般ユーザで可)
     update-alternatives --display  一般名
     update-alternatives --list  一般名
8.4.2 設定変更 (root のみ)
     update-alternatives --auto  一般名
     update-alternatives --config  一般名
     update-alternatives --set  一般名  パス

の 4 つです。

8.4.3 使用例と説明

     # update-alternatives --display editor             <-- editor  という一般名の alternatives  のステータスを表示
     editor - status is auto.                           <-- alternatives  の  モード
      link currently points to /usr/bin/vim             <--  現在のリンク先
     /bin/ed - priority -100                            <--  マスターリンク -  優先度 (/bin/ed)
      slave editor.1.gz: /usr/share/man/man1/ed.1.gz    <--  スレーブ一般名 :  スレーブリンク先 (/bin/ed)
     /bin/nano - priority 40                            <--  マスターリンク -  優先度 (/bin/nano)
      slave editor.1.gz: /usr/share/man/man1/nano.1.gz  <--  スレーブ一般名 :  スレーブリンク先 (/bin/nano)
     /usr/bin/vim - priority 120                        <--  マスターリンク -  優先度 (/usr/bin/vim)
      slave editor.1.gz: /usr/share/man/man1/vim.1.gz   <--  スレーブ一般名 :  スレーブリンク先 (/usr/bin/vim)
     Current ‘best’ version is /usr/bin/vim.            <--  優先度の一番高いもの

     # update-alternatives --list editor                <-- editor  という一般名の alternatives  のマスターリンク先を表示
     /bin/ed                                            <--  マスターリンク先
     /bin/nano                                          <--  マスターリンク先
     /usr/bin/vim                                       <--  マスターリンク先

     # update-alternatives --auto editor                <--  一般名 editor  の alternatives  を優先度によって変更
     # update-alternatives --config editor              <--  一般名 editor  の alternatives  を選択肢から手動で変更

     There are 3 alternatives which provide ‘editor’.   <-- editor  という一般名の選択肢が 3 つある

        Selection    Alternative
     -----------------------------------------------
          1        /bin/ed                              <-- alternatives
          2        /bin/nano                            <-- alternatives
    *+    3        /usr/bin/vim                         <-- alternatives  現在選択されている

     Press enter to keep the default[*], or type selection number:  <--  ここで番号を選択する
     Using ‘/usr/bin/vim’ to provide ‘editor’.          <-- editor  を /usr/bin/vim  で提供する

     # update-alternatives --set editor /usr/bin/vim    <--  一般名 editor  の alternatives  を指定したリンクに変更する
     Using ‘/usr/bin/vim’ to provide ‘editor’.          <-- editor  を /usr/bin/vim  で提供する

8.5 パッケージメンテナとして使う場合

パッケージメンテナな人が主に使うコマンドパッケージインストール時に使用 (主に postinst)

     update-alternatives --install  リンク  一般名  パス  優先度  [--slave  スレーブリンク  スレーブ一般名  スレーブパス]

パッケージ削除時に使用 (主に prerm)

     update-alternatives --remove  一般名  パス
8.5.1 使用例
     update-alternatives --install  コマンド

     update-alternatives --install  リンク  一般名  パス  優先度  [--slave  スレーブリンク  スレーブ一般名  スレーブパス]

この書式ですが、 slave は省略可能で、 使用する場合には複数のスレーブを指定することもでき ます。

vim の postinst
リンク元のファイルがインストールされてからリンクを貼るので postinst に書く


     case "$1" in
       abort-upgrade)
         for i in vi view ex editor ; do
           update-alternatives \
             --install /usr/bin/$i $i /usr/bin/vim 120 \
             --slave /usr/share/man/man1/$i.1.gz $i.1.gz /usr/share/man/man1/vim.1.gz

         done
         ;;
       configure)
         for i in vi view ex editor ; do
           update-alternatives \
             --install /usr/bin/$i $i /usr/bin/vim 120 \
             --slave /usr/share/man/man1/$i.1.gz $i.1.gz /usr/share/man/man1/vim.1.gz

         done
         if [ -L /usr/doc/vim ] ; then
           rm /usr/doc/vim
         fi
         ;;
     esac

vim の prerm
リンク元のファイルがなくなる前に削除するので prerm に書く


     case "$1" in
       remove)
         for i in vi view ex editor ; do
           update-alternatives --remove $i /usr/bin/vim
         done
         ;;
     esac

8.6 マニアックなコマンド

update-alternatives –all
全ての選択肢に –config を使い設定を行なう

update-alternatives –remove-all
ディレクトリにある全ての選択肢を削除する(危険です)

8.7 一般的なオプション

     --verbose  冗長メッセージ
     --quiet  メッセージを抑制
     --test  テスト (未実装)
     --help  ヘルプ

8.8 マニアックなオプション

–altdir
リンクを置くディレクトリ
デフォルトは /etc/alternatives/

–admindir
設定ファイルを置くディレクトリ
デフォルトは /var/lib/dpkg/alternatives/

8.8.1 マニアックなオプションの使用例

/usr/local/以下にソースからインストールしたものや alternatives を提供していないパッケー ジについて alternatives で管理したい場合などに使う特権ユーザでなくても使えるのも 特徴

使用例: /home/foo/eclipse 以下にある /home/foo/eclipse/eclipse を alternatives で管理した い。

       $ mkdir /home/foo/altdir/
       $ mkdir /home/foo/admindir/
       $ mkdir /home/foo/bin/
       $  /usr/sbin/update-alternatives --altdir /home/foo/altdir/ --admindir /home/foo/admindir/ \
              --install /home/foo/bin/eclipse eclipse /home/foo/eclipse/eclipse 100

で、 .bashrc などに /home/foo/bin/ を追加 IM とか、 MUA の管理にも向いているのではないだろ うか。

8.9 update-alternatives ってどうなってるの?

8.9.1 構造

/usr/sbin/update-alternatives
alternatives の制御コマンド
perl で実装されており dpkg パッケージに含まれています。

/var/lib/dpkg/alternatives
alternatives 設定ファイルディレクトリ
設定ファイル例

      $ cat /var/lib/dpkg/alternatives/editor
      alternatives 設定ファイルディレクトリ
      /usr/bin/editor                         <--  マスターリンク先
      editor.1.gz                             <--  スレーブ一般名
      /usr/share/man/man1/editor.1.gz         <--  スレーブリンク先

      /bin/ed                                 <--  マスターリンク元 (/bin/ed)
      -100                                    <--  優先度 (/bin/ed)
      /usr/share/man/man1/ed.1.gz             <--  スレーブリンク元 (/bin/ed)
      /bin/nano                               <--  マスターリンク元 (/bin/nano)
      40                                      <--  優先度 (/bin/nano)
      /usr/share/man/man1/nano.1.gz           <--  スレーブリンク元 (/bin/nano)
      /usr/bin/vim                            <--  マスターリンク元 (/usr/bin/vim)
      120                                     <--  優先度 (/usr/bin/vim)
      /usr/share/man/man1/vim.1.gz            <--  スレーブリンク元 (/usr/bin/vim)

/etc/alternatives/
alternatives のリンクのあるディレクトリです。
リンク例

      $ ls -l /etc/alternatives/editor
      lrwxrwxrwx  1 root root 12 2005-06-01 02:43 /etc/alternatives/editor -> /usr/bin/vi

   /usr/share/man/man8/update-alternatives.8.gz
   /usr/share/man/de/man8/update-alternatives.8.gz
   /usr/share/man/es/man8/update-alternatives.8.gz
   /usr/share/man/fr/man8/update-alternatives.8.gz
   /usr/share/man/ja/man8/update-alternatives.8.gz
   /usr/share/man/pt_BR/man8/update-alternatives.8.gz

alternatives マニュアルです。

8.9.2 動作

update-alternatives –auto

  1. 一般名を取得
  2. /var/lib/dpkg/alternatives/一般名のステータス情報が manual の場合は auto に変更
  3. /etc/alternatives/一般名のリンク先を /var/lib/dpkg/alternatives/一般名の優先度の情報 を比較し最大のものへのリンクへと変更

update-alternatives –config 及び update-alternatives –set コマンド

  1. 一般名とリンク先のパスを取得
  2. /var/lib/dpkg/alternatives/一般名のステータス情報が auto の場合は manual に変更
  3. /etc/alternatives/一般名のリンク先を指定されたリンク先のパスへと変更

update-alternatives –install コマンド

  1. 存在しない場合は指定されたパスのリンクを /etc/alternatives/一般名へと貼る
  2. 存在しない場合は /var/lib/dpkg/alternatives/一般名ファイルを指定された情報に基ずい て生成
  3. /etc/alternatives/一般名のリンク先を /var/lib/dpkg/alternatives/一般名の優先度の情報 を比較し最大のものへのリンクへと変更

update-alternatives –remove コマンド

  1. /var/lib/dpkg/alternatives/一般名から指定されたパスの情報を削除
  2. /var/lib/dpkg/alternatives/一 般 名 で alternatives が 提 供 さ れない場合は/var/lib/dpkg/alternatives/一般名及び /etc/alternatives/一般名リンク先を 削除
  3. /var/lib/dpkg/alternatives/一般名 で まだ alternatives が提供されている場合は /etc/alternatives/一般名のリンク先を /var/lib/dpkg/alternatives/一般名の優先度の情報 を比較し最大のものへのリンクへと変更

8.10 update-alternatives の改善案

update-alternatives 関連の改善案を自分なりに考えてみた。

  1. パッケージのファイル情報への反映

    現在の alternatives はパッケージをインストールされるまではそのパッケージがどんな alternatives を提案するのかという情報が解らない。 これだと、 インストールしてから、 普 段使用していた alternatives を使おうとしたら期待してたのと別のものが起動してしまい戸 惑うことになるし、 無駄なハマりの原因となるし、 もし、 そのような情報を集積できれば、 機能からパッケージをより簡単に検索することができるようになる。

  2. より柔軟に

    現在の alternatives では、 man を slave にした場合などに英語のみしか表示できなくなって しまう、 多言語化が進みつつある昨今これだけでは不足ということになってしまっているの で、 より柔軟な設定を行なえるのが望ましい。 ファイルだけではなくコマンドを登録できる ようにするなど。

  3. menu 編集インターフェースとの連携

    独自に作成した alternatives などを menu に簡単に登録できるようにするなどの、 応用的な 使 い 方 を 簡 便 に す る イ ン タ ー フ ェー ス の 拡 充

8.11 dsys について

8.11.1 目的

dpkg に含まれるパッケージ依存関係管理を行なう /usr/bin/dpkg 以外の/usr/sbin/update-alternatives, /usr/sbin/dpkg-divert, /usr/sbin/dpkg-statoverride の 3 つのコマンドに対応した GUI フロントエンド を提供することを目指している。

8.11.2 歴史

一番初期は update-alternatives のみに対応したもので、 ruby 1.6 と ruby-gtk で書いていたが、 やっぱ gtk2 だろう!ということで、 ruby-gtk2 に手を出してのんびりしてるうちに galternatives など競合で出 てきてしまった。 思い出したら実装したりしているがコーディング能力の低さのために遅々として改善さ れていない。

8.11.3 機能

/usr/sbin/update-alternatives
一覧の表示、 個々のステータスの表示、 変更、 追加、 削除

/usr/sbin/dpkg-divert
一覧の表示

/usr/sbin/dpkg-statoverride
一覧の表示、 変更、 追加、 削除

8.11.4 TODO

まずはツールチップを適切に実装すること綺麗なコードの書き方や、 デザインがわからないのでど うにかするせめて man くらい、 、 alternatives と statoverride のインターフェースを意識 的に替えていたがそろそろ統一 treeview で右クリックできるようするショートカットの 実装

8.11.5 将来

設定ファイルを作るかもアイコン欲しいよね

協力者の方募集中、 、

東 京 エ リ ア Debian 勉強会 2005 夏_________________________________________________________

PIC