えとー
___________________________________________________________________________________________________________________________
パ ッケ ー ジ 管 理 と い う と 依 存関係の管理についてのみがクローズアップされるが、 パッケージ 管理としては、 それだけでは不足する部分がある、 それを補うものの一つが alternativesで す 。
日本語訳すると「選択肢」 、 私の定義ですが、 「複数のパッケージを特定機能ごとに一つにまとめて扱い機 能 ベ ー ス の パ ッケ ー ジ の 管 理 を 提 供 す る も の 。 」 「パ ッケ ー ジ を 機 能 の 視 点 で 管 理 す る 。 」 「プ ロ グ ラ ム に OS の統一的な API を提供する。 」 の 3 点です。
機 能 と し て は 、 「類 似 の 機 能 を 持 つ プ ロ グ ラ ム の別名を提供する。 」 で、 symlink を使って実現しています 。 alternatives とは、 その symlink を管理するための機構と言えるでしょう。
な ぜ わ ざ わ ざ 別 名 が 必 要 ?
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 一般名 パス |
スレーブ alternatives のマスターに付随するファイル、 man など複数指定可能
alternatives は優先度によって自動的に選択する automatic モードと優先度を無視しユーザが選択する manual モードがあります。 デフォルトは automatic モードで –config や –set 、 –all を使い変更し た場合に manual モードに以降します。 automatic モードに戻したければ –auto を使い ます。
ユーザとして主に使用するコマンド
update-alternatives --display 一般名
update-alternatives --list 一般名 |
update-alternatives --auto 一般名
update-alternatives --config 一般名 update-alternatives --set 一般名 パス |
の 4 つです。
# 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 で提供する |
パッケージメンテナな人が主に使うコマンドパッケージインストール時に使用 (主に postinst)
パッケージ削除時に使用 (主に prerm)
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 |
update-alternatives –all
全ての選択肢に –config を使い設定を行なう
update-alternatives –remove-all
ディレクトリにある全ての選択肢を削除する(危険です)
--verbose 冗長メッセージ
--quiet メッセージを抑制 --test テスト (未実装) --help ヘルプ |
–altdir
リンクを置くディレクトリ
デフォルトは /etc/alternatives/
–admindir
設定ファイルを置くディレクトリ
デフォルトは /var/lib/dpkg/alternatives/
/usr/local/以下にソースからインストールしたものや alternatives を提供していないパッケー ジについて alternatives で管理したい場合などに使う特権ユーザでなくても使えるのも 特徴
使用例: /home/foo/eclipse 以下にある /home/foo/eclipse/eclipse を alternatives で管理した
い。
$ 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 の管理にも向いているのではないだろ うか。
/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 マニュアルです。
update-alternatives –auto
update-alternatives –config 及び update-alternatives –set コマンド
update-alternatives –install コマンド
update-alternatives –remove コマンド
update-alternatives 関連の改善案を自分なりに考えてみた。
現在の alternatives はパッケージをインストールされるまではそのパッケージがどんな alternatives を提案するのかという情報が解らない。 これだと、 インストールしてから、 普 段使用していた alternatives を使おうとしたら期待してたのと別のものが起動してしまい戸 惑うことになるし、 無駄なハマりの原因となるし、 もし、 そのような情報を集積できれば、 機能からパッケージをより簡単に検索することができるようになる。
現在の alternatives では、 man を slave にした場合などに英語のみしか表示できなくなって しまう、 多言語化が進みつつある昨今これだけでは不足ということになってしまっているの で、 より柔軟な設定を行なえるのが望ましい。 ファイルだけではなくコマンドを登録できる ようにするなど。
独自に作成した alternatives などを menu に簡単に登録できるようにするなどの、 応用的な 使 い 方 を 簡 便 に す る イ ン タ ー フ ェー ス の 拡 充
dpkg に含まれるパッケージ依存関係管理を行なう /usr/bin/dpkg 以外の/usr/sbin/update-alternatives, /usr/sbin/dpkg-divert, /usr/sbin/dpkg-statoverride の 3 つのコマンドに対応した GUI フロントエンド を提供することを目指している。
一番初期は update-alternatives のみに対応したもので、 ruby 1.6 と ruby-gtk で書いていたが、 やっぱ gtk2 だろう!ということで、 ruby-gtk2 に手を出してのんびりしてるうちに galternatives など競合で出 てきてしまった。 思い出したら実装したりしているがコーディング能力の低さのために遅々として改善さ れていない。
/usr/sbin/update-alternatives
一覧の表示、 個々のステータスの表示、 変更、 追加、 削除
/usr/sbin/dpkg-divert
一覧の表示
/usr/sbin/dpkg-statoverride
一覧の表示、 変更、 追加、 削除
まずはツールチップを適切に実装すること綺麗なコードの書き方や、 デザインがわからないのでど うにかするせめて man くらい、 、 alternatives と statoverride のインターフェースを意識 的に替えていたがそろそろ統一 treeview で右クリックできるようするショートカットの 実装
設定ファイルを作るかもアイコン欲しいよね
協力者の方募集中、 、
東 京 エ リ ア Debian 勉強会 2005 夏_________________________________________________________